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

Streamlit应用中H3六边形统计POI不显示问题求助

排查Streamlit地图H3六边形不显示的核心要点
  • 强制检查地图输入格式:如果用原生st.map(),它仅支持带lat/lon列的普通DataFrame或标准GeoDataFrame。你手里的H3 hex ID必须先转成多边形几何:用h3.h3_to_geo_boundary(hex_id, geo_json=True)生成GeoJSON格式的边界,再封装成GeoDataFrame的geometry列,不能直接传入hex字符串。
  • 验证几何有效性:用geopandas.GeoDataFrame.is_valid批量检查多边形是否合法,无效几何(比如坐标顺序错误、自相交)会被地图组件直接忽略。可以用gdf = gdf[gdf.is_valid]过滤掉无效项。
  • 换用更兼容的地图组件:原生st.map()对复杂多边形支持很差,建议切换到streamlit-folium+folium组合,对GeoJSON和多边形的渲染稳定性高。示例代码:
    import folium
    from streamlit_folium import folium_static
    import geopandas as gpd
    import h3
    
    # 假设hex_counts是包含hex_id和count的DataFrame
    hex_counts['geometry'] = hex_counts['hex_id'].apply(lambda x: gpd.GeoPolygon(h3.h3_to_geo_boundary(x)))
    gdf = gpd.GeoDataFrame(hex_counts, crs='EPSG:4326')
    
    m = folium.Map(location=[区域中心纬度, 区域中心经度], zoom_start=11)
    folium.GeoJson(gdf).add_to(m)
    folium_static(m)
    
  • 确认坐标系一致性:确保GeoDataFrame使用WGS84(EPSG:4326)坐标系,其他坐标系(比如墨卡托)需要转换:gdf = gdf.to_crs(epsg=4326),地图组件几乎只支持WGS84。
  • 直接输出渲染数据:把最终传给地图的GeoDataFrame用st.write(gdf)打印出来,确认geometry列不是空值、不是字符串,而是实实在在的多边形对象。

内容的提问来源于stack exchange,提问作者Vilerala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:18:10