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 文件中文编码选自自己想转的编码常用的 gbkgb2312utf8# 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代表可读可写,默认为0csv_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 dsdel 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代表可读可写,默认为0csv_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 dsdel 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文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- java中如何实现重建二叉树