よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【foliumプラグインAntPath】OsmAndアプリで取得した経路座標データから経路地図を作成

今回は、前の投稿で作った経路座標データを使ってPythonの地図ライブラリ folium で経路地図を作成します。経路はfoliumのpluginsモジュールにあるAntPath(蟻の道) で表示。リスト形式の2次元の座標データを渡すだけ。



このような地図が出来上がります。

f:id:chayarokurokuro:20220316164902j:plain



実行環境


※ 参考
Termux上でJupyterNotebookを動かす際、 BraveDuckDuckGo ブラウザで動くか試してみたところ、新規ブックの作成時に エラー(サーバーエラー500番) が出たりした。

対策として 「jupyterhubをインストールしろ」と書いてある記事(stackovwrflowだったかな、海外のQ&Aサイト)があったのでやってみた。
jupyterhubのインストール時にRustというライブラリ?のインストールが必要だの怒られ、やってみたものの結局他のエラーが出て失敗。



しかし、結果的にBraveやDuckDuckGoでJupyterNotebookのブック新規作成時のサーバーエラーは出なくなった。よく分からん😭💦💦
だがしかし、folium地図は表示されない。これもよく分からん😭💦💦

無難に GoogleChromeFirefox を使えっていう。スマホで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
Make this Notebook Trusted to load map: File -> Trust Notebook



antpath = plugins.AntPath(
    locations = data    
)

# 地図にAntPathを追加
antpath.add_to(map)

# 地図表示
map
Make this Notebook Trusted to load map: File -> Trust Notebook



まとめてプログラムファイルにする

ブログに貼りつけられるように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が出力されますので、それをコピーしてブログ編集画面などに貼り付ければ地図が表示できます。



以上です。