Geopandas绘制Choropleth地图时__geo_interface__报错如何解决?
报错原因
- 投影转换未生效:Geopandas的
to_crs()方法默认返回新的GeoDataFrame对象,不会修改原变量。代码中prov1.to_crs(epsg=4326)没有将转换结果赋值回prov1,后续调用prov1['geometry'].__geo_interface__时,使用的仍是EPSG:32654投影的几何数据,不符合Folium要求的WGS84(EPSG:4326)投影规范,导致解析失败返回空值。 - 关联参数拼写错误:
key_on参数值写为featur.id存在拼写错误,正确值应为feature.id,Folium无法匹配几何数据和属性数据的关联键,也会触发空值读取错误。 - 密度列存在空值:通过
penduduk.join(area_sqkm)合并数据时,如果penduduk和prov1的索引没有完全对齐,会导致stats['density']列生成NaN空值,空值传入Choropleth的data参数时会引发解析错误。删除面积相关代码后使用无空值的原始数据可以正常渲染,也验证了该问题。
修复方案
按如下步骤修改代码即可解决报错:
- 修正投影转换的赋值逻辑,确保转换结果生效:
# 原代码的 prov1.to_crs(epsg=4326) 修改为 prov1 = prov1.to_crs(epsg=4326)
- 修正
key_on参数的拼写错误:
key_on='feature.id'
- 优化数据合并逻辑,清理空值:
优先使用公共唯一字段(如行政编码、省份名称)合并数据,避免索引对齐问题,同时删除密度为空的无效行:
# 示例:假设prov1和penduduk都有公共字段adcode(行政编码),用merge替代join更稳妥 stats = penduduk.merge(prov1[['adcode']], on='adcode', how='left') stats['density'] = stats["density_2019"] / stats["area_sqkm"] # 清理密度为空的无效行 stats = stats.dropna(subset=['density'])
- (可选优化)简化Choropleth参数传入,提升稳定性:
Folium支持直接传入GeoDataFrame作为geo_data参数,不用手动调用__geo_interface__,同时明确指定关联字段更稳妥:
Choropleth( geo_data=prov1, data=stats, # 第一个元素为关联字段,第二个为数值字段 columns=['adcode', 'density'], # 对应geo数据属性中的关联字段 key_on='feature.properties.adcode', fill_color='YlGnBu', legend_name='2019年人口密度(人/平方公里)' ).add_to(map1)
内容的提问来源于stack exchange,提问作者isfanafely
相关产品推荐
相关产品推荐

