如何遍历各CSV文件,更新多边形Shapefile属性并导出对应文件?
批量关联CSV与Shapefile并导出新Shapefile
核心实现思路
- 遍历指定目录下的所有目标CSV文件
- 读取原始多边形Shapefile作为基础空间数据
- 通过共同关联字段(如唯一ID)将每个CSV的属性与Shapefile进行关联匹配
- 为每个CSV生成一份带对应关联属性的新Shapefile,文件名与原CSV对应
前置准备
- 安装依赖工具库:
pip install geopandas pandas - 确认所有CSV文件与原始Shapefile存在唯一匹配的关联字段(比如
polygon_id,需保证字段值一一对应)
可运行代码示例
import geopandas as gpd import pandas as pd import os # 配置路径(根据实际情况修改) original_shapefile = "你的原始多边形文件.shp" csv_folder = "存放所有CSV的文件夹路径" output_folder = "新Shapefile的输出目录" # 创建输出目录(不存在则自动生成) os.makedirs(output_folder, exist_ok=True) # 读取原始Shapefile base_gdf = gpd.read_file(original_shapefile) # 遍历处理每个CSV for file_name in os.listdir(csv_folder): if file_name.lower().endswith(".csv"): csv_path = os.path.join(csv_folder, file_name) # 读取CSV数据 csv_df = pd.read_csv(csv_path) # 关联属性(这里假设关联字段为'polygon_id',根据实际字段名修改) merged_gdf = base_gdf.merge(csv_df, on="polygon_id", how="left") # 生成输出文件名 output_name = f"关联_{os.path.splitext(file_name)[0]}.shp" output_path = os.path.join(output_folder, output_name) # 导出为Shapefile merged_gdf.to_file(output_path, driver="ESRI Shapefile") print(f"已完成导出: {output_path}")
关键注意事项
- 如果CSV与Shapefile的关联字段名不同,修改
merge参数为left_on和right_on,比如:merged_gdf = base_gdf.merge(csv_df, left_on="shape_id", right_on="csv_id", how="left") how="left"会保留原始Shapefile的所有多边形,无匹配的CSV数据会填充为NaN;若只保留匹配的多边形,改为how="inner"- Shapefile对字段名长度有严格限制(最多10个字符),若CSV列名过长,建议先通过
csv_df.rename(columns={"长列名": "短列名"}, inplace=True)重命名后再关联 - 超大CSV文件可通过
pd.read_csv(csv_path, chunksize=10000)分块读取,避免内存溢出
内容的提问来源于stack exchange,提问作者Jagriti Tiwari
相关产品推荐
相关产品推荐

