Googleロケーション履歴から、
YAMAP用にGPXデータを取り出す
YAMAP使っていてGPSがうまく取れていないことがありました。もしかしたらGoogleのデータで補完できないかと思いました。調べてみると、Googleのサイトで自分のデータをダウンロードが可能で、ロケーション履歴がにGPSの記録が残ってるようでした但し、いくつか問題がありました。
- ファイル形式がJSONかKML形式でした。YAMAPはGPX形式なので、変換が必要です。
- KML形式のロケーション履歴は、一括ダウンロードで何年分もの巨大なファイルでした。目的の位置情報を探すのは大変です。
- KML形式もGPX形式も、日付はUTC、つまりイギリス時間で表記されているのわかりにくいです。
作りたいプログラム
ということで、変換プログラムを作ることにしました。要件は下記の通り。
- YAMAPで読めればいい。完璧な変換はしなくていい。
- 入力はKML形式の1ファイル。ファイルが大きいのでXMLのSAXパーサーで処理する。
- 出力は適当な単位で分けて、複数のファイルのする。データの間隔が1時間を越えたら、別ファイルにするで考えます。
作ったプログラム
2つのPythonのファイルでプログラムを構成します。
- 1.GPXファイルの出力 (GpxOutput.py)
- 座標データを受け取ってXMLファイルを構成し、前座標と1時間以上離れていたらファイルを出力します。
- 2.KMLファイルの入力 (KmlInput.py)
- KMLをパースして、時刻と座標のデータだけ抜き出し、GpxOutput.pyに渡します。
数時間でチャチャっと作った簡単なプログラムです。変換したGPXファイルはYAMAPで読めました。
でも、Googleのロケーション履歴データもボロボロで結局使えませんでした。ガックシ。
GPXファイルの出力
GpxOutput.py
GPXファイル形式は、GPXのサイトを見てください。かなり複雑ですが、省略可能なタグも多いし、時刻と経度と緯度と高度を表記するだけだと、必要なタグは以下の6つになります。
- GPXタグ:同じパターンで生成すればよさそうです。trkタグの入れ物です。
- trkタグ:trksegタグの入れ物です。
- trksegタグ:trkptタグの入れ物です。
- trkptタグ:緯度(lat)と経度(lon)を属性に持ち、eleタグとtimeタグの入れ物です。
- eleタグ:標高(メートル単位)
- timeタグ:時刻
プログラムの中身は以下の4点になります。
- 経度、緯度、高度、時刻が渡されるごとにアクションがあります。
- GPXファイルを作成するのにはDOMを使用します。
- データの間隔が1時間を越えたら、別ファイルにします。
- 年代別に異なるディレクトリに格納します。
KMLファイルの入力
KmlInput.py
KMLファイル形式は、GoogleのKML Referenceページを見て下さい。SAXでパースする観点で見ると、whenタグで囲われたテキストが日付、whenの次のgx:coordタグで囲われたテキストががスペースで区切った、経度、緯度、および高度の3つの値で構成される座標値と分かっていればよいので、他は無視します。ということで、KMLハンドラの中身は以下の3点になります。
- テキストが現れたら覚えておく。
- Whenの終了タグが現れたら、覚えたテキストを時刻として覚えておく
- gx:coordの終了タグが現れたら、覚えたテキストから経度、緯度、高度を取り出し、覚えていた時刻と共に、GpxOutput.pyに渡す。
記述内容について一切保障しません。
リンクは自由に行ってかまいません。
Since 2020/03/01, Final update 2020/03/01, Presented by Ishida So