【foliumプラグインAntPath】OsmAndアプリで取得した経路座標データから経路地図を作成
今回は、前の投稿で作った経路座標データを使ってPythonの地図ライブラリ folium で経路地図を作成します。経路はfoliumのpluginsモジュールにあるAntPath(蟻の道) で表示。リスト形式の2次元の座標データを渡すだけ。
このような地図が出来上がります。
実行環境
- Androidスマホ
- Termuxアプリ F-Droid版
- JupyterNotebook 6.4.9
- Python 3.10
- ブラウザアプリ
- 外部ライブラリ
- folium 0.12.1、pandas 1.4.1
※ 参考
Termux上でJupyterNotebookを動かす際、 Brave や DuckDuckGo ブラウザで動くか試してみたところ、新規ブックの作成時に エラー(サーバーエラー500番) が出たりした。
対策として 「jupyterhub
をインストールしろ」と書いてある記事(stackovwrflowだったかな、海外のQ&Aサイト)があったのでやってみた。
jupyterhubのインストール時にRust
というライブラリ?のインストールが必要だの怒られ、やってみたものの結局他のエラーが出て失敗。
しかし、結果的にBraveやDuckDuckGoでJupyterNotebookのブック新規作成時のサーバーエラーは出なくなった。よく分からん😭💦💦
だがしかし、folium地図は表示されない。これもよく分からん😭💦💦
無難に GoogleChrome か Firefox を使えっていう。スマホでJupyterNotebookを使ってるのがそもそも間違(ry
地図作成
- 経路座標データの読み込み
前回投稿で作ったもの。
fname = "locations.csv"
- ライブラリのインポート
import pandas as pd import folium from folium import plugins
- 経路座標データファイルの読み込み
df = pd.read_csv(fname) df
0 | 1 | |
---|---|---|
0 | 33.302767 | 130.557956 |
1 | 33.302759 | 130.557915 |
2 | 33.302771 | 130.557914 |
3 | 33.302769 | 130.557914 |
4 | 33.302767 | 130.557915 |
... | ... | ... |
115 | 33.301906 | 130.564784 |
116 | 33.301955 | 130.564830 |
117 | 33.301985 | 130.564841 |
118 | 33.302007 | 130.564844 |
119 | 33.302034 | 130.564849 |
120 rows × 2 columns
- 地図の中心点座標を計算で出す
foliumの地図オブジェクトを生成する際、引数に地図の中心となる座標を渡す必要があります。
上記を見て分かるように、OsmAndアプリで取得した経路座標が120個ありますが
- 左列は緯度
- 右列は経度
です。緯度、経度からそれぞれ平均値を算出します。それにより複数の座標の中心点を求めます。
# 中心点座標算出
center = df.mean().tolist()
center
[33.30115091166667, 130.56119069666667]
- DataFrame型座標データをリスト型の2次元データに変換
data = df.to_numpy().tolist() data
[[33.3027671, 130.5579563],
[33.3027594, 130.5579148],
[33.3027713, 130.557914],
[33.302769, 130.5579141],
[33.3027669, 130.5579148],
[33.3027651, 130.5579129],
[33.302764, 130.557914],
[33.3027628, 130.5579342],
[33.3027644, 130.5579677],
[33.3026159, 130.5580937],
[33.3023849, 130.5578951],
[33.3026134, 130.5574362],
[33.302894, 130.5570338],
[33.3028297, 130.5565677],
[33.3023985, 130.5562709],
[33.3018615, 130.5558632],
[33.302071, 130.5552446],
[33.3022176, 130.5549505],
[33.3018017, 130.5551931],
[33.3012696, 130.5555582],
[33.3011023, 130.5561216],
[33.3011177, 130.5567848],
[33.3010896, 130.5572576],
[33.3011992, 130.5578784],
[33.3012734, 130.5585138],
[33.3010331, 130.5589202],
[33.3007732, 130.559075],
[33.3007023, 130.5591054],
[33.3005445, 130.5591581],
[33.3005421, 130.55919],
[33.3005522, 130.5591629],
[33.3005538, 130.5591607],
[33.3005504, 130.559158],
[33.3005515, 130.5591566],
[33.3005454, 130.5591551],
[33.3005501, 130.5591533],
[33.300658, 130.559147],
[33.3005997, 130.5591495],
[33.300543, 130.5591648],
[33.3005018, 130.5591689],
[33.3005323, 130.5591564],
[33.3005427, 130.5591443],
[33.3005405, 130.5591385],
[33.3005403, 130.5591354],
[33.3005376, 130.5591363],
[33.3005386, 130.5591233],
[33.3005504, 130.5591114],
[33.3005634, 130.5591067],
[33.300585, 130.5591488],
[33.3005904, 130.559132],
[33.3005871, 130.5591233],
[33.3005755, 130.5591242],
[33.300388, 130.559355],
[33.3000242, 130.5596398],
[33.299606, 130.5598481],
[33.2994054, 130.560379],
[33.2991708, 130.5609432],
[33.2987584, 130.5613196],
[33.2982239, 130.5616634],
[33.2985239, 130.561604],
[33.2990268, 130.5613333],
[33.2994923, 130.5610222],
[33.2998102, 130.5608276],
[33.3000383, 130.5609371],
[33.2999032, 130.5615809],
[33.2999814, 130.5621343],
[33.3004971, 130.562239],
[33.3008963, 130.5624242],
[33.300779, 130.5626847],
[33.3004825, 130.5630344],
[33.3002455, 130.5629783],
[33.2999774, 130.5626924],
[33.2995071, 130.5625506],
[33.2997783, 130.5628038],
[33.3000959, 130.5633902],
[33.3003372, 130.5637008],
[33.300765, 130.5636798],
[33.3011443, 130.5636985],
[33.3014109, 130.5637042],
[33.301775, 130.563622],
[33.3017691, 130.5638809],
[33.3013099, 130.5638954],
[33.3011359, 130.5640248],
[33.3015771, 130.5640941],
[33.3017818, 130.5643107],
[33.3013391, 130.5642964],
[33.30126, 130.5644088],
[33.3012551, 130.5644834],
[33.3011668, 130.5644932],
[33.3009942, 130.5643978],
[33.3009413, 130.5643503],
[33.3010532, 130.5643154],
[33.3012307, 130.5644285],
[33.3014704, 130.564626],
[33.3016857, 130.5647066],
[33.3018485, 130.5647589],
[33.3018331, 130.5647636],
[33.3018427, 130.564761],
[33.3018579, 130.5647169],
[33.3018888, 130.5646176],
[33.3018329, 130.5646447],
[33.3018299, 130.5646566],
[33.3018254, 130.5646602],
[33.3018259, 130.5646608],
[33.3018259, 130.564661],
[33.3018258, 130.5646615],
[33.3018257, 130.5646617],
[33.301826, 130.5646619],
[33.3018255, 130.5646626],
[33.3018256, 130.5646626],
[33.3018168, 130.5646724],
[33.301821, 130.5646703],
[33.3018305, 130.5646663],
[33.3018315, 130.564679],
[33.3018532, 130.5647214],
[33.3019064, 130.5647835],
[33.301955, 130.56483],
[33.3019854, 130.5648409],
[33.3020068, 130.564844],
[33.3020337, 130.5648494]]
- 基礎となるマップオブジェクトを生成
map = folium.Map( location = center, # 地図の中心点座標 zoom_start = 14 # 地図のデフォルトズーム ) # 地図表示 map
- AntPath(蟻の道)のプラグインで経路追加
antpath = plugins.AntPath( locations = data ) # 地図にAntPathを追加 antpath.add_to(map) # 地図表示 map
まとめてプログラムファイルにする
ブログに貼りつけられるようにpyファイルに書き出しておきます。
%%writefile map.py # 座標ファイル fname = "locations.csv" # ライブラリのインポート import pandas as pd import folium from folium import plugins # 座標データ df = pd.read_csv(fname) ## 地図中心点座標 center = df.mean().tolist() ## AntPath用の座標データ data = df.to_numpy().tolist() # 地図作成 ## 基準となる地図オブジェクト生成 map = folium.Map( location = center, # 地図の中心点座標 zoom_start = 12 # 地図のデフォルトズーム ) ## AntPathを地図に追加 antpath = plugins.AntPath( locations = data ).add_to(map) # ブログ貼りつけ用地図html生成 print(map._repr_html_())
上記でまとめている「%%writefile map.py」から始まるプログラム部分をJupyterNotebookに貼り付けて実行すると、作業フォルダの中に「map.py」が作成されます。
ターミナルで python map.py
を実行すればhtmlが出力されますので、それをコピーしてブログ編集画面などに貼り付ければ地図が表示できます。
以上です。