LXX
读完需要
速读仅需 1 分钟
前言:
如果我有一些包含地理注释信息(纬度和经度数据列)的 csv 数据。为了使用这些文件中的信息进行某些地理处理,可能需要将它们从 .csv 转换为 .shp 文件。ArcGIS 和 QGIS 等 GIS 软件可以实现此功能,但需要一次执行一个文件。因此本文介绍使用 python 进行批量 csv 转 shp。
希望各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)
1
SHP(Shapefile)是一种常用的 GIS 数据格式,是由 ESRI(环境科学研究所)设计的一种矢量数据格式,可用于存储和编辑各种地理信息数据,如点、线、面等。SHP 文件是一种基于二进制的格式,包含了地理实体的几何信息和属性信息。
适用场景:
SHP 格式适用于小规模和中规模的矢量数据处理,并且易于在不同的 GIS 软件和平台之间进行转换和共享。在大规模数据处理和三维数据方面可能存在一定的局限性。
优势:SHP 格式是一种二进制文件格式,易于读取和使用。它也容易转换成其他格式的文件。SHP 文件可以方便地进行编辑,包括添加、删除和修改矢量数据等。
缺点:SHP 文件在处理大规模的数据时可能会遇到文件大小限制的问题。同时 SHP 格式也不支持三维数据的存储和显示。
2
将 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
# 1 导入所需库
import pandas as pd
from geopandas import GeoDataFrame
from shapely.geometry import Point
import os
import time
from 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"))