【初心者向け】10行以内のスクリプト(1.foliumで地図のプロット)
pythonで色々なライブラリを使えば、「少ないコードでもちょっとした事が出来て、少なければ5行程でもちょっとしたスクリプトが作れ、便利だな。」と思ったので、pythonやその他、コマンドを羅列しただけのものも出てくるかも知れませんが、10行程のスクリプトを不定期で投稿してみようと思います。
第1回として、「folium (pythonからleafletを利用して地図をプロットするpythonのライブラリ)を使用して、銀座周辺の地図をマーカー付きで3ヶ所プロットするスクリプトを投稿したいと思います。
このスクリプトでは、以下3ヶ所をプロットしました。
- 有楽町駅: 位置情報【35.6749187,139.7606366】
- 銀座コリドー街: 位置情報【35.6703699,139.7573871】
- Ginza-SIX: 位置情報【35.6695908,139.7618857】
【環境】
LinuxMint19.3
python: 3.6.9
pip3: 9.0.1
pandas: 1.0.3
jupyter-lab: 2.1.0
folium: 0.10.1
1.位置情報を準備
・プロットする場所の位置情報はgoogleのマップで呼び出し、urlの文字列をマウスでコピーしました。
地理的にプロットするそれぞれの場所が近いので、googleマップの「この場所について」で確認するよりも簡単でした。
**・因みに緯度は、「latitude」、経度は「longtude」**で、検索するとこの順番で表示されると思います。
例として、コリドー街の場合「緯度: 35.6749187・経度: 139.7573871」となっていました。
各場所のこの値を、データフレームに格納していきます。
foliumの最低限の構文は、以下の様なものです。
map = folium.Map(location=[基準地点の緯度,経度], zoom_start = 初期の倍率)
map
2.コーディング
コードはjupyterで実行、地図はjupyterにプロットされます。
# 銀座周辺をプロットするコードの例
# 1.ライブラリのインポート
import folium
import pandas as pd
# 2.データフレームへの位置情報の格納とマーカー表示の処理
plot_location = pd.DataFrame({
'ginza':['Yurakucho_station','GinzaCorridorSteet','GinzaSix'],
'latitude':[35.6749187 ,35.6703699 ,35.66695908],
'longtude':[139.7606366 ,139.7573871 ,139.7618857],})
map = folium.Map(location=[35.6749187,139.7606366], zoom_start = 15)
for i, r in plot_location.iterrows():
folium.Marker(location=[r['latitude'], r['longtude']], popup=r["ginza"]).add_to(map)
# 3.地図のプロット
map
これで、銀座界隈の地図がプロットされました。
下の画像は、画面キャプチャーですが、jupyterのノートブックにプロットされます。
コリドー街をクリックした状態です。
環境によるのだと思いますが、日本語では表示出来ませんでした。
このポップアップの文字はマーカーを設置する場所ですが、「2.データフレームへの位置情報の格納とマーカー表示の処理」で、各地点を記述する部分が該当します。
'ginza':['Yurakucho_station','GinzaCorridorSteet','GinzaSix'],
位置情報は「データフレーム」に格納していますが、foliumに直接渡すと3行のスクリプトにする事も出来るかと思います。
しかし、「データフレーム」を使うと、データ・セットを準備して拠点を増やす等の発展が出来ると思います。
参考にした先人達は、「csv」等に格納している例もある様です。
プロットしたマップを保存する場合は、以下の様に追加で**「save」を実行すれば、「html」に出力が出来ます。**
# プロットした地図をhtmlで書き込み
map.save("map_giza.html")
3.【補足】環境
この「folium」ですが、かなり便利なライブラリだと思うのですが、環境によって想定通りに動作しなかった事もありました。
参考までに、以下はこのスクリプトを実行した環境の情報です。
開発環境の情報だけですが、webブラウザを使う関係上、ブラウザの環境にもよりそうです。
実際、他ではプロットされない端末もありました。
恐らく、ブラウザの問題かと考えています。
・出力の一部は、削除してます。
less /etc/lsb-release
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=19.3
DISTRIB_DESCRIPTION="Linux Mint 19.3 Tricia"
(py3_env) $ pip3 --version
pip 9.0.1 from /home/xxx/py3_env/lib/python3.6/site-packages (python 3.6)
(py3_env)$ python -V
Python 3.6.9
$ pip3 show pandas
Name: pandas
Version: 1.0.3
Home-page: https://pandas.pydata.org
Requires: python-dateutil, pytz, numpy
(py3_env)$ pip3 show jupyterlab
Name: jupyterlab
Version: 2.1.0
Home-page: http://jupyter.org
Requires: notebook, tornado, jinja2, jupyterlab-server
(py3_env)$ pip3 show folium
Name: folium
Version: 0.10.1
Home-page: https://github.com/python-visualization/folium
Requires: numpy, jinja2, requests, branca
以上、foliumを利用した地図のプロットでした。