GPSデータの入ったCSVファイルからマップデータ(HTML)を作成する


本記事では、緯度・経度などのGPSデータを地図上に反映させた、マップデータを作成するスクリプトを紹介します。

GPSデータの入ったCSVファイル

前回書いた記事で、GPSデータが入ったCSVファイルを作りました。
前回:https://qiita.com/vegaukulele/items/e03cf83479a504344ca9
内容はこんな感じです。

gps log.csv
time,latitude,longitude,altitude,timestamp,horizontal_accuracy,vertical_accuracy,speed,course
2018/11/18 15:52,34.5,136.53,9.39266777,1542523726,65,10,-1,-1
2018/11/18 15:52,34.6,136.3,9.39266777,1542523717,65,10,-1,-1
2018/11/18 15:52,34.7,136,7.835945129,1542523942,10,4,0,-1

少し読みにくいですが、時間,緯度,経度,高度,... とデータが並んでいます。
数値は適当です。

CSVファイルを読み込んでデータを整理

それではスクリプトの説明に入っていきます。
まずはインポートするライブラリから。

gps_mapmaker.py

# 地図を作成するWebアプリ「Leaflet」を利用したライブラリ
import folium 

今回は「folium」というライブラリを使用します。あらかじめpipでインストールをお願いします。

続いてCSVファイルを開きます。


# あらかじめ空のリストを2つ用意する
gps_list = []
gps_data = []
# 保存されているgps_log.csvを読み込みモードで開く
with open('gps_log.csv', mode = 'r', encoding = 'utf-8') as f:
# next()で2番目から(csvでは2行目から)データを扱う
    next(f)
# csvのrowそれぞれに対して、改行を省いてカンマで区切ってリストにする
# さらにリストのうち先頭3つ(取得時間、緯度、経度)を抽出する
    for line in f:
        gps_list = line.rstrip('¥n').split(',')
        gps_data.append(gps_list[:3])

これでgps_dataリストに必要なデータを格納できました。しかしこのリストは文字列型のリストなので、foliumで扱えるように手を加えます。

読み込んだ文字列型リストを小数型リストに変換

gps_data_flt = []
time_data = []
for d in gps_data: # gps_dataリストの各要素(リスト型)に対して処理を実行
    time_data.append(d[0]) # 取得時間のリストを別途用意する
    d.pop(0) # 取得時間の要素を削除する
    for i in d: # 要素(リスト型)の中の要素[文字列型]を順に[小数型]に変換
        gps_data_flt.append([float(i) for i in d])

gps_dataリスト内の要素を「取得時間」リストと「緯度,経度」リストに分け、「緯度,経度」リストの要素をfloat型にしました。まどろっこしいコードな気がしますが、試行錯誤した結果なのでご容赦ください。

foliumのメソッドを使ってマップデータを作成

編集したデータを使ってマップデータを作ります。

# 地図の基準地点として、最後のログの位置を設定
last_log = gps_data_flt[-1]
# 基準地点と初期の倍率を指定し、地図を作成する
map = folium.Map(location=last_log, zoom_start=30)
# 記録した各ログをマークし、popupを自身の計測時間とする
for f,t in zip(gps_data_flt,time_data):
    marker = folium.Marker(f, popup=t)
    map.add_child(marker)

# 置いたマーカー同士を線で結ぶ
gps_line = folium.PolyLine(locations=gps_data_flt)
map.add_child(gps_line)

# 地図をhtml形式でこのスクリプトと同じディレクトリに出力
map.save(outfile= "gps_map.html")

作成したhtmlファイルをブラウザで見てみましょう。

マップ上にマーカーがプロットされてますね。
マーカーをクリックするとポップアップ(取得時間)を見ることができます。

説明は以上になります。かなり苦戦しましたが、なんとか作れました。
リストや辞書などの基礎的な処理はなんだかんだ言って大事ですね。

参考にしたURL:

「Folium 0.5.0 documentation」
http://python-visualization.github.io/folium/docs-v0.5.0/modules.html

「Pythonのfoliumパッケージで地図を描いてみる」
https://qiita.com/kzkt0713/items/de85668dca14462c182d

「Python + folium で Strava の "全"記録を地図で可視化 🚲」
https://hiboma.hatenadiary.jp/entry/2017/09/13/094056

補足:Pythonista3でやる場合

Pythonista3の場合はStashを使ってインストールする必要があります。具体的な方法は以下を参照ください。
「まだPythonista3使ってないの?ー基本操作・StaShインストール編ー」
https://qiita.com/n_oshiumi/items/4a647f2c8a3c209fd87b

Stashでfoliumをインストールしたら、brancaというライブラリも一緒にインストールしてください。folium自身がbranceを使用するようです。

また、foliumの使用にはnumpyも必要になるのですが、Pythonista3にはnumpyがデフォルトでインストールされています。私はそれに気づかずインストールしてしまい、スクリプトがうまく動かず、結構悩みました。一度Pythonista3をダウンロードし直してfoliumとbrancaだけインストールすると動きました。気を付けてください。