GPSデータ記録形式 KMLとGPX

GPS logger m-241

左図は、HOLUX m-241はネックストリングで首から掛けて使うこともできるGPS Loggerだ。

route vby GPS logger data

GPS測位データ(GPS Logともいう)は、デバイス毎に異なるさまざまなファイル形式でファイルに記録されてきた(GPSデータ自体には差異はなく、その記録形式が沢山あるだけなのだが)。 中でも、今日、代表的なファイル形式として、Google Earth/Mapに直接読み込むことができるGoogle Earth(Keyhole) Markup LanguageであるKML形式(拡張子 .kml)と、GPs eXchange Formatで、地理情報システム(GIS)ソフトウエアで使われている代表的ファイル形式GPX形式(拡張子 .gpx)が重要でデファクトスタンダード化してきており、どちらもXML形式のテキストファイルである(下記のデータをダウンロードしてから、是非その中身をテキストエディタで確認してほしい)。

こうしたGPPデータ記録ファイルは、無料のオープンソースGPSデータ変換ソフトウエアGPSBabel(Win/Mac/Linux用がある)などで相互変換できる。 GPSデータを様々な編集加工するソフトウエアも myTracks(iPhone/Android用のGPSアプリ医 My Tracksとは別物)などがあり、トラックの分割・結合、写真に位置情報を埋め込むなどの作業が可能である。 実際、以下のデータは分割記録された複数のGPSログをmyTracksで結合して作成した。

以下は、M-241で記録したGPS測位データをMac用の(Bluetooth/USB)読み出しソフトウエアHoudahGPSによってファイルに取り出したり、SonyポータブルナビゲーションNV-U75Vの記録(KML/GPXのどちらかで記録)をMemoryStick Duoに書き出して、GPSデータ変換ソフトウエアGPSBabel(Win/Mac/Linux用が)によって変換し、必要に応じてmyTracksでトラックを結合して1つのファイルとしたものである。

toyara.kml | toyara.gpx
御徒町、赤坂を周回
tokyoUniv-palace.kml | tokyoUniv-palace.gpx
本郷、皇居を周遊
gatebridge.kml | gatebridge.gpx
東京ゲートウェイ橋を周遊

演習

  1. Goog Earthを起動しておき、上のリンクの kml形式のファイルをダウンロードしてから、Drag & Drropしてみなさい。
  2. earth_slider 場合によっては、右図にあるような時間スライダーが現れて、これをを左右に移動して,移動経路の様子を表示させることもできる。
  3. Google Erathで複数のGPSデータを読み込んだとき、左ペインにある[場所]の「保留」の箇所に注意しよう。 読み込んだファイル毎にチェックが付いているはずだ。 このチェックを外すとどうなるかを確認せよ。 また、[保留]にある読み込んだデータを削除してみよ。
  4. earth_gpxGoog Earthを起動しておき、上のリンクの gpx形式のファイルをダウンロードしてDrag & Drropしてみなさい。 このときに現れるウィンドウには右図のようにチェックを入れる。 Googleの地図処理系でもGPX書式を直接読み込むことができるようなって便利になった。

GPSデータでツアーを疑似体験する

GPS_track_tour

GPSデータをGoogle Earthに読み込ませると、左ペインにある「場所」の[保留]にそのデータセット名が表示される。 このとき、左図のようにデータセットを展開してみよう。 (この例のように)[トラックを結合]にチェックをいれると(左図の赤丸)、ツアー作成ボタンmaking_tour_buttonが表示される(左図の青丸)。 このボタンをクリックしてみよう。 Google EarthはGPSの時間データにしたがって、バードビューでツアーを始めてくれる。

3d_tourr

ツアーの様子は、Google Earthの設定によって劇的に変わる。 3D表示に切り替えると(日本では一部の都市部だけだがビルなどが立体的に表示されるわけだが)、その様子でのツアーが行われる。 右図は、ツアーの1シーンである。

Google Earthの面目躍如である。 ツアーの設定は、Windowsでは[ツール]/[オプション]で、Mac の場合は[Google Earth]/[環境設定]でデフォルト値以外のパラメータを指定できる。

詳しくは、Google Earthのヘルプ、とくにGPS の使用、さらにはGPS トラックの表示を参照しよう。

課題

以下では、Googleアカウントを取得しておく必要がある。

  1. 上のリンクからKMLファイルをダウンロードしておき、Google Map[マイプレイス]にある赤い[地図作成]ボタンを押して、「インポート」ボタンを押してKMLをインポートしてみよう。 「ファイルを選択」からダウンロードしたファイルを選択し、「ファイルからアップロード」ボタンを押す。
  2. 上のリンクからKMLファイルをダウンロードし、同様に、Google Map[マイプレイス]にある赤い[地図作成]ボタンを押して、「インポート」ボタンを押してKMLをインポートしてみよう。 「ファイルを選択」からダウンロードしたファイルを選択し、「ファイルからアップロード」ボタンを押す。
  3. 1.と 2.の両者は同じような図をGooglMapに表示したことに注意する。 では、その経路の移動はどのように進んだか調べなさい
  4. 経路上に適当なマークや写真を追加してみなさい。

GPS情報(GPSデバイスの位置と高度情報からなな点列)としての軌跡の範囲ではGoogle Earthで表示させた結果とGoogle Mapで表示させた結果は同じで線画として同じである。 言い換えるとGoogle Mapさえあれば十分だと思いたくなる。 結論からいうと、Google Mapの表現はGoogle Erathのサブセットに過ぎない。

KML形式とGPX形式

GPSデータとして記録ファイルは、GPX(GPs eXchange Format、拡張子 .gpx)形式またはKML(Keyhole Markup Language、拡張子.kml)形式で保存しておくとよい。 これらは(GPS情報だけを取ってみた場合には)どちらもテキストデータで、MXL形式で記述された機械可読なファイルである。 それらは、以下で簡単に説明するように、限定的な変換となる場合もあるが、GPSデータ変換ソフトウエアGPSBabel(Win/Mac/Linux用がある)やwebサービスGPS Visualizerなどで相互変換することができる。

GPXデータでは、移動地点情報を軌跡(ルート)して時間(time stump)を付与した順序データとして記述している。 さらに、移動地点情報以外にも、まわりにある順序関係を持たない地点の集まりをウェイポイントとしても保持できる。 GPXファイルに必要な最小限情報は、単一ポイントの緯度経度情報で、それ以外の情報の記述は任意である。

一方、 KMLデータは、Google Earthでの利用を意図して書式化されたXML形式のファイルで、上の課題(Google Mapのマイプレイス・サービス)で確かめたようなGPSデータよりも高い表現能力を持っており、線、画像、ポリゴンなどの地理的特徴をモデリングして保存できる。 このため、KMLファイルはしばしばZIPで圧縮された .kmz という拡張子を持つKMZファイルの形態を取ることもある。

GoogleマップではKMLで記録できる情報の一部だけを使って表示するのであり、KML情報を完全に活かすためにはGoogle MapでなくGoogle Earthを利用する、というのがGoogleにおける両者の位置づけである。 つまり、Google Map≠Google Earthということだ。

KMLについては、詳しくはGoogleによるKML 入門用ドキュメントが参考になる。 2008年4月にKML2.2版は、そのままOpen Geospatial Consortium, Inc (OGC) という地理情報システムのオープンソース化を目指す団体の規格にOGC KMLとして取り入れられた。KMLでは、表示する要素は目印、イメージ、ポリゴン、3次元モデル、説明などで記述する。各地点は、常に右手系の経緯度情報を持つ。また、カメラ・ビューを構成するのに必要なティルト、カメラの向き、高度など、より詳細なデータを記述することもできる。 繰り返しになるが、現在のKMLで記述された情報の全てが、Google Mapで表示できるわけでなく、Google Earth(またはKMLを理解する同等なGISソフトウエア)が必要になる。

参考

地形などの地理情報を記述するためのファイル形式にGML(Geography Markup Language)がある。 地理情報システムでの利用を念頭にOpen Geospatial Consortium (OGC)によって開発された地理的特徴を表現する XMLベースのマークアップ言語で、地理情報システムやインターネット上で地理情報を交換するフォーマットとして使用されている。 既に、ISO 19136として標準化されており、日本においてもJIS X 7136(地理マーク付け言語)として2012年1月に日本工業規格化されたが、既に2008年4月から国土地理院が提供している基盤地図情報で利用されている。

国土地理院の基盤情報の閲覧・ダウンロードは誰でも無料で利用できるが、『提供するサービスの円滑な運営に必要な範囲で、国土地理院のプライバシーポリシーに基づき、利用される皆様の情報を収集しています。収集した情報は利用目的の範囲内で適切に取り扱います。』とう主旨のもとで、同意の上で、ユーザIDをパスワードを取得する必要がある。

KML形式とGPX形式の内容見本

KMLおよびGPX形式のファイルは、以下で見るようにどちらもUTF-8で文字符号化されたXML形式のテキストファイルである。 2行目からわかるように、KMLとGPXではXML名前空間が違っている。 ここでは、もっとも単純な場合として、受信したGPS情報をどのようにXML形式で書き出しているかを比較してみよう。

KML形式GPX形式
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<kml xmlns="http://earth.google.com/kml/2.2">
    <Document>
        <Style id="trackstyle">
            <LineStyle>
                <color>ffff0000</color>
                <width>4</width>
            </LineStyle>
        </Style>
        <Style id="camerastyle">
            <IconStyle>
                <Icon>
                    <href>http://www.mytracks4mac.com/kml/shapes/kml_camera.png</href>
                </Icon>
            </IconStyle>
        </Style>
        <Style id="waypointstyle">
            <IconStyle>
                <Icon>
                    <href>http://www.mytracks4mac.com/kml/shapes/kml_pin_yellow2.png</href>
                </Icon>
                <hotSpot x="8" y="5" xunits="pixels" yunits="pixels"></hotSpot>
            </IconStyle>
        </Style>
        <Placemark>
            <name>13:37</name>
            <styleUrl>#waypointstyle</styleUrl>
            <Point>
                <coordinates>139.777475,35.668017,-7</coordinates>
            </Point>
        </Placemark>
        <Placemark>
            <name>14:38</name>
            <styleUrl>#waypointstyle</styleUrl>
            <Point>
                <coordinates>139.757137,35.579787,26</coordinates>
            </Point>
        </Placemark>
        <Placemark>
            <name>14:38</name>
            <styleUrl>#waypointstyle</styleUrl>
            <Point>
                <coordinates>139.757165,35.579727,25</coordinates>
            </Point>
        </Placemark>
        <Placemark>
            <name>15:16</name>
            <styleUrl>#waypointstyle</styleUrl>
            <Point>
                <coordinates>139.777047,35.669100,14</coordinates>
            </Point>
        </Placemark>
        <Placemark>
            <name>トラックを結合しました</name>
            <styleUrl>#trackstyle</styleUrl>
            <LineString>
                <coordinates>
			139.777475,35.668017,-7
			139.777457,35.667995,-4
			139.777442,35.667978,-2
			139.777428,35.667967,-1
			139.777243,35.667733,28
			139.777245,35.667733,28
			139.777245,35.667733,29
			139.777245,35.667733,29
			139.777247,35.667733,29
			139.777247,35.667732,29
			139.777247,35.667732,29
			.....
			......
			139.776886,35.668976,23
			139.776733,35.668854,23
			139.777043,35.669100,14
			139.777047,35.669100,14
			139.777047,35.669100,14
		</coordinates>
            </LineString>
        </Placemark>
    </Document>
</kml>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mytracks="http://mytracks.stichling.info/myTracksGPX/1/0" creator="myTracks" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
    <trk>
        <name>track-7</name>
        <desc>Log every 5 sec, 0 m</desc>
        <extensions>
            <mytracks:color red="0.000000" green="0.000000" blue="1.000000" alpha="1.000000"></mytracks:color>
            <mytracks:area showArea="no" areaDistance="0.000000"></mytracks:area>
            <mytracks:directionArrows showDirectionArrows="yes"></mytracks:directionArrows>
            <mytracks:sync syncPhotosOniPhone="no"></mytracks:sync>
            <mytracks:timezone offset="540"></mytracks:timezone>
        </extensions>
        <trkseg>
            <trkpt lat="35.676502228" lon="139.756057739">
                <ele>17.185059</ele>
                <time>2012-08-15T03:07:12Z</time>
                <desc>Lat.=35.676502, Long.=139.756058, Alt.=17.185059m, Speed=0.000000Km/h</desc>
                <extensions>
                    <mytracks:speed>0</mytracks:speed>
                    <mytracks:length>0</mytracks:length>
                </extensions>
            </trkpt>
            <trkpt lat="35.676502228" lon="139.756057739">
                <ele>17.178711</ele>
                <time>2012-08-15T03:07:17Z</time>
                <desc>Lat.=35.676502, Long.=139.756058, Alt.=17.178711m, Speed=0.320606Km/h</desc>
                <extensions>
                    <mytracks:speed>0.3206059327751585</mytracks:speed>
                    <mytracks:length>0</mytracks:length>
                </extensions>
            </trkpt>
            <trkpt lat="35.676498413" lon="139.756057739">
                <ele>17.179199</ele>
                <time>2012-08-15T03:07:22Z</time>
                <desc>Lat.=35.676498, Long.=139.756058, Alt.=17.179199m, Speed=0.305686Km/h</desc>
                <extensions>
                    <mytracks:speed>0.305685762791301</mytracks:speed>
                    <mytracks:length>0.0004350481890523979</mytracks:length>
                </extensions>
            </trkpt><?xml version="1.0" encoding="UTF-8" standalone="no"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mytracks="http://mytracks.stichling.info/myTracksGPX/1/0" creator="myTracks" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
    <trk>
        <name>track-7</name>
        <desc>Log every 5 sec, 0 m</desc>
        <extensions>
            <mytracks:color red="0.000000" green="0.000000" blue="1.000000" alpha="1.000000"></mytracks:color>
            <mytracks:area showArea="no" areaDistance="0.000000"></mytracks:area>
            <mytracks:directionArrows showDirectionArrows="yes"></mytracks:directionArrows>
            <mytracks:sync syncPhotosOniPhone="no"></mytracks:sync>
            <mytracks:timezone offset="540"></mytracks:timezone>
        </extensions>
        <trkseg>
            <trkpt lat="35.676502228" lon="139.756057739">
                <ele>17.185059</ele>
                <time>2012-08-15T03:07:12Z</time>
                <desc>Lat.=35.676502, Long.=139.756058, Alt.=17.185059m, Speed=0.000000Km/h</desc>
                <extensions>
                    <mytracks:speed>0</mytracks:speed>
                    <mytracks:length>0</mytracks:length>
                </extensions>
            </trkpt>
            <trkpt lat="35.676502228" lon="139.756057739">
                <ele>17.178711</ele>
                <time>2012-08-15T03:07:17Z</time>
                <desc>Lat.=35.676502, Long.=139.756058, Alt.=17.178711m, Speed=0.320606Km/h</desc>
                <extensions>
                    <mytracks:speed>0.3206059327751585</mytracks:speed>
                    <mytracks:length>0</mytracks:length>
                </extensions>
            </trkpt>
            <trkpt lat="35.676498413" lon="139.756057739">
                <ele>17.179199</ele>
                <time>2012-08-15T03:07:22Z</time>
                <desc>Lat.=35.676498, Long.=139.756058, Alt.=17.179199m, Speed=0.305686Km/h</desc>
                <extensions>
                    <mytracks:speed>0.305685762791301</mytracks:speed>
                    <mytracks:length>0.0004350481890523979</mytracks:length>
                </extensions>
            </trkpt>
			.........
			.........
			<trkpt lat="35.66897582999998" lon="139.776885986">
                <ele>23.270508</ele>
                <time>2012-08-15T04:47:58Z</time>
                <desc>Lat.=35.668976, Long.=139.776886, Alt.=23.270508m, Speed=13.928675Km/h</desc>
                <extensions>
                    <mytracks:speed>13.92867501262893</mytracks:speed>
                    <mytracks:length>0.00289513748272883</mytracks:length>
                </extensions>
            </trkpt>
            <trkpt lat="35.66885376" lon="139.776733398">
                <ele>23.242676</ele>
                <time>2012-08-15T04:48:03Z</time>
                <desc>Lat.=35.668854, Long.=139.776733, Alt.=23.242676m, Speed=13.928675Km/h</desc>
                <extensions>
                    <mytracks:speed>13.92867501262893</mytracks:speed>
                    <mytracks:length>0.01934538196198462</mytracks:length>
                </extensions>
            </trkpt>
        </trkseg>
    </trk>