新闻动态

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

发布日期:2021-12-24 22:08 | 文章来源:脚本之家

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文件内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部