Python实现csv文件(点表和线表)转换为shapefile文件的方法

时间:2022-06-21 00:54:31

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

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

区别详细看截图

Python实现csv文件(点表和线表)转换为shapefile文件的方法

Python实现csv文件(点表和线表)转换为shapefile文件的方法

参考别人写的方法加了注释,把点和边的转化写成了函数,每次转成功后加了读取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 导入要考虑顺序,不然会报错)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import os, re
import geopandas as gpd
import gdal
import pandas as pd
from 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文件的文章就介绍到这了,更多相关Python csv文件转换为shapefile文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/brytlevson/article/details/120772341