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

Plotly绘制美国国会选区地图报MultiPolygon无法JSON序列化错误

TypeError: Object of type MultiPolygon is not JSON serializable 报错解决方案

问题背景

使用Python结合Census人口普查数据、geopandas和Plotly库绘制美国国会选区年龄中位数分级统计图时,执行绘图代码触发JSON序列化报错。

错误原因

Plotly的px.choropleth接口的geojson参数仅支持标准JSON结构的GeoJSON数据,传入的merged_data.geometry是geopandas的GeoSeries对象,其中存储的是Shapely库的MultiPolygon几何对象,Plotly内置的JSON编码器无法识别序列化这类Python对象。

修复方案

按以下步骤修改代码即可:

  1. 完成数据合并后,将带几何字段的GeoDataFrame转换为标准GeoJSON字典,并为每个几何要素添加与数据表索引匹配的id:
# 原有合并代码不变
merged_data = pd.merge(district_df, geojson_file,
                             left_on=['state_name', 'congressional district'],
                             right_on=['state_name', 'district'])

# 新增转换代码
import json
# 可选:简化几何精度,降低渲染压力,数值可按需调整
merged_data.geometry = merged_data.geometry.simplify(0.01)
# 转换为标准GeoJSON字典
merged_geojson = json.loads(merged_data.to_json())
# 为每个要素添加id,与数据表索引一一对应
for idx, feature in enumerate(merged_geojson["features"]):
    feature["id"] = idx
  1. 修改绘图代码的geojson参数,传入转换后的标准GeoJSON字典:
fig = px.choropleth(merged_data,
                    geojson=merged_geojson, # 替换原merged_data.geometry
                    locations=merged_data.index,
                    color='median_age',
                    color_continuous_scale='Viridis',
                    scope='usa',
                    projection='mercator',
                    basemap_visible=True)
# 剩余代码不变
fig.update_geos(fitbounds="locations", visible=True)
fig.update_layout(title_text='美国国会选区年龄中位数分布')
fig.show()

可选校验

执行转换前可先检查几何字段完整性,避免空值导致后续报错:

print(f"空几何记录数:{merged_data.geometry.isna().sum()}")
# 若存在空几何可直接删除
merged_data = merged_data.dropna(subset=["geometry"])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:57:03