こんにちは id:nonylene です。この記事はKMCブログリレーの一環で書かれたものです。
ロケーション履歴を GIS ソフトで見よう
Google のロケーション履歴は便利ですが、平均速度や獲得標高といった細かい値が見たくなります、なりますよね?
実は、ロケーション履歴のエクスポート機能を使うと、数十秒間隔で記録された自分の経緯度・高度を取得することが出来ます。それを使ってお好みの GIS ソフトウェアで見れるようにする話です。
エクスポート
https://takeout.google.com/ から「ロケーション履歴」を選択してエクスポートします。このとき、フォーマットは KML にします*1。
KML から GPX に変換する
GPX のほうが色んなソフトで見れる上、ライブラリも揃っているので GPX に変換します。
GPSBabel という GPS 関係の様々なデータを変換するソフトウェアを使います。GUI もあるようですが、今回は CLI でやります。
$ sudo apt install gpsbabel $ gpsbabel -t -i kml -f location.kml -x "track,start=201909171200,stop=201909171900" -o gpx -F location.gpx
-x
で様々なフィルターができます。今回は日付(UTC)を指定して抽出しています。詳細は GPSBabel development:Chapter 4. Data Filters を参照してください。
ちなみに、フィルターの設定は入力パスと出力パスの間に挟まないとフィルタが動かないので気をつけてください。
エラーを取り除く
出力された GPX を見ると分かるのですが、たまに精度が悪いデータがあります。
Google Maps で青い円が大きくなるあのタイミングです。
これをそのまま GSI ソフトに入れてしまうと、速度が突然 13000km/h になったり獲得標高が 100m/s になってしまいます。
悲しいので適当にフィルタリングします。簡単にフィルタリングする手段としては
- 前回の点から一定以上の距離になっていれば除く
- 前回の点から一定以上の速度になっていれば除く
- 計測時のメタデータを用いる
といったものが考えられます。
このうち距離と一部のメタデータ(HDOP))については GPSbabel で省けるのですが、
といった理由により今回は使わずに、速度によってフィルタリングするスクリプトを自分で書きました。
スクリプト
normalizer という名前は、取得間隔がマチマチなのを適当に補間することでプレイバックを分かりやすくしようと思っていたことに由来します*3。結局カシミール3DやGoogle Earth では取得間隔がバラバラでもいい感じにプレイバックしてくれることが分かったので、フィルタリングするだけになりました。
gpxpy というライブラリがとても強力だったので特に難しいことは無かったです。
結果
ということで、先程の淡路島のログに対してフィルタリングをかけて、200km/h を超える点を省きます。
$ poetry run python3 main.py -i location.gpx -o location_filtered.gpx -s 200
全く別の地点に飛んでいたところが綺麗に無くなりました。最高です。
KMCM
KMCではパソコンで何かしたい人々を募集しています!!