如何解决Streamlit交互时Leafmap频繁刷新的问题?
解决Streamlit中Leafmap地图随交互频繁刷新的问题
问题根源
Streamlit的运行机制是每次用户交互(点击按钮、勾选复选框等)都会重新执行整个脚本,你的代码里每次都会重新创建Leafmap地图实例并调用to_streamlit(),这就导致地图每次都被重新渲染,出现频繁刷新的问题。
解决方案:用session_state缓存地图实例
通过Streamlit的st.session_state缓存地图对象,只在用户会话第一次加载时初始化地图,后续交互复用已创建的实例,避免重复渲染。
修改后的代码示例
import streamlit as st import leafmap.foliumap as leafmap st.set_page_config( page_title=None, page_icon=None, layout="wide", initial_sidebar_state="auto", ) st.html( """ <style> header {visibility: hidden;} footer {visibility: hidden;} .block-container { padding: 0 !important; margin: 0 !important; max-width: 100% !important; width: 100% !important; } .main { padding: 0 !important; margin: 0 !important; } .css-1aumxhk { margin-top: 0 !important; } iframe { height: 100vh; display: block; } </style> """ ) # 缓存地图实例,仅在会话首次加载时创建 if 'map' not in st.session_state: st.session_state.map = leafmap.Map(center=[-0.1807, -78.4678], zoom=7) # 渲染缓存的地图 st.session_state.map.to_streamlit() for i, variable in enumerate(st.session_state.variables_seleccionadas): col1, col2 = st.sidebar.columns([4, 1]) with col1: st.subheader(f"{alias_variables[variable]}") with col2: if st.button("🗑️", key=f"eliminar_{variable}", help="Eliminar esta variable"): st.session_state.variables_seleccionadas.remove(variable) st.session_state.selecciones.pop(variable, None) st.rerun() modelos = [] for modelo in variables_modelos[variable]: help_message = descripciones_modelos.get(modelo) if st.sidebar.checkbox( alias_modelos[modelo], key=f"{variable}_{modelo}", help=help_message ): modelos.append(modelo) st.session_state.selecciones[variable] = modelos st.sidebar.markdown("<div style='margin-bottom: 1px;margin-top: 0px;'></div>", unsafe_allow_html=True)
额外说明
如果后续需要动态更新地图内容(比如添加/移除图层),直接操作st.session_state.map实例即可,比如:
# 示例:添加图层到缓存的地图 st.session_state.map.add_layer(your_layer)
这样地图只会在图层变更时更新,不会随无关交互刷新。
内容的提问来源于stack exchange,提问作者Miguel Angel Gonzalez Cueva
相关产品推荐
相关产品推荐

