千家信息网

怎么用Python实现csv文件(点表和线表)转换为shapefile文件

发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,本篇内容主要讲解"怎么用Python实现csv文件(点表和线表)转换为shapefile文件",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么用Pytho
千家信息网最后更新 2025年01月17日怎么用Python实现csv文件(点表和线表)转换为shapefile文件

本篇内容主要讲解"怎么用Python实现csv文件(点表和线表)转换为shapefile文件",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么用Python实现csv文件(点表和线表)转换为shapefile文件"吧!

Python实现csv文件(点表和线表)转换为shapefile文件
说明

  • 点表使用的geometry坐标是wkbPoint(几何点坐标)

  • 线表使用的geometry坐标是wkbLineString(多点坐标)

区别详细看截图

参考别人写的方法加了注释,把点和边的转化写成了函数,每次转成功后加了读取shp文件来测试是否转化成功 注意事项

1.解决shp dbf 文件中文编码
#gdal.SetConfigOption("SHAPE_ENCODING", "")
#gdal.SetConfigOption("SHAPE_ENCODING", "gb2312")
gdal.SetConfigOption("SHAPE_ENCODING", "gbk")
2.layer.CreateField(ogr.FieldDefn('local_id', ogr.OFTString))
创建字段的名称最好为英文,而且不能超过十字字符,一个中文汉字占的字符多。

代码
(geopandas gdal 导入要考虑顺序,不然会报错)

import os, reimport geopandas as gpdimport gdalimport pandas as pdfrom osgeo import ogr, osr  # osr用于获取坐标系统,ogr用于处理矢量文件from conf.path_config import gis_excel_dir# 解决shp dbf 文件中文编码   选自自己想转的编码   常用的 gbk  gb2312  utf8# gdal.SetConfigOption("SHAPE_ENCODING", "")# gdal.SetConfigOption("SHAPE_ENCODING", "gb2312")gdal.SetConfigOption("SHAPE_ENCODING", "gbk")def point_csv_2_shp(path, shp_fn):    """    point  转 shp    """    os.chdir(os.path.dirname(path))  # 将path所在的目录设置为当前文件夹    ds = ogr.Open(path, 1)  # 1代表可读可写,默认为0    csv_lyr = ds.GetLayer()  # 获取csv文件    sr = osr.SpatialReference()    sr.ImportFromEPSG(4326)  # 定义坐标系统    shp_driver = ogr.GetDriverByName('ESRI Shapefile')  # 获取shapefile文件处理句柄    if os.path.exists(shp_fn):  # 如果文件夹中已存在同名文件则先删除        shp_driver.DeleteDataSource(shp_fn)    shp_ds = shp_driver.CreateDataSource(shp_fn)    layer = shp_ds.CreateLayer(shp_fn, sr, ogr.wkbPoint)  # 创建一个点图层    layer.CreateField(ogr.FieldDefn('id', ogr.OFTString))    layer.CreateField(ogr.FieldDefn('ground_h', ogr.OFTString))    layer.CreateField(ogr.FieldDefn('type', ogr.OFTString))    for csv_row in csv_lyr:  # 对于csv文件中每一行        point_feature = ogr.Feature(layer.GetLayerDefn())  # 创建一个点        x = csv_row.GetFieldAsDouble('横坐标')  # csv中的坐标字段        y = csv_row.GetFieldAsDouble('纵坐标')  # csv中的坐标字段        shp_pt = ogr.Geometry(ogr.wkbPoint)  # 创建几何点        shp_pt.AddPoint(x, y)        # 获取csv字段        # 为创建的shp文件字段赋值        point_feature.SetField('id', csv_row.GetFieldAsString('local_id'))  # GetFieldAsString  获取csv中的列名        point_feature.SetField('ground_h', csv_row.GetFieldAsString('ground_h'))        point_feature.SetField('type', csv_row.GetFieldAsString('dev_type'))        point_feature.SetGeometry(shp_pt)  # 将点的几何数据添加到点中        layer.CreateFeature(point_feature)  # 将点写入到图层中    del ds    del shp_ds  # 释放句柄,文件缓冲到磁盘    print("This process has succeeded!")def line_csv_2_dbf(path, shp_fn):    """    geometry坐标为 LineString坐标    """    os.chdir(os.path.dirname(path))  # 将path所在的目录设置为当前文件夹    ds = ogr.Open(path, 1)  # 1代表可读可写,默认为0    csv_lyr = ds.GetLayer()  # 获取csv文件    sr = osr.SpatialReference()    sr.ImportFromEPSG(4326)  # 定义坐标系统    shp_driver = ogr.GetDriverByName('ESRI Shapefile')  # 获取shapefile文件处理句柄    if os.path.exists(shp_fn):  # 如果文件夹中已存在同名文件则先删除        shp_driver.DeleteDataSource(shp_fn)    shp_ds = shp_driver.CreateDataSource(shp_fn)    layer = shp_ds.CreateLayer(shp_fn, sr, ogr.wkbLineString)  # 创建多个点图层    layer.CreateField(ogr.FieldDefn('id', ogr.OFTString))    layer.CreateField(ogr.FieldDefn('l_id', ogr.OFTString))    layer.CreateField(ogr.FieldDefn('u_id', ogr.OFTString))    for csv_row in csv_lyr:  # 对于csv文件中每一行        point_feature = ogr.Feature(layer.GetLayerDefn())        x1 = csv_row.GetFieldAsDouble('x1')  # csv中的 x1坐标        y1 = csv_row.GetFieldAsDouble('y1')  # y1坐标        x2 = csv_row.GetFieldAsDouble('x2')  # x1坐标        y2 = csv_row.GetFieldAsDouble('y2')  # y2坐标        mult_coord = '(' + str(x1) + ' ' + str(y1) + ',' + str(x2) + ' ' + str(y2) + ')'        # geom = ogr.CreateGeometryFromWkt('LINESTRING ' + '(2 1,0 1)')        geom = ogr.CreateGeometryFromWkt('LINESTRING' + mult_coord)        # 获取csv字段        # 为创建的shp文件字段赋值        point_feature.SetField('id', csv_row.GetFieldAsString('gid'))  # GetFieldAsString  获取csv中的列名        point_feature.SetField('l_id', csv_row.GetFieldAsString('l_id'))        point_feature.SetField('u_id', csv_row.GetFieldAsString('u_id'))        point_feature.SetGeometryDirectly(geom)        layer.CreateFeature(point_feature)    del ds    del shp_ds  # 释放句柄,文件缓冲到磁盘    print("This process has succeeded!")def read_shapefile(path):    """    测试转成的shp文件    """    df = gpd.read_file(path, encoding='gbk', rows=20)  # 转shp前的编码格式    print(df)if __name__ == '__main__':    '''线表转shp  以及读取测试'''    shp_fn = "gd.shp"  # 最终要得到的shp文件的文件名    path = os.path.join(gis_excel_dir, 'line.csv')  # csv文件名称    line_csv_2_dbf(path=path, shp_fn=shp_fn)    # 读取测试转之后的结果    read_shapefile(path=os.path.join(gis_excel_dir, 'gd.shp'))    '''点表转shp  以及读取测试'''    # shp_fn = "xnd.shp"    # path = os.path.join(gis_excel_dir, 'point.csv')  # csv文件名称    # point_csv_2_shp(path=path, shp_fn=shp_fn)    # 读取测试转之后的结果    # read_shapefile(path=os.path.join(gis_excel_dir, 'point.shp'))

到此,相信大家对"怎么用Python实现csv文件(点表和线表)转换为shapefile文件"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0