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
相关产品推荐
相关产品推荐

