我正在编写一个网络应用程序,用户单击地图,纬度、经度将返回到 python 脚本。网络应用程序是在streamlit上编写的,对于地图我使用folium。目前,我使用 folium.LatLngPopup() 来获取单击位置的点击经纬度,但我很困惑如何检索 python 脚本中的值以进行进一步处理。
这是目前的样子:
#代码片段
import streamlit as st
from streamlit_folium import folium_static
import folium
m = folium.Map()
m.add_child(folium.LatLngPopup())
folium_static(m)
可能没有本地解决方案,但任何解决方法将不胜感激!
如果您可以直接使用该值而不是对其进行赋值,则可以仅使用
map['last_clicked']['lat']
和 map['last_clicked']['lng']
(其中 map
已定义)。例如,在这里我只打印每个位置的纬度/经度,但不只是返回它们,在函数中您可以执行任何您需要的操作:
import folium as fl
from streamlit_folium import st_folium
import streamlit as st
def get_pos(lat,lng):
return lat,lng
m = fl.Map()
m.add_child(fl.LatLngPopup())
map = st_folium(m, height=350, width=700)
data = get_pos(map['last_clicked']['lat'],map['last_clicked']['lng'])
if data is not None:
st.write(data)
我最近遇到了同样的问题,获取纬度和经度,然后打印它或将值保存到变量中。显然,我发现通常的streamlit是静态的,因为我尝试创建一个streamlit.button,如果单击该按钮,应该将1添加到变量计数器。结果:无论我点击了多少次,变量计数器都打印为 1。
为了能够接受输入,streamlit 组件应该是“双向”的。 我可能无法清楚地解释它,因为我在 python 或 javascript 中仍然是新手,但简而言之,它应该监听值的变化。 解决方案是创建双向组件,后来我发现了这个很棒的存储库
streamlit-light-leaflet。要运行它,只需按照 README.md 进行操作即可。假设您已经在虚拟环境中安装了streamlit,请执行npm install
和
npm run start
。然后在不同的终端/命令行中运行“streamlit run file.py
”。单击运行 Streamlit 的终端中的 URL。如果地图未显示,请前往my_component/frontend/src/index.tsx
并输入您的mapbox.com accessToken。要获取 accessToken,您应该首先注册 mapbox.com。最佳实践是使用
.env
并从那里调用您的 Mapbox accessToken,以保持代码简洁。# my_app.py
import folium as fl
from streamlit_folium import st_folium
import streamlit as st
def get_pos(lat, lng):
return lat, lng
m = fl.Map()
m.add_child(fl.LatLngPopup())
map = st_folium(m, height=350, width=700)
data = None
if map.get("last_clicked"):
data = get_pos(map["last_clicked"]["lat"], map["last_clicked"]["lng"])
if data is not None:
st.write(data) # Writes to the app
print(data) # Writes to terminal
运行它:
streamlit run my_app.py