csv转shp,无坐标信息,只有geometry:
from shapely.wkt import loads
df['lon'] = df['geometry'].apply(lambda x: loads(x).x)
df['lat'] = df['geometry'].apply(lambda x: loads(x).y)
# 将经纬度转换为点的几何信息
geometry = [Point(xy) for xy in zip(df['lon'], df['lat'])]
# 创建 GeoDataFrame 对象,并设置坐标系
gdf = gpd.GeoDataFrame(df, crs=crs, geometry=geometry)
# 设置输出文件名和路径
shp_name = f'{os.path.splitext(filename)[0]}.shp'
shp_path = os.path.join(output_dir, shp_name)
# 保存 GeoDataFrame 为 SHP 文件
gdf.to_file(shp_path)
完整代码:
# 设置输入输出文件夹路径
input_dir = './csv/'
output_dir = './shp/'
# 定义投影方式和坐标系
crs = 'EPSG:4326'
# 遍历输入文件夹中的所有 CSV 文件
import os
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
from shapely.wkt import loads
for filename in os.listdir(input_dir):
if filename.endswith('.csv'):
# 读取 CSV 文件中的数据
csv_path = os.path.join(input_dir, filename)
df = pd.read_csv(csv_path)
#提取经纬度信息:POINT (107.20441799540733 33.1109127348231)
df['lon'] = df['geometry'].apply(lambda x: loads(x).x)
df['lat'] = df['geometry'].apply(lambda x: loads(x).y)
# 将经纬度转换为点的几何信息
geometry = [Point(xy) for xy in zip(df['lon'], df['lat'])]
# 创建 GeoDataFrame 对象,并设置坐标系
gdf = gpd.GeoDataFrame(df, crs=crs, geometry=geometry)
# 设置输出文件名和路径
shp_name = f'{os.path.splitext(filename)[0]}.shp'
shp_path = os.path.join(output_dir, shp_name)
# 保存 GeoDataFrame 为 SHP 文件
gdf.to_file(shp_path)
print(filename)