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

Python folium绘制地图报错key_on 'cp' not found in GeoJSON

报错原因

folium.Choropleth 组件的key_on参数需要填写字段在GeoJSON结构中的完整访问路径,而非直接写字段名。
当你传入GeoPandas的GeoDataFrame对象时,Folium会自动将其转换为标准GeoJSON格式,所有业务属性字段都会存放在每个地理要素的properties节点下,直接写key_on='cp'会从GeoJSON根节点查找字段,自然触发找不到字段的报错。

修复方法

最小改动方案

仅修改key_on参数的取值,指向GeoJSON属性节点下的cp字段即可,修改后可直接运行:

import pandas as pd
import geopandas as gpd
import folium

df_postcode_variable = pd.read_csv("postcode_sample.csv", dtype=str)
df_postcode_variable['people'] = df_postcode_variable['people'].astype(float)
df_polygons = gpd.read_file("postcode_polygons.shp")
df_polygons.crs = "EPSG:4326"

my_map = folium.Map(location=[41.3890727,2.1572654], zoom_start=13,
                   detect_retina=True, control_scale=False)

folium.Choropleth(
        geo_data=df_polygons,
        name='choropleth',
        data=df_postcode_variable,
        columns=['cp','people'],
        key_on='feature.properties.cp', # 修正为GeoJSON属性的完整路径
        fill_color='OrRd',
        fill_opacity=0.5,
        line_opacity=0.8,
        line_color='Blue',
        legend_name='number of people'
    ).add_to(my_map)

my_map

稳妥方案(对齐Bokeh实现逻辑)

参考你能正常运行的Bokeh实现逻辑,先把地理面数据和邮编指标数据按cp字段合并,再传入绘图组件,这种方式可以提前排查字段类型不匹配、邮编值不统一的问题,避免绘图时出现匹配异常:

import pandas as pd
import geopandas as gpd
import folium

df_postcode_variable = pd.read_csv("postcode_sample.csv", dtype=str)
df_postcode_variable['people'] = df_postcode_variable['people'].astype(float)
df_polygons = gpd.read_file("postcode_polygons.shp")
df_polygons.crs = "EPSG:4326"
# 提前关联两个数据集
df_joined = df_polygons.merge(df_postcode_variable, on='cp')

my_map = folium.Map(location=[41.3890727,2.1572654], zoom_start=13,
                   detect_retina=True, control_scale=False)

folium.Choropleth(
        geo_data=df_joined,
        name='choropleth',
        data=df_joined,
        columns=['cp','people'],
        key_on='feature.properties.cp',
        fill_color='OrRd',
        fill_opacity=0.5,
        line_opacity=0.8,
        line_color='Blue',
        legend_name='number of people'
    ).add_to(my_map)

# 可选添加图层开关
folium.LayerControl().add_to(my_map)
my_map
排错提示

如果修改参数后仍存在匹配问题,优先检查两点:

  • 两个数据集的cp字段数据类型是否一致,比如一边是字符串格式的邮编、一边是数字格式,会导致关联失败
  • 可以打印df_polygons.__geo_interface__查看转换后的GeoJSON实际结构,确认字段路径和名称是否正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:18:26