GPSデータファイルの見分け方!
2019年8月24日
GPSデータファイルの見分け方
便利なサービスにするために、幾つかのGPSデータファイルをサポートする事は前回の投稿で説明しました。
今回はもう少し具体的な内容を見て行きます。
実際にサービスを作るには必要なデータを調査して
どのように実装していくかを決める必要があります。
今日の記事はその例を具体的に説明しています!
GPSデータファイルのヘッダー
幾つかアメリカでメジャーなサービスのGPSデータファイルのヘッダを調べてみました!
調べたのは、ガーミンのサービスの「Garmin Connect」、ランニングなどのデータをアップロードしてシェア出来る2つのサービス「Strava」と「Runkeeper」です。
同じような方針で、他のサービスが生成するGPXファイルも使える可能性が高くなります
まずは、この辺をベースに実装を進める事にします!
調べたのは、ガーミンのサービスの「Garmin Connect」、ランニングなどのデータをアップロードしてシェア出来る2つのサービス「Strava」と「Runkeeper」です。
同じような方針で、他のサービスが生成するGPXファイルも使える可能性が高くなります
まずは、この辺をベースに実装を進める事にします!
Garmin Connect GPX
ヘッダー部分のXMLのタグは「gpx」
心拍数の拡張の名前空間(ネームスペース)は「ns3」を使っています
<?xml version="1.0" encoding="UTF-8"?>
<gpx creator="Garmin Connect" version="1.1"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/11.xsd"
xmlns:ns3="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
<gpx creator="Garmin Connect" version="1.1"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/11.xsd"
xmlns:ns3="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
Strava GPX
ヘッダー部分のXMLのタグは「gpx」
心拍数の拡張の名前空間(ネームスペース)は「gpxtpx」を使っています
<?xml version="1.0" encoding="UTF-8"?>
<gpx creator="StravaGPX"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" version="1.1" xmlns="http://www.topografix.com/GPX/1/1"
xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
<gpx creator="StravaGPX"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" version="1.1" xmlns="http://www.topografix.com/GPX/1/1"
xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
Runkeeper GPX
ヘッダー部分のXMLのタグは「gpx」
心拍数の拡張の名前空間(ネームスペース)は「gpxtpx」を使っています
<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="Runkeeper - http://www.runkeeper.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.topografix.com/GPX/1/1"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1">
<gpx version="1.1" creator="Runkeeper - http://www.runkeeper.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.topografix.com/GPX/1/1"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1">
Garmin Connect TCX
ヘッダー部分のXMLのタグは「TrainingCenterDatabase」
心拍数の拡張の名前空間(ネームスペース)は「ns3」を使っています
<?xml version="1.0" encoding="UTF-8"?>
<TrainingCenterDatabase
xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd"
xmlns:ns5="http://www.garmin.com/xmlschemas/ActivityGoals/v1"
xmlns:ns3="http://www.garmin.com/xmlschemas/ActivityExtension/v2"
xmlns:ns2="http://www.garmin.com/xmlschemas/UserProfile/v2"
xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns4="http://www.garmin.com/xmlschemas/ProfileExtension/v1">
<TrainingCenterDatabase
xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd"
xmlns:ns5="http://www.garmin.com/xmlschemas/ActivityGoals/v1"
xmlns:ns3="http://www.garmin.com/xmlschemas/ActivityExtension/v2"
xmlns:ns2="http://www.garmin.com/xmlschemas/UserProfile/v2"
xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns4="http://www.garmin.com/xmlschemas/ProfileExtension/v1">
このデータからわかるのは、
- 汎用のGPXではヘッダ部分のタグは「gpx」
- ガーミンのTCXではヘッダー部分のタグは「TrainingCenterDatabase」
- GPXでは心拍数の拡張が「http://www.garmin.com/xmlschemas/TrackPointExtension/v1」
- TCXでは心拍数の拡張が「http://www.garmin.com/xmlschemas/ActivityExtension/v2」
という事が分かります。
この違いを利用して、ファイルのチェックと形式を識別することが可能になります。
Javascriptでの書き方
ファイルの識別部分は特に特別な記述をしなくても、
標準で準備されているJavascriptとjQueryの機能で実現できます。
下の例はGPX形式のファイルの識別と拡張のネームスペースを取得する例です。
// ファイルのテキストの中身
var xml = e.target.result;
// jQueryでXMLの構造で読み込む
var xmlDoc = $.parseXML(xml);
var $xml = $(xmlDoc);
// GPX形式の例
var gpx = xmlDoc.getElementsByTagName("gpx")[0].attributes;
current.gpx = true;
for (var i = 0 ; i < gpx.length ; i++) {
// 心拍数の拡張のURLのキーワードをチェック
if (gpx[i].nodeValue.indexOf("TrackPointExtension") !== (-1)) {
// nodeValue に拡張のURLが入ります
// nodeNameにネームスペースの情報が入ります
// ネームスペースを取り出すのに別のmethodを用意しています
current.ext_ns = current.get_ext_name_space(gpx[i].nodeName);
}
}
var xml = e.target.result;
// jQueryでXMLの構造で読み込む
var xmlDoc = $.parseXML(xml);
var $xml = $(xmlDoc);
// GPX形式の例
var gpx = xmlDoc.getElementsByTagName("gpx")[0].attributes;
current.gpx = true;
for (var i = 0 ; i < gpx.length ; i++) {
// 心拍数の拡張のURLのキーワードをチェック
if (gpx[i].nodeValue.indexOf("TrackPointExtension") !== (-1)) {
// nodeValue に拡張のURLが入ります
// nodeNameにネームスペースの情報が入ります
// ネームスペースを取り出すのに別のmethodを用意しています
current.ext_ns = current.get_ext_name_space(gpx[i].nodeName);
}
}
TCXの場合も同じようなやり方で可能です。
XMLファイルでない場合は、「$parseXML(xml)」で例外が発生するので識別可能です。
また、TCXでもGPXでない場合はエラーにすれば問題ありません。
XMLファイルでない場合は、「$parseXML(xml)」で例外が発生するので識別可能です。
また、TCXでもGPXでない場合はエラーにすれば問題ありません。
大切なのは利用者の手間が少ないサービス!
多くの人に利用してもらうためには、
利用者にとって使いやすく最小限の手間で利用できる事が大切です。
利用者にファイル形式などを指定してもらう事もできますが、
プログラムで自動判別可能なので、利用者には好きなファイルを選んでもらって
処理できない場合はエラーにするという方が便利です。
そこで、ファイルの中身を見て判別するという方法を取っています。
全部のGPXのファイルを調べるのは不可能ですが、現在までの調査では
この方法でかなりのサービスが生成するGPXのファイルのサポートが可能と考えています
ファイル読み込みの基本部分はカバー
これでGPSファイルの基本情報を読み込む準備はできました。
今後は、具体的なデータの読み込み方を解説していきます。
予定としては
- GPX/TPXの基本データの取り込み方
- GPX形式のファイルの距離情報の計算の仕方
です。時間の話はすでに解説していますので、基本的なデータの取り込みは
この2つで完了です。
いかがですか?実際に調べてみると意外にいろいろな事が学べます!
GPSのデータに興味のない方も、XMLのデータの扱い方の参考になると思いますので
是非読んでいただければと思います!
コメント
コメントを投稿