GPSログのビジュアライズ#01

作りかけているGPSロガーですが、ちょっと持ち歩いてみた感じ、どうやら動いていそうなので、ログを見てみたいと思います。

保存されている、GPS.LOGを開いて、一行抜き出してみると(詳細は隠しています)、こんな感じ。

2020/12/2,9:44:17,43.xxxxxx,141.xxxxxx,39.60

1行がカンマで区切られたCSVで、

日付 , 時間, 緯度, 経度, 高度

となっています。ひとまず、緯度と経度をプロットしてみたいと思います。python でサクッとできるとスマートなのかなとも思いますが、使い慣れてないのでやめたい。Processing なのか、openFrameworks なのか、実は使い慣れている Objective-C++ とOpenGLでやるのが最終的に速い気がするのですが、環境としてはマイナーなのでやめた方がよいかもしれないですね...

せっかくなので、Python でやってみることにします。

ちょっと調べてみると、csv周りは pandas 、グラフ周りは matplotlib がよさそうなので、これらをpipでインストールしてみました。pipが古いと言われましたが放置して、デスクトップにおいた先ほどの "GPS.LOG" を、"gps.csv"にリネーム。(あとで確認したら、そのままでも読めました...)

とりあえず、Terminal から Python3 を立ち上げて、読み込み&コラムに適当な名前を放り込んでダンプしてみると、

>>> import pandas as pd
>>> import matplotlib.pyplot as plt
>>> df = pd.read_csv('/Users/h/Desktop/gps.csv', names=['date', 'time', 'lat', 'lng', 'alt'])
>>> print(df)
            date      time        lat        lng   alt
0       2000/0/0  23:59:42   0.000000    0.00000   0.0
1       2000/0/0  23:59:43   0.000000    0.00000   0.0
2       2000/0/0  23:59:44   0.000000    0.00000   0.0
3       2000/0/0  23:59:45   0.000000    0.00000   0.0
4       2000/0/0  23:59:46   0.000000    0.00000   0.0
...          ...       ...        ...        ...   ...
19114  2020/12/2   9:44:37  43.xxxxxx  141.xxxxx  40.6
19115  2020/12/2   9:44:37  43.xxxxxx  141.xxxxx  40.6
19116  2020/12/2   9:44:38  43.xxxxxx  141.xxxxx  40.6
19117  2020/12/2   9:44:38  43.xxxxxx  141.xxxxx  40.6
19118  2020/12/2   9:44:39  43.xxxxxx  141.xxxxx  40.7

[19119 rows x 5 columns]

という感じで読み込めました。次は、lat, lng を xy でプロットしたいので、しばし検索したところ、scatter という関数をみつけました。

plt.scatter(df['lng'],df['lat'])

リターン。何も起きず。

plt.show()

リターンすると、ウィンドウが開きました。こんな感じ。

なんとなく緯度経度でプロットされてそうな気配。簡単すぎて拍子抜けしていると、丁寧にUIがついている!ことに気づきました。ルーペを使って拡大すると、

きれいに録れてます。よかった。

コードをまとめると、

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('/Users/h/Desktop/1202_tesetGPS.LOG', names=['date', 'time', 'lat', 'lng', 'alt'])
plt.scatter(df['lng'],df['lat'])
plt.show()

たったこれだけでした。Pythonユーザが多いのも納得できます。

簡単なので、気になっていることを確認してみます。というのも、高度情報の精度がかなり怪しい気がしていて、何かのタイミングで確認しないといけないと思ってたところでした。

単なる折れ線グラフはこれで書けます。

plt.plot(df['alt'])

リターンして、show()すると、

!!!

これは怪しいというか、全然あてにならない?準天頂衛星のみちびき対応のモジュールなのでちょっと期待してたのですが。。。ライブラリのバグ?の可能性は検索する限り報告されてなさそうですし、、、ただ、前半の値が安定している部分以外は、部屋に置いていた時間である可能性もなくはないので、もうちょっと詳細に検証が必要です。今は時間がないのですが、いずれ検証したいと思います。