GPXファイルの詳細を見てみよう!
Silicon Valley Super Ware
2020年8月4日
GPXファイルの詳細を見てみよう!
さて、先週はGPXファイルを読み込むための概要をお伝えしてきました。読み込みの処理は、既存のライブラリやモジュールを駆使すれば意外に簡単にできそうという事は お分かりいただけたでしょうか?
今日は、実際にGPXファイルの中身についてもう少し詳しく見てみる事にします。
中身はテキストファイルです!
GPXファイルの中身は先週お伝えしたように、基本的にはテキストファイルです。 なので、中身はプログラムを書くのに利用しているようなテキストエディタで開くことができます。XMLのファイルは、HTMLのように、「タグ」をつけて、中身のデータの構造を決めています。
GPXなど特定のデータの構造は、「schema」と呼ばれていて、どんな構造でデータを 格納しているかを示しているファイルを冒頭で指定してます。
この定義を見れば、どんなデータがどこに入っているかわかります。
<?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」ファイルで、
TrackPointExtensionのネームスペースが「ns3」というのを読み取る事ができます。
このデータは全て、「gpx」のタグの中に全て埋め込まれているので、XMLに変換した後の「gpx」のタグの下を調べれば良いというのが分かります。
<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">
<trk>
<name>Dublin Running</name>
<type>running</type>
<trkseg>
<trkpt lat="37.71631565876305103302001953125" lon="-121.852012909948825836181640625">
<ele>164.399993896484375</ele>
<time>2020-08-05T03:48:58.000Z</time>
<extensions>
<ns3:TrackPointExtension>
<ns3:atemp>32.0</ns3:atemp>
<ns3:hr>101</ns3:hr>
<ns3:cad>81</ns3:cad>
</ns3:TrackPointExtension>
</extensions>
</trkpt>
実際のデータはその下の階層の、「trk」の下の「trkseg」、更に下の階層の「trkpt」というタグの下に収められています。
<name>Dublin Running</name>
<type>running</type>
<trkseg>
<trkpt lat="37.71631565876305103302001953125" lon="-121.852012909948825836181640625">
<ele>164.399993896484375</ele>
<time>2020-08-05T03:48:58.000Z</time>
<extensions>
<ns3:TrackPointExtension>
<ns3:atemp>32.0</ns3:atemp>
<ns3:hr>101</ns3:hr>
<ns3:cad>81</ns3:cad>
</ns3:TrackPointExtension>
</extensions>
</trkpt>
黄色の部分を見て頂ければお分かりかと思いますが、
- 緯度、経度の情報
- 標高
- 記録した日時
- 拡張データとして、この場合は、気温、心拍数、(1分辺りの)歩数
ファイルの中身は意外にシンプル
ご覧いただくとお分かりかと思いますが、シンプルなテキストファイルで構造自体も余り 複雑ではありません。実は、タグを頼りに「力技」で読み出してもそれほど難しい物ではありません。
実際は、標準で用意されている「FileReader」や「xml2js」のモジュールを使えば、 タグを基にJavaScriptで扱いやすい形のデータに変換してくれるのは先週取り上げた通りです。練習としては、「xml2js」などのモジュールを使わずに読み出す練習をすると XMLの構造が良くわかるようになります。
実際に、勉強が目的の場合、一度、自分で読み込むプログラムを書いてみる事をお勧めします。
GPXの作り方はいろいろ
実際にWebサービスでGPXを読む場合、GPXファイルを作るサービスはいろいろで 拡張データのタグは、必ずしも同じではありません。この辺りを自動検出して見やすいプログラムにするには、既存のモジュールを上手く 利用して「見通しの良いコード」にすると、後で管理するのが楽になります。
モジュールを使わずに自分でXMLの読み込みを作る場合は、そうした事を考慮して 関数なり、メソッドを用意するのが重要です。 モジュールの場合は既に、関数やメソッドとして準備されているので これを上手く利用して、ネームスペースを見つけて処理をするようにすると GPXの読み込みは見やすい形で実装できるというわけです。
今回のWebサービスでは、GPX以外にも、「TCX」という別の構造のXMLをサポートする 必要がありました。その場合は、GPX専用の読み取りでははなく、まずは、タグを基に XMLを扱いやすい「形」にしたうえでデータを取り出すようにすると 全体の処理が共通化できるのでプログラムの見通しが良くなります。
GPXとTCXでは同じ種類のデータに違ったタグがつけられています。 これを読み取りの過程で同じ構造のデータに変換して後の処理を行うと、 GPXでもTCXでも同じUIを利用できるようになります。
こうして、違う部分を上手く処理して、共通のデータ構造にすることで 実際のWebサービスの処理がシンプルになります。
さて、今週の課題ですが、実はGPXとTCXでは大きな違いがあります。
GPXの場合、位置情報は緯度と経度だけで、基本データには移動距離は含まれていません。 一方でTCXの場合は、位置情報に加えて、前のレコードからの移動距離も含まれています つまり、この両者で共通のデータ構成にするためには、GPXの場合位置情報の違いから 2地点間の距離を計算する必要があります。 次回はその辺を取り上げます。
シリコンバレースーパーウエアでは、単に機能を作るだけではなく、利用者を第一に考えた 使いやすく価値のあるサービス作りの手法を提供しています。 単純に、Webサービスを作るだけではなく、どのように作って、どのようにビジネスにつなげて 行くかが鍵です。また、フリーランスの方だけではなく、就職を考えている方にも 「実践力」を養うことで「即戦力」のエンジニアとしてのスキルを身に着ける事ができます!
興味のある方は今すぐお問合せください!
またよろしければ、ニュースレターの登録をお願いします!大体週一回お届けしています。ブログよりは一歩踏み込んだもっと濃い内容を発信しています。
コメント
コメントを投稿