KMC活動ブログ

京大マイコンクラブの活動の様子を紹介します!!

Google のロケーション履歴をエラー除きつつ GPX にする

こんにちは id:nonylene です。この記事はKMCブログリレーの一環で書かれたものです。

blog.kmc.gr.jp

ロケーション履歴を 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 になってしまいます。

f:id:nonylene:20200511184918p:plain
ある日の淡路島のログ。速度別に色分けしている。
地理院タイルにGPSログを追記して作成。

悲しいので適当にフィルタリングします。簡単にフィルタリングする手段としては

  • 前回の点から一定以上の距離になっていれば除く
  • 前回の点から一定以上の速度になっていれば除く
  • 計測時のメタデータを用いる

といったものが考えられます。

このうち距離と一部のメタデータHDOP))については GPSbabel で省けるのですが、

  • Google ロケーション履歴は取得間隔がマチマチなので正常でも距離が大きく飛ぶことがある
  • Google ロケーション履歴には GPSbabel で省けるメタデータ(HDOP)が入っていない*2

といった理由により今回は使わずに、速度によってフィルタリングするスクリプトを自分で書きました。

スクリプト

github.com

normalizer という名前は、取得間隔がマチマチなのを適当に補間することでプレイバックを分かりやすくしようと思っていたことに由来します*3。結局カシミール3DGoogle Earth では取得間隔がバラバラでもいい感じにプレイバックしてくれることが分かったので、フィルタリングするだけになりました。

gpxpy というライブラリがとても強力だったので特に難しいことは無かったです。

結果

ということで、先程の淡路島のログに対してフィルタリングをかけて、200km/h を超える点を省きます。

$ poetry run python3 main.py -i location.gpx -o location_filtered.gpx -s 200

f:id:nonylene:20200511192007p:plain
地理院タイルにGPSログを追記して作成。

全く別の地点に飛んでいたところが綺麗に無くなりました。最高です。

KMCM

KMCではパソコンで何かしたい人々を募集しています!!

www.kmc.gr.jp

blog.kmc.gr.jp

*1:JSON を選ぶと GeoJSON ではなく独自の形式で降ってくる

*2:JSON で取得した場合 accuracy におおよその精度 (m) が入っているのだけど、これは信用できるんだろうか?

*3:というがそれがメインの機能となる予定だった