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, 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文件内容请搜索hwidc以前的文章或继续浏览下面的相关文章希望大家以后多多支持hwidc!
【本文转自:游戏服务器 转载请保留连接】