如何使用GeoPandas批量合并同结构GeoJSON空间文件?
批量合并GeoJSON到单一GeoDataFrame(整合属性列)
问题分析
你需要合并的是同区域、多属性的GeoJSON文件,核心需求是按共享的普查区ID(Geo列)整合所有属性,仅保留一份几何信息。之前的方法错误在于用了行堆叠(append/concat)或不合适的合并键(geometry),导致重复行、属性丢失等问题。
正确实现代码
import os import geopandas as gpd # 指向目录中的文件 inputs_path = "你的路径" # 替换为实际路径 files = os.listdir(inputs_path) files_mo_geojson = [f for f in files if f.endswith('MO.geojson')] # 初始化:读取第一个文件作为基础(保留几何列) gdf_mo = gpd.read_file(os.path.join(inputs_path, files_mo_geojson[0])) # 遍历剩余文件,按Geo列合并属性 for file in files_mo_geojson[1:]: temp_gdf = gpd.read_file(os.path.join(inputs_path, file)) # 合并时去掉临时文件的几何列,避免重复;按Geo列关联 gdf_mo = gdf_mo.merge( temp_gdf.drop(columns="geometry"), on="Geo", how="inner" # 若需保留所有普查区(含缺失属性的),改为how="outer" ) # 查看结果 print(gdf_mo.columns)
之前方法的问题说明
- 方法1:
append是行堆叠操作,会把每个文件的所有行重复添加,导致同一普查区多次出现、索引重复,完全不符合"整合属性列"的需求。 - 方法2:每次
concat后没有赋值给gdf_mo,原变量始终是空的GeoDataFrame,相当于未执行有效合并。 - 方法3:
append+dissolve会将所有行堆叠后按label聚合求和,但你的属性是不同指标(不同员工规模的企业数),并非同一指标的重复值,聚合后会错误合并数据。 - 方法4:用
geometry作为合并键存在浮点数精度问题,容易导致匹配失败;且初始空GeoDataFrame第一次合并后,后续文件可能因匹配不上而无法整合属性。
注意事项
- 确保所有文件的
Geo列值完全一致(无格式差异、空格等),否则会出现匹配失败。 - 若部分普查区在某些文件中缺失,使用
how="outer"可保留这些区域,缺失的属性会填充为NaN。 - 检查各文件的属性列名是否唯一,避免合并后出现
xxx_x/xxx_y的重复列名(你的文件名对应不同属性,应该不存在这个问题)。
内容的提问来源于stack exchange,提问作者Nora Anzawi
相关产品推荐
相关产品推荐

