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
相关产品推荐
相关产品推荐

