GpsTrajectory

もともと地上に道はない. 歩く人が多くなれば,それが道になるのだ.
〜魯迅『故郷』 (竹内好訳) より〜

はじめに

もろもろの事情で SONY の GPS-CS1KSP を長いこと借用する機会を得ました. 要は GPS です. と言ってもこいつは道案内とかの機能はまったくなく, 計測した緯度経度を 15 秒毎にメモリに記録するだけのものです. 何時・何処に居たというデータと, デジカメの画像取得時刻 (内蔵時計による) とをマッチングし, 撮影場所データを画像ファイルの中に埋め込むことが本来の目的です. しかし, 画像とのマッチングをせずに 電子地図に移動軌跡を重ねて楽しむなんてこともできます.

例えば付属ソフトである Super Mapple に重ね合わせるには, gpsbabel で入力を NMEA 0183 sentences に, 出力を GpsDriveFormat にして, テキストをインポートすればできます. このテキストは緯度経度が文字列として書かれているだけですので, gnuplot 等のグラフ描画ソフトで描かすこともできます (ただし, データは緯度 (上下) 経度 (左右) の順に並んでいるので, xy を入れ替えて表示させる必要があります).

個人的には, 下手に既存の地図に軌跡を重ね合わせるより, こうやって軌跡をプロットしただけ (しかもデータ間を直線で結ばずに点を打っただけ) の方が面白く見えました. これは, 道や線路などのみが表示されたある種の地図です. 毎日, 今日通った軌跡を加えていくことで, 地図のエリアが広くかつ詳細になって いき, 地図を育てている感があります. 変な言い方ですが, 大航海時代に世界地図の空白部分を潰していく感覚 というものでしょうか. もう一つ, 面白いと感じるのは, 適度な誤差や記録間隔のため, 何度も通る道, ゆっくり移動した道程, 濃く太くなっていくことです. 実際の道幅に関わらず, 自分にとって重要度が大きな道程太くなっており, 新しい発見となって見てて楽しいです.

一方問題もあります. 最大の問題は長いことデータを集めると, データが大量になって 描画に時間がかかることです. データの並びによって, どう動いたかなどが分かるのですが, 単に点をプロットするだけの使い方ではまったくの無駄な情報です. unix 風に言えば sort して uniq をかけても問題ありません. さらに, 毎回データをコンバートしたり, グラフ描画ソフトで南北方向と東西方向の 縮尺を調整して見るのも面倒ってこともあり, データを適度に圧縮しつつ, 己の軌跡を閲覧するソフトを作ってみました.

プログラム

プログラム本体は こちらです.

適当なディレクトリに放り込んで実行してください. 放り込んだディレクトリの下に, 軌跡ログを蓄えていきますので, ある程度容量に余裕のあるドライブを選んでください (といっても, 通常の使用なら 1M 程度なので, 今時気にする程でもないですが).

プログラムを起動すると次のような画面が立ち上がります.

[Import] を押すと, ファイル選択ダイアログが立ち上がりますので, GPS-CS1K が吐いた log ファイルを指定してください. ちなみに, 付属プログラムの GPS Image Tracker に食わせた 過去のログファイルは [マイドキュメント][GPSMatch][Log] に溜まってます.

起動直後の表示範囲は東京駅周辺ですので, 大部分のログはそのままだと表示されないと思います. NS 及び EW 横のテキストボックスに緯度経度を入れ (単位は度), [Jump]ボタンを押して表示領域を変えてください. その後に, [Set Home Position] を押しておくと, 次回起動時 (および [Home]ボタンを押した時), この領域が中心と なって表示されます. 自宅周辺を指定しておくといいと思います.

緯度経度は付属ソフトの Super Mapple Digital の [地図]-[緯度経度を表示]メニューで調べることができます. ただ, この機能は度分秒で表されているので, 次の式で単位を度に変更しなくては なりません.

[度]=[度]+[分]/60+[秒]/3600
処理の都合上, 入力された緯度経度は適度にキリのいい数に調整されます.

[N][n][S][s][E][e][W][w] で移動, [Zoom Up][Zoom Down] で縮尺が変わります. 大体さわれば分かると思います. なお, 縮尺を小さくして表示範囲を広くした場合, 大量のデータを読み取るため 描画に時間がかかる可能性があります.

[Export] ボタンを押すと, 今描画されているデータを 448x448 の bmp ファイルとして保存します. ここでセーブしようとするファイルと同じ名のファイルが存在していた場合, 上書きするか ([Overwrite]), 混ぜ合わせるか ([Marge]), 止めるか ([Cancel]) か 聞いてきます. ここで「混ぜ合わせ」とは, 同じ 448x448 の bmp ファイルに対してのみ有効で, プロットしようとするピクセルの元の色を調べ, 白ならばプロットし白以外ならプロットしないというものです. この機能は, 「本プログラムが小学生が夏休みの宿題なんかで, 『gps ロガーで作った我が校区の地図』とか称して, ログを取って bmp に吐いて, 『ここは学校』『ここはスーパ』 など注釈を入れる使い方もありうるな〜」と考えたとき, 注釈を加えつつデータが更新できたらいいかもと加えたものです. まぁ実際そんな使い方がされるかは分かりませんが.

データフォーマット

データは実行ファイルを置いたディレクトリに TRJ という ディレクトリが掘られ, さらにデータが置かれます. 置き方や命名規則は見れば分かるでしょう.

緯度経度 0.05°毎に作られるデータファイル (map ファイル) は, 896x896 のピクセルデータが格納されています. すなわち 1 ピクセルは 0.05/896 = 0.0000558°, 南北方向だと 6.2m くらい です.

map ファイルは単純計算で 896x896/8/1024=98 kbyte の大きさが必要です. しかしこれだと無駄に大きいので圧縮しています. 圧縮方法の概要は以下の通りです. 詳細はバイナリエディタ等で覗いて確認してください.

バグ・その他

表示は緯度及び経度をそのまま画面上の xy に描画した正距円筒図法を使っています. そのため, 緯度が高いほど横に伸びた表示になります. 表示は 448x448 ピクセルの正方形ですが, 仮に縦 (南北) 方向は数ピクセルで 10m だったとして, 同じピクセル数の横 (東西) 方向の距離は, 鹿児島, 東京, 札幌それぞれおおよそ 8.5m, 8.1m, 7.3m になります.

実は南緯や西経で表現される場所で取ったデータがありませんので, 正しく動くか 試していません. 動かないかもしれません. 特に北緯と南緯, 東経と西経をまたがって移動した場合, 表示その他に失敗するかもしれません.

地図の移動や縮尺の変更は, google map その他のようにマウスでつかんで移動するとか, ホイールで縮尺が変わればかっこいいし使い勝手もよさそうですが, 作るのが面倒なのでボタン式にしてます.

GPS のデータは NMEA-0183 であることを前提に作っています. ので, この形式で吐く他の GPS ロガーでも動くと思います. 一方, その他の形式を吐く場合は適当にコンバータを用意してください.

本プログラムで蓄えられるデータは, あなたの通学通勤路, 自宅や会社, 学校の位置, よく寄る店などの個人情報が含まれる可能性があります. ネットで公開する際は十分に気をつけてください.

お約束ですが, 本プログラムを使って生じた不利益や障害に対し 作者は一切責任を負いません. 自己責任でお願いします.


[戻る]