You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:28:15