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

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参数时会引发解析错误。删除面积相关代码后使用无空值的原始数据可以正常渲染,也验证了该问题。
修复方案

按如下步骤修改代码即可解决报错:

  1. 修正投影转换的赋值逻辑,确保转换结果生效:
# 原代码的 prov1.to_crs(epsg=4326) 修改为
prov1 = prov1.to_crs(epsg=4326)
  1. 修正key_on参数的拼写错误:
key_on='feature.id'
  1. 优化数据合并逻辑,清理空值:
    优先使用公共唯一字段(如行政编码、省份名称)合并数据,避免索引对齐问题,同时删除密度为空的无效行:
# 示例:假设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'])
  1. (可选优化)简化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:09:03