iPX社員によるブログ

iPX社員が"社の動向"から"自身の知見や趣味"、"セミナーなどのおすすめ情報"に至るまで幅広い話題を投下していくブログ。社の雰囲気を感じ取っていただけたら幸いです。

"A journey of a thousand miles begins with a single step."

残暑厳しい折失礼しますHirosakiです。
今回はPythonで地図を作成するライブラリを試してみます。

前回の続きを書こうと考えてはいましたが
「ゲームを作る」というアイデア貧弱人間には致命的な壁に直面してしまったためPyxel記事は打ち切ります。



続きます。

今回は【folium】というライブラリを使用します。
(公式ドキュメント:http://python-visualization.github.io/folium/

0. 環境構築

pipでインストール可能なので早速インストール。

pip3 install folium

f:id:ipx-writer:20190831154949p:plain

正常にインストールできていればimportが成功します。

import folium

f:id:ipx-writer:20190831155331p:plain

1. 動作確認(表示・保存テスト)

簡単なサンプルコードを作成し実行します。

import folium
m = folium.Map(location=[35.6834222,139.7018472])
m.save('map.html')

f:id:ipx-writer:20190831160057p:plain
実行後、ファイルが保存されるので展開。

f:id:ipx-writer:20190831160116p:plain
locationに指定した緯度経度を中心とした地図が表示されます。

2. 表示倍率変更

もう少し拡大された地図が表示されるように編集します。
Mapクラスのインスタンス生成時にパラメータ「zoom_start」を追加します。
(設定可能値:0~20)

import folium
m = folium.Map(location=[35.6834222,139.7018472],zoom_start=20)
m.save('map_zoom.html')

f:id:ipx-writer:20190831160814p:plain
寄りました。

3. マーカーの追加

地図の中心位置にマーカーを置いてみます。
folium.Marker関数を使います。

import folium
m = folium.Map(location=[35.6834222,139.7018472],zoom_start=20)
folium.Marker([35.6834222,139.7018472]).add_to(m)
m.save('map_addMarker.html')

f:id:ipx-writer:20190831161708p:plain

Marker関数は色・見た目の変更や、
クリックしたときに表示されるインデックスを指定することも可能。

folium.Marker([35.6834222,139.7018472],
              popup='GoalPoint',
              icon=folium.Icon(color='red',icon='cloud')).add_to(m)

f:id:ipx-writer:20190831162030p:plain

4. 複数のマーカーを追加する

Marker関数は異なる座標値で書いた分だけ追加できます。
あと2つほど追加してみます。

import folium
m = folium.Map(location=[35.6834222,139.7018472],zoom_start=20)

folium.Marker([35.6834222,139.7018472],
              popup='GoalPoint',
              icon=folium.Icon(color='blue',icon='cloud')).add_to(m)
folium.Marker([35.6833811,139.7016667],
              icon=folium.Icon(color='red')).add_to(m)
folium.Marker([35.6835939,139.7016240],
              icon=folium.Icon(color='blue')).add_to(m)
folium.Marker([35.6839773,139.7015355],
              icon=folium.Icon(color='blue')).add_to(m)

m.save('map_addMarker3.html')

f:id:ipx-writer:20190831162450p:plain

5. 各経緯度をつなぐ線を描画する

各マーカーの間を線で繋いでみます。
folium.PolyLine関数に各経緯度情報が格納されたリストを渡し描画します。

import folium

locations = [[35.6833811,139.7016667],[35.6835939,139.7016240],[35.6839773,139.7015355]]
line = folium.PolyLine(locations=locations,color='green')

m = folium.Map(location=[35.6834222,139.7018472],zoom_start=20)
m.add_child(line)

folium.Marker([35.6834222,139.7018472],
              popup='GoalPoint',
              icon=folium.Icon(color='blue',icon='cloud')).add_to(m)

m.save('map_addLine.html')

f:id:ipx-writer:20190831163416p:plain
各座標間が線分で繋がれました。

PolyLineは色の指定も可能です。
先程描画していたマーカーと合わせて描画してみます。

import folium

locations = [[35.6833811,139.7016667],[35.6835939,139.7016240],[35.6839773,139.7015355]]
line = folium.PolyLine(locations=locations,color='green')

m = folium.Map(location=[35.6834222,139.7018472],zoom_start=20)
m.add_child(line)

folium.Marker([35.6834222,139.7018472],
              popup='GoalPoint',
              icon=folium.Icon(color='blue',icon='cloud')).add_to(m)

folium.Marker([35.6833811,139.7016667],
              icon=folium.Icon(color='red')).add_to(m)
folium.Marker([35.6835939,139.7016240],
              icon=folium.Icon(color='blue')).add_to(m)
folium.Marker([35.6839773,139.7015355],
              icon=folium.Icon(color='blue')).add_to(m)

m.save('map_addLine2.html')

f:id:ipx-writer:20190831163702p:plain
追加できました。

あとは座標データが複数揃えばそれらしい経路データを描画できそうです。
時系列の変化に合わせてマーカー位置が変化するような挙動がベストですがhtmlファイル出力では厳しそう。
色々やってみようかなと。