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

如何加速Streamlit中集成的Folium地图加载速度?

Streamlit + Folium 地图加载速度优化方案

以下是针对Streamlit中使用streamlit_folium切换地图时加载缓慢的具体优化方法:

  • 缓存地图生成逻辑:利用Streamlit的@st.cache_data装饰器缓存地图生成结果,避免用户切换选项时重复执行耗时的渲染逻辑。相同选择下直接复用已生成的地图对象,大幅减少重复计算:

    import streamlit as st
    import folium
    from streamlit_folium import folium_static
    
    @st.cache_data(show_spinner=False)
    def generate_map(selected_option):
        # 根据用户选择初始化地图
        m = folium.Map(location=[45.5236, -122.6750], zoom_start=13)
        # 添加对应选项的图层、标记等内容
        if selected_option == "选项1":
            folium.Marker([45.5236, -122.6750], popup="点位1").add_to(m)
        elif selected_option == "选项2":
            folium.CircleMarker([45.5336, -122.6850], radius=10, color="red").add_to(m)
        return m
    
    # 用户选择组件
    selected = st.selectbox("选择地图内容", ["选项1", "选项2"])
    # 获取缓存的地图对象
    map_obj = generate_map(selected)
    # 渲染地图
    folium_static(map_obj)
    

    注:若地图依赖实时更新的数据,可通过ttl参数设置缓存过期时间,或用hash_funcs处理不可哈希的自定义对象。

  • 精简地图元素数量:避免一次性加载过多标记、多边形或图层,仅渲染当前选项所需内容:

    • 用folium.FeatureGroup批量管理元素,减少DOM节点数量
    • 移除不必要的默认控件(如control_scale=False关闭缩放比例尺)
    # 批量添加标记到FeatureGroup
    fg = folium.FeatureGroup(name="批量点位")
    # 仅加载当前选项过滤后的坐标数据
    for coord in filtered_coords:
        folium.Marker(coord).add_to(fg)
    fg.add_to(m)
    # 初始化地图时关闭不必要控件
    m = folium.Map(location=[45.5236, -122.6750], zoom_start=13, control_scale=False)
    
  • 优化底图与渲染参数:

    • 选择轻量化底图,如tiles='Stamen Terrain'或tiles='OpenStreetMap'(部分高清商用底图加载耗时更长)
    • 调用folium_static时设置合理的width和height,避免渲染过大尺寸的地图:
      folium_static(map_obj, width=800, height=600)
      
  • 静态地图替代(无交互需求场景):若不需要Folium的交互功能,可将地图转为静态图片后渲染,加载速度会显著提升:

    from PIL import Image
    import io
    
    @st.cache_data
    def convert_map_to_image(map_obj):
        img_bytes = map_obj._to_png()
        return Image.open(io.BytesIO(img_bytes))
    
    st.image(convert_map_to_image(map_obj))
    
  • 缓存前置数据处理:若地图内容依赖大量数据过滤、计算,先缓存处理后的数据集,再传入地图生成函数,避免重复执行数据逻辑:

    @st.cache_data
    def get_processed_data(selected_option):
        # 耗时的数据过滤、转换逻辑
        return processed_data
    
    filtered_data = get_processed_data(selected)
    map_obj = generate_map(filtered_data)
    

内容的提问来源于stack exchange,提问作者Mahfoud B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:15:35