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对象。
修复方案
按以下步骤修改代码即可:
- 完成数据合并后,将带几何字段的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
- 修改绘图代码的
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
相关产品推荐
相关产品推荐

