こんにちは、JS2IIUです。
Streamlitを使えば簡単に、地図をインタラクティブに表示することができます。 st.pydeck_chart()を使えば、PyDeckの豊富な機能をStreamlitアプリケーションに簡単に組み込むことができます。この記事では、st.pydeck_chart()の基本的な使い方から、具体的なサンプルプログラムまでご紹介します。今回もよろしくお願いします。

st.pydeck_chart()でできること
st.pydeck_chart()は、StreamlitアプリケーションにPyDeckの地図を埋め込むための関数です。PyDeckは、WebGLを活用した高性能な地図描画ライブラリであり、3Dマップ、ポイントクラウド、ヒートマップなど、様々な表現力豊かな地図を作成することができます。
st.pydeck_chart()を使うことで、以下のようなことができます。
- 地図上にマーカーやポリゴン、ラインなどを表示する。
- 地図を3Dで表示し、回転やズームなどの操作をインタラクティブに行う。
- データに基づいて地図上にヒートマップやポイントクラウドを表示する。
- 地図上にアニメーションを表示する。
- 地図上のオブジェクトを選択し、Streamlitアプリケーションと連携する。
PyDeckについてはこちらを参考にして下さい。
st.pydeck_chart()の使い方
st.pydeck_chart()関数のシグネチャとパラメータは以下の通りです。
st.pydeck_chart(pydeck_obj=None, *, use_container_width=False, width=None, height=None, selection_mode="single-object", on_select="ignore", key=None)pydeck_obj: PyDeckのDeckオブジェクトを指定します。use_container_width: チャートの幅をコンテナの幅に合わせるかを指定します。Trueに設定すると、チャートの幅がコンテナの幅に合わせられます。デフォルトはFalseです。width: チャートの幅をピクセルで指定します。use_container_widthがTrueの場合は無視されます。height: チャートの高さをピクセルで指定します。selection_mode: 地図上のオブジェクトの選択モードを指定します。"single-object"(単一選択)、"multi-object"(複数選択)、"none"(選択不可) から選択できます。デフォルトは"single-object"です。on_select: オブジェクトが選択されたときに実行するコールバック関数を指定します。"ignore"(無視)、"callback"(コールバック関数を実行) から選択できます。デフォルトは"ignore"です。key: ウィジェットの識別子となる文字列を指定します。
もしpydeckがインストールされていない場合は、pip install pydeckでインストールしておいて下さい。インストールされているかどうかの確認はpip freezeコマンドの出力を見て下さい。
サンプルプログラム
それでは、st.pydeck_chart()を使ったサンプルプログラムを見てみましょう。このプログラムでは、日本の地図上に、我が家の最寄り空港である名古屋空港(NKM)から出発するFDA(フジドリームエアラインズ)の就航地をArcLayerで表示します。
各空港の緯度経度情報は生成AIで作っていますので、正確でないことをご承知おき下さい。
import streamlit as st
import pydeck
# Define a layer with ArcLayer
# https://deckgl.readthedocs.io/en/latest/gallery/arc_layer.html
layer = pydeck.Layer(
"ArcLayer",
data=[
{"origin": [136.891667, 35.166667], "destination": [140.715,40.781111]}, # NKM -> AOM
{"origin": [136.891667, 35.166667], "destination": [140.371111,38.401944]}, # NKM -> FKS
{"origin": [136.891667, 35.166667], "destination": [139.043889,37.901111]}, # NKM -> HND
{"origin": [136.891667, 35.166667], "destination": [133.313889,35.443333]}, # NKM -> TAK
{"origin": [136.891667, 35.166667], "destination": [134.223889,35.526111]}, # NKM -> KCZ
{"origin": [136.891667, 35.166667], "destination": [132.763889,35.378889]}, # NKM -> MYJ
{"origin": [136.891667, 35.166667], "destination": [133.613889,33.558333]}, # NKM -> KMI
{"origin": [136.891667, 35.166667], "destination": [130.45,33.583333]}, # NKM -> KOJ
{"origin": [136.891667, 35.166667], "destination": [130.735,32.801111]}, # NKM -> OIT
],
get_source_position="origin",
get_target_position="destination",
get_source_color=[255, 255, 140], # yellow
get_target_color=[255, 165, 0], # orange
auto_highlight=True,
pickable=True,
radius=100,
width_scale=0.00001,
width_min_pixels=1,
width_max_pixels=3,
)
# Set the viewport location
view_state = pydeck.ViewState(
latitude=36,
longitude=136.0,
zoom=4.5,
bearing=0,
pitch=40,
)
# Render
r = pydeck.Deck(layers=[layer], initial_view_state=view_state)
st.header('FDA destinations from NKM')
st.pydeck_chart(r)サンプルプログラムの解説
このプログラムでは、まずpydeck.Layerを使ってArcLayerを定義しています。dataには、出発地(origin)と目的地(destination)の緯度経度を指定します。get_source_colorとget_target_colorで、それぞれ出発地と目的地のマーカーの色を指定しています。
pydeck.ViewStateでは、地図の初期表示位置を設定しています。latitudeとlongitudeで中心座標を、zoomでズームレベルを指定します。どれぐらいのズームレベルにするかは実際に表示させてみてから決めていきます。
最後に、pydeck.DeckでレイヤーとViewStateを組み合わせて地図を作成し、st.pydeck_chart()でStreamlitアプリケーションに表示しています。
地図上のオブジェクトを選択する
st.pydeck_chart()では、selection_modeとon_selectパラメータを使って、地図上のオブジェクトを選択し、その情報にアクセスすることができます。
例えば、selection_mode="single-object"、on_select="callback"と設定し、以下のようなコールバック関数を定義することで、選択されたオブジェクトの情報を取得することができます。
def on_select_callback(selected_objects):
if selected_objects:
st.write(f"選択されたオブジェクト: {selected_objects}")
st.pydeck_chart(r, selection_mode="single-object", on_select="callback")参考になるWEBサイト
ぜひst.pydeck_chart()を使って、インタラクティブな地図をStreamlitアプリケーションに組み込んでみてください!
Pythonに関する書籍の<PR>です。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。
最後まで読んでいただきありがとうございました。


コメント