python | 实现批量csv文件转shp

文摘   2024-06-26 10:59   北京  

LXX

读完需要

3
分钟

速读仅需 1 分钟

前言:

如果我有一些包含地理注释信息(纬度和经度数据列)的 csv 数据。为了使用这些文件中的信息进行某些地理处理,可能需要将它们从 .csv 转换为 .shp 文件。ArcGIS 和 QGIS 等 GIS 软件可以实现此功能,但需要一次执行一个文件。因此本文介绍使用 python 进行批量 csv 转 shp。


希望各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)


1

   

shp 文件介绍

SHP(Shapefile)是一种常用的 GIS 数据格式,是由 ESRI(环境科学研究所)设计的一种矢量数据格式,可用于存储和编辑各种地理信息数据,如点、线、面等。SHP 文件是一种基于二进制的格式,包含了地理实体的几何信息和属性信息。

适用场景:

SHP 格式适用于小规模和中规模的矢量数据处理,并且易于在不同的 GIS 软件和平台之间进行转换和共享。在大规模数据处理和三维数据方面可能存在一定的局限性。

优势:SHP 格式是一种二进制文件格式,易于读取和使用。它也容易转换成其他格式的文件。SHP 文件可以方便地进行编辑,包括添加、删除和修改矢量数据等。

缺点:SHP 文件在处理大规模的数据时可能会遇到文件大小限制的问题。同时 SHP 格式也不支持三维数据的存储和显示。


2

   

csv 转 shp 方法

将 CSV 文件转换为 Shapefile(SHP)是一个常见的地理数据处理任务,可以通过多种方法实现,包括使用 ArcGIS Pro 软件或 Python 编程。以下是两种主要方法的概述:

2.1

   

使用 ArcGIS 或 ArcGIS Pro 软件:

首先,确保已经安装了 ArcGIS Pro 软件,并且有一个包含点坐标信息和属性数据的 CSV 文件。

启动 ArcGIS Pro,打开一个新的项目或现有项目。

在“Catalog”面板中,添加包含 CSV 文件的文件夹连接,并将 CSV 文件拖动到地图中以创建一个新的点图层。

使用“Analysis” > “Tools”菜单中的“XY To Line”工具,配置输入点图层、输出线图层参数,运行工具以创建线图层。

最后,在地图中查看新创建的线图层,并在属性表中查看线图层的属性数据。

2.2

   

使用 Python 编程:

导入必要的库,如 pandas、osgeo.gdal、shapely 和 geopandas。

读取 CSV 文件,使用 pandas 的 read_csv 函数加载数据。

将 CSV 文件中的几何数据(如经纬度)转换为适合 Shapefile 文件的格式。这通常涉及到将字符串类型的几何数据(如 WKT 格式)转换为 geometry 类型。

使用 geopandas 的 GeoDataFrame 类创建一个地理数据框,设置几何列和坐标参考系统(CRS)。

最后,使用 to_file 方法将数据保存为 Shapefile 文件,指定输出文件路径和坐标参考系统(如 EPSG:4326)。


3

   

Python 实现批量 csv 转 shp 代码

# 1 导入所需库import pandas as pdfrom geopandas import GeoDataFramefrom shapely.geometry import Pointimport osimport timefrom tqdm import tqdm  # 导入进度条库
# 2 包含您的.csv文件的目录directory = r'D:\other\icesat\text\4'
# 如果不存在,则创建 'shape files' 目录output_dir = os.path.join(directory, "shape files")os.makedirs(output_dir, exist_ok=True)
# 3 逐个读取文件for file in tqdm(os.listdir(directory)): # 使用 tqdm 显示进度条 filename = os.fsdecode(file) if filename.endswith(".csv"): # 检查文件是否以 .csv 结尾 input_file = os.path.join(directory, filename) df = pd.read_csv(input_file) # 使用 pandas 读取csv文件
# 4 根据csv文件中的经纬度列创建几何元组 geometry = [Point(xy) for xy in zip(df.Longitude, df.Latitude)]
# 5 定义坐标参考系统 (CRS) crs = 'EPSG:4326' # 使用WGS84坐标系统
# 6 将 pandas DataFrame 转换为 GeoDataFrame gdf = GeoDataFrame(df, crs=crs, geometry=geometry)
# 7 保存文件到本地目标 output_filename = os.path.join(output_dir, os.path.splitext(filename)[0] + ".shp") gdf.to_file(output_filename, driver='ESRI Shapefile')
# 可选:显示处理进度 print(f"转换csv文件:{filename}-------转换shp目标文件:{os.path.basename(output_filename)}")
# 显示处理完成的时间print("数据转换完成:", time.strftime("%Y-%m-%d %H:%M:%S"))


遥感小屋
分享遥感相关文章、代码,大家一起交流,互帮互助
 最新文章