Python Folium绘制分级统计图出现missing geometries错误如何解决?
问题描述
用户使用如下来源的国家GeoJSON数据:
country_geodf = gpd.read_file("https://datahub.io/core/geo-countries/r/countries.geojson")
将其与Kaggle 2021年机器学习与数据科学调研数据结合,用Folium绘制分级统计地图时,遇到无法处理缺失几何数据的报错,Folium本身支持处理普通缺失值,但不支持缺失几何数据的渲染。
问题原因
你遇到的Cannot render objects with any missing geometries报错,核心原因不是真的存在缺失的几何数据,而是Folium对直接传入的GeoDataFrame格式兼容性不好,再加上参数配置错误导致的。
解决方案
步骤1:清理无效数据
在完成GeoJSON和调研数据的合并后,先过滤掉存在空几何、空ISO3编码的无效行:
# 合并完成后执行清理 country_df = country_df.dropna(subset=['geometry', 'ISO_A3'])
步骤2:修正Choropleth配置
你现在的配置有三个错误:
Highlight参数首字母大写不符合规范,应该改为小写highlight- 直接传GeoDataFrame给
geo_data兼容性差,需要先转成GeoJSON字典 - 用国名做关联键容易出现拼写不匹配的问题,改用ISO3编码做关联更稳妥
修正后的代码如下:
country_map = folium.Map(location=[40, 0], zoom_start=1.5) # 先转成GeoJSON字典 country_geojson = country_df.to_json() Choropleth( geo_data=country_geojson, data=country_df, columns=['ISO_A3',"Q3"], key_on="feature.properties.ISO_A3", fill_color='YlOrRd', fill_opacity=1, line_opacity=0.2, legend_name="响应占比", smooth_factor=0, highlight= True, bins=3, line_color = "#0000", name = "响应占比", show=True, overlay=True, nan_fill_color = "White" ).add_to(country_map)
步骤3:修正 hover 组件的传参
后续的GeoJson组件也要用转换好的GeoJSON字典,不要直接传入GeoDataFrame:
# 其余样式、高亮函数的代码保持不变 NIL = GeoJson( data = country_geojson, style_function=style_function, control=False, highlight_function=highlight_function, tooltip=GeoJsonTooltip( fields=['ADMIN',"Q3"], aliases=['国家名称',"响应占比(%)"], style=("background-color: white; color: #333333; font-family: arial; font-size: 12px; padding: 10px;") ) ) country_map.add_child(NIL) country_map.keep_in_front(NIL)
可选校验步骤
如果修改完还有问题,可以先校验国家编码的匹配度:
# 查看GeoJSON和调研数据的ISO3编码差异 geo_iso = set(country_geodf['ISO_A3'].unique()) survey_iso = set(country_codes.values()) # 输出调研数据里有、GeoJSON里没有的编码 print(survey_iso - geo_iso)
如果有不一致的编码,可以手动做映射修正即可。
内容的提问来源于stack exchange,提问作者Kayvan Shah
相关产品推荐
相关产品推荐

