よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【folium】地図に自作アイコンを、差す!!!

foliumの地図に自作アイコンを差す

Python用地図作成ライブラリのfoliumで様々なピンやマーカーが表示できますが、今回は手前で用意した画像を差してみます。

folium.features.CustomIcon()を使うとできます。



【実行環境】

  • Windows10
  • WSL:Ubuntu
  • Anaconda
  • Python3.8
  • Jupyter Notebook
  • 外部ライブラリ folium



目次



カスタム・アイコンにする画像を用意

次の画像をマーカーにします。サイズは気にしなくて大丈夫です。あとで設定します。
この画像は拡張子がpngの透過性画像。不要な部分は背景が透けるようにしてある。透過性になっていないと四角い画像が貼られてしまいます。

# 画像の表示
from IPython.display import Image

f = 'masked_hannya.png' # 透過性あり
#f2 = 'hannya.jpeg' # 透過性なし

# 表示 アイコン用
Image(f)

f:id:chayarokurokuro:20210711171928j:plain



実装

早速コードを書いていきます。

import folium
from folium.features import CustomIcon

# 自作アイコン用画像
img = 'masked_hannya.png' # アイコン用
#shadow_img = 'hannya.jpeg' # アイコンの影効果用(今回は使用せず)

##### 画像をアイコンにする #####
icon = CustomIcon(
    icon_image = img,
    icon_size = (50, 50),
    icon_anchor = (30, 30),
    #shadow_image = shadow_img, # 影効果(今回は使用せず コメントアウト
    #shadow_size = (30, 30),
    #shadow_anchor = (-4, -40),
    popup_anchor = (3, 3)
)



##### 実行 #####

#--- 地図オブジェクト作成
# 地図中心座標(長崎県庁)
latlong = [32.750336, 129.867908]
# 地図を描画する
map = folium.Map(location=latlong, zoom_start=15)

#--- 地図に自作アイコンを載せる
# アイコンの座標(出島)
icon_latlng = [32.743503, 129.872952]
# アイコンを追加
folium.Marker(
    location = icon_latlng,
    popup = '出島',
    tooltip = '長崎',
    icon = icon
).add_to(map)

# 地図をhtmlファイルで保存
map.save('custom_icon_test.html')

# 地図をJupyter上に表示
map
    

f:id:chayarokurokuro:20210711173756j:plain

↑般若が表示されました。成功。👏



↓ アイコンカーソルを乗せるとtooltip='長崎'が、アイコンをクリックするとpopup='出島'が表示された。👏 ↓

f:id:chayarokurokuro:20210711174122j:plain



追加
もうひとつ作った。

f:id:chayarokurokuro:20210711234238j:plain



コードの説明

foliumで1度は地図作成をやったことがある方向け書きます。
簡単な作成方法については最後のほうに過去の投稿をリンクしておきます。

foliumのインストール方法

foliumで地図作成をしますのでライブラリのインストールが必要です。

# pip の場合
$ pip install folium

# conda の場合
$ conda install -c conda-forge folium

Anaconda folium 参考:
Folium :: Anaconda.org
condaでインストールしたらbrancaという依存ライブラリもインストールされました。



実行時の注意
foliumJavaScriptleafletという地図作成ライブラリのPythonラッパーです。foliumで地図を作成すると地図オブジェクト<folium.folium.Map object>(htmlコード)が生成されますが、そのhtmlにはleafletのjsファイルやcssファイル、基板になっている地図画像や設置アイコン等をインターネット上のサーバから読み込みブラウザに地図を表示する、という仕掛けになっています。
したがって、オフライン状態で実行すると地図が表示されません。



コードを上から順にざっくり説明します。

アイコン用画像の用意

今回は透過性の入った般若のpng画像を使っています。サイズは何でも構いません。このあとで設定します。
透過性になっていないと四角い画像のアイコンになります。
アイコンの影の効果を出せるようになっていて、別の画像を用意すればできます。今回は省略。

画像パスはローカルに保存したパスを指定していますが、地図をブログに貼ったりする場合は画像パスが見つからないはずなので、あらかじめネットにアップロードしたうえで、そのURLを指定します。



イコン画像のサイズや設置の設定

icon = CustomIcon()の中で自作アイコンのサイズや設置の設定をしています。
sizeanchorの指定は色々試してみてください。 (← いろいろ試してない言い訳



地図オブジェクト作成

ここは普段通りです。map = folium.Map()でマップオブジェクトを作成する。
地図の中心座標やアイコンの設置座標は前もって調べておく必要があります。
参考: 座標の検索は「geocoding.jp」などで住所や場所名、建物の名前などを検索するとサクッと座標(緯度と経度)が取得できます。



地図オブジェクトに自作アイコンを設置・追加

folium.Marker(引数).add_to(map)の引数で、iconを自作アイコン(icon = CustomIcon()で作った)に置換すればOKです。
popupはアイコンをクリックしたときに表示されるテキストを与えます。不必要ならpopup=None(デフォルト)。
tooltipはアイコンにマウスのカーソルを当てたときに表示されるテキストを指定します。オプショナルです。不必要なら書く必要ありません。

参考



↓これはPythonじゃなくてJavaScriptのleafletのサイトですが、バラのカスタム・アイコンが刺さっている。可愛らしい。



Windowsに標準装備のペイント3Dで透過性画像を作成する方法。


こんな機能があったとは…OpenCVの対話式GrabCutで前景抽出するやつと同じ。



おわりに

意外とかんたん。アイコンの画像を準備さえすれば独自の地図ができそうです。



以上です。