如何解决geopandas加载美国人口普查TIGER shapefiles的geometry参数错误?
提问:Geopandas加载美国普查TIGER街区组文件时抛出
geometry参数缺失错误 我需要用ACS数据在街区组(block group)级别绘图,但找不到对应的geometry对象。2010年代初我曾用geopandas成功加载过美国人口普查TIGER文件,但现在无法加载,而且当前TIGER文档里也没提包含geometry列的数据表。
网上很多示例代码都能直接通过URI加载TIGER文件到geopandas,自动包含geometry列,但我运行以下代码:
import geopandas as gpd # input vars state_id = 78 year = 2020 file_type='bg' # load TIGER from URI uri = f"https://www2.census.gov/geo/tiger/TIGER{year}/{file_type.upper()}/tl_{year}_{state_id}_{file_type.lower()}.zip" example_blockgroups = gpd.read_file(uri)
会报错:
TypeError: __init__() missing 1 required keyword-only argument: 'geometry'
尝试加载其他基础TIGER文件,比如:
gpd.read_file("https://www2.census.gov/geo/tiger/TIGER2020/STATE/tl_2020_us_state.zip") gpd.read_file("https://www2.census.gov/geo/tiger/TIGER2017/STATE/tl_2017_us_state.zip") gpd.read_file("https://www2.census.gov/geo/tiger/TIGER2019/TABBLOCK/tl_2019_01_tabblock10.zip")
也出现同样的错误。
回答
核心原因与解决方法
1. 显式指定Shapefile图层
TIGER压缩包内包含多个辅助文件(.shp、.shx、.dbf等),部分情况下geopandas无法自动识别正确的shapefile图层,需手动指定layer参数,图层名称为压缩包内.shp文件的前缀(不含.shp后缀):
import geopandas as gpd state_id = 78 year = 2020 file_type='bg' uri = f"https://www2.census.gov/geo/tiger/TIGER{year}/{file_type.upper()}/tl_{year}_{state_id}_{file_type.lower()}.zip" # 匹配压缩包内的shapefile文件名 layer_name = f"tl_{year}_{state_id}_{file_type.lower()}" example_blockgroups = gpd.read_file(uri, layer=layer_name)
2. 修复Geopandas与Fiona版本兼容性
这个报错几乎都是依赖库版本不匹配导致的:
- Fiona 2.0+对空间文件读取的参数要求更严格,与旧版geopandas存在兼容性问题
- 建议锁定兼容版本:
pip install geopandas==0.12.2 fiona==1.9.4
3. 验证TIGER文件完整性
访问你构造的URI,确认压缩包能正常下载且内部包含完整的shapefile组件(缺少.shp、.shx任一文件都会导致加载失败)。若文件损坏,重新下载后再尝试。
4. 极端情况:强制指定geometry列
如果以上方法无效,可显式指定geometry列名(TIGER文件的geometry列默认名为geometry):
example_blockgroups = gpd.read_file(uri, layer=layer_name, geometry='geometry')
内容的提问来源于stack exchange,提问作者Mark_Anderson
相关产品推荐
相关产品推荐

