さて、前回は地名や住所から緯度経度を取得出来るようになったから、これを利用して地図を表示してみようか
よろしくお願いします!
今回も簡易的にWebアプリにできる「streamlit」を使うけど、「streamlit」だけでは地図を表示するのはちょっと難しいから、今回は「folium」っていうライブラリも一緒に使っていくよ
pip install streamlit folium streamlit-folium
あれ?なんか似たような名前のライブラリを入れるんだね?
「folium」はPythonで簡単に地図を扱えるライブラリで、「streamlit-folium」はそれをstreamlitと連携させるためのライブラリになるよ
もし、streamlit以外の方法でGUIを作る時は、「folium」だけで扱えるよ
なるほど!そしたら、例えばデスクトップアプリで地図を使いたい時は「folium」だけでいいんだね!
そゆこと
そしたら早速、地図を表示してみようか!
importの追加を忘れないようにね!!
from geopy.geocoders import Nominatim
import streamlit as st
import folium
from streamlit_folium import st_folium
# 土地名から緯度経度の取得
def get_coordinates(address):
geolocator = Nominatim(user_agent="my_geocoding_app")
geocoder_result = geolocator.geocode(address, timeout=5.0)
try:
return float(geocoder_result.latitude), float(geocoder_result.longitude)
except Exception as e:
print(f"接続エラー: {e}")
return None, None
# 例: スカイツリーの緯度経度を取得して地図を表示
lat, lon = get_coordinates("スカイツリー")
m = folium.Map(location=[lat, lon], zoom_start=15)
st_folium(m, width=700, height=500, returned_objects=[])
前回のプログラムにたった3行追加するだけで地図が表示できるんだね!
ここからはstreamlitで起動する方法にしないといけない点に気を付けてね
streamlit run プログラム名.py
おおー!表示された!
ちなみにこの地図もOpenStreetMapを利用してるよ
さて、無事に地図の表示方法も分かったことだし、次は何が出来たら良いと思う?
それはやっぱり、地名を入力したらその場所の地図が表示される機能じゃない?
そうだね!じゃあその機能を追加しよう!今回は「st.form」っていうのを使って入力中に余計な更新が入らないようにするよ
# メイン部分のプログラムを以下に書き換えよう
# 1. st.form を使って、入力中の勝手な更新を防ぐ
with st.form("search_form"):
target_place = st.text_input("調べたい場所を入力してください", "渋谷駅")
submitted = st.form_submit_button("検索する")
# 2. ボタンが押された時に検索を実行し、結果を session_state に保存する
if submitted:
if target_place:
with st.spinner("検索中..."):
lat, lon = get_coordinates(target_place)
if lat and lon:
m = folium.Map(location=[lat, lon], zoom_start=15)
st_folium(m, width=700, height=500, returned_objects=[])
else:
st.error("指定された場所が見つかりませんでした。")
else:
st.error("場所を入力してください。")
ちゃんと入力したら地図が変化した!
バッチリだね!じゃあ次回は、この地図に飲食店の情報を載せていく方法にチャレンジしてみよう!!
