使用Folium制作英国城市Choropleth地图遇NameError问题求助
解决英国城市Choropleth地图的NameError及代码问题
一、修复NameError: name 'cty19nm' is not defined错误
这个错误是因为你未加载GeoJSON数据就直接使用了cty19nm变量,解决方法如下:
- 直接将GeoJSON的访问URL传入
geo_data参数,无需手动下载文件;也可以下载GeoJSON到本地后用json.load()加载,再传入参数。
示例修正代码:
import folium import requests # 英国2019年郡边界的GeoJSON直接访问链接 geo_json_url = "https://services.arcgis.com/ESMARspQHYMw9BZ9/arcgis/rest/services/Counties_December_2019_Boundaries_UK_BFC/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson" # 调整地图中心到英国区域,适配英国范围的缩放级别 venue_map = folium.Map(location=[54.5, -3], zoom_start=6) folium.Choropleth( geo_data=geo_json_url, data=data_to_plot1, columns=["city", "xg"], key_on='feature.properties.CTY19NM', # 对应GeoJSON里的郡名称字段 fill_color='YlOrBr', fill_opacity=0.6, line_opacity=0.1, legend_name="Expected Goals per city" ).add_to(venue_map) folium.LayerControl().add_to(venue_map) venue_map
如何确认GeoJSON的属性名称
要找到key_on对应的正确字段名,可通过两种方式:
- 下载GeoJSON文件后用文本编辑器打开,查看任意
feature下的properties节点,里面的键就是可用属性名(比如该数据源里的郡名称为CTY19NM,行政区代码为CTY19CD)。 - 在代码中加载GeoJSON后打印一个feature的properties查看:
import json import requests response = requests.get(geo_json_url) geo_data = json.loads(response.text) print(geo_data['features'][0]['properties'])
二、代码的其他潜在问题
- 地图中心坐标错误:原代码里
[20,78]是印度区域的坐标,英国中心大致在[54.5, -3],必须调整该参数才能正常显示英国地图。 key_on字段不匹配:你原代码写的st_nm并非该GeoJSON中的字段,会导致数据无法关联,需改为实际存在的属性名(比如CTY19NM)。- 数据匹配一致性:确保
data_to_plot1中city列的内容和GeoJSON里CTY19NM的字段值完全一致(包括大小写、空格、拼写),比如不要把"Greater London"写成"greater london",否则无法正确渲染颜色。
内容的提问来源于stack exchange,提问作者Ashley
相关产品推荐
相关产品推荐

