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

使用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对应的正确字段名,可通过两种方式:

  1. 下载GeoJSON文件后用文本编辑器打开,查看任意feature下的properties节点,里面的键就是可用属性名(比如该数据源里的郡名称为CTY19NM,行政区代码为CTY19CD)。
  2. 在代码中加载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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:54:58