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

 更新时间:2021年10月16日 11:18:08   作者:BRYTLEVSON  
这篇文章主要介绍了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文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Python3中打开文件的方式(With open)

    浅谈Python3中打开文件的方式(With open)

    本文主要介绍了浅谈Python3中打开文件的方式(With open),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例

    python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例

    这篇文章主要介绍了python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例,需要的朋友可以参考下
    2020-02-02
  • 简单快捷:NumPy入门教程的环境设置

    简单快捷:NumPy入门教程的环境设置

    NumPy是Python语言的一个扩展程序库,支持高阶大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,本教程是为那些想了解NumPy的基础知识和各种功能的人准备的,它对算法开发人员特别有用,需要的朋友可以参考下
    2023-10-10
  • python中装饰器的理解与使用详解

    python中装饰器的理解与使用详解

    这篇文章主要介绍了python中装饰器的理解与使用详解,装饰器本质上是一个闭包函数,其作用在于可以为其他函数增加额外功能,装饰器的返回值是一个函数对象,需要的朋友可以参考下
    2023-07-07
  • Python中OpenCV图像特征和harris角点检测

    Python中OpenCV图像特征和harris角点检测

    Harris角点检测算子是于1988年由CHris Harris & Mike Stephens提出来的。在具体展开之前,不得不提一下Moravec早在1981就提出来的Moravec角点检测算子。本文重点给大家介绍OpenCV图像特征harris角点检测知识,一起看看吧
    2021-09-09
  • PyQt5打开文件对话框QFileDialog实例代码

    PyQt5打开文件对话框QFileDialog实例代码

    这篇文章主要介绍了PyQt5打开文件对话框QFileDialog实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • pytorch加载自定义网络权重的实现

    pytorch加载自定义网络权重的实现

    今天小编就为大家分享一篇pytorch加载自定义网络权重的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python中Parsel的两种数据提取方式详解

    Python中Parsel的两种数据提取方式详解

    在网络爬虫的世界中,数据提取是至关重要的一环,Python 提供了许多强大的工具,其中之一就是 parsel 库,下面我们就来深入学习一下Parsel的两种数据提取方式吧
    2023-12-12
  • SpringBoot实现登录注册常见问题解决方案

    SpringBoot实现登录注册常见问题解决方案

    这篇文章主要介绍了SpringBoot实现登录注册常见问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python计算不规则图形面积算法实现解析

    Python计算不规则图形面积算法实现解析

    这篇文章主要介绍了Python计算不规则图形面积算法实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论