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

(0)

相关推荐

  • 利用python将json数据转换为csv格式的方法

    假设.json文件中存储的数据为: {"type": "Point", "link": "http://www.dianping.com/newhotel/22416995", "coordinates": [116.37256372996957, 40.39798447055443], "category": "经济型", "name": &qu

  • python实现将html表格转换成CSV文件的方法

    本文实例讲述了python实现将html表格转换成CSV文件的方法.分享给大家供大家参考.具体如下: 使用方法:python html2csv.py *.html 这段代码使用了 HTMLParser 模块 #!/usr/bin/python # -*- coding: iso-8859-1 -*- # Hello, this program is written in Python - http://python.org programname = 'html2csv - version 20

  • Python处理CSV与List的转换方法

    1.读取CSV文件到List def readCSV2List(filePath): try: file=open(filePath,'r',encoding="gbk")# 读取以utf-8 context = file.read() # 读取成str list_result=context.split("\n")# 以回车符\n分割成单独的行 #每一行的各个元素是以[,]分割的,因此可以 length=len(list_result) for i in rang

  • Python 根据数据模板创建shapefile的实现

    废话不多说,我就直接上代码让大家看看吧! #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : copyShapefile.py # @Author: huifer # @Date : 2018-4-28 from os.path import exists import gdal from osgeo import ogr from os import remove gdal.SetConfigOption("GDAL_FILENAME

  • Python使用pyshp库读取shapefile信息的方法

    通过pyshp库,可以读写Shapefile文件,查询相关信息,github地址为 https://github.com/GeospatialPython/pyshp#reading-shapefile-meta-data import shapefile # 使用pyshp库 file = shapefile.Reader("data\\市界.shp") shapes = file.shapes() # <editor-fold desc="读取元数据"&g

  • Python中shapefile转换geojson的示例

    shapefile转换geojson import shapefile import codecs from json import dumps # read the shapefile def shp2geo(file="line出产.shp"): reader = shapefile.Reader(file) fields = reader.fields[1:] field_names = [field[0] for field in fields] buffer = [] for

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

    Python实现csv文件(点表和线表)转换为shapefile文件 说明 点表使用的geometry坐标是wkbPoint(几何点坐标) 线表使用的geometry坐标是wkbLineString(多点坐标) 区别详细看截图 参考别人写的方法加了注释,把点和边的转化写成了函数,每次转成功后加了读取shp文件来测试是否转化成功 注意事项 1.解决shp dbf 文件中文编码 #gdal.SetConfigOption("SHAPE_ENCODING", "") #g

  • Python把csv数据写入list和字典类型的变量脚本方法

    如下所示: #coding=utf8 import csv import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='readDate.log', filemode='w') ''' 该模块的主要功能,是

  • Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法

    本文实例讲述了Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python # -*- coding:utf-8 -*- """ Purpose: 生成日汇总对账文件 Created: 2015/4/27 Modified:2015/5/1 @author: guoyJoe """ #导入模块 import MySQLdb import time impor

  • Python对CSV、Excel、txt、dat文件的处理

    python读取txt文件:(思路:先打开文件,读取文件,最后用for循环输出内容) 1.读取 1.1基于python csv库 #3.读取csv至字典x,y import csv # 读取csv至字典 csvFile = open(r'G:\训练小样本.csv', "r") reader = csv.reader(csvFile) #print(reader) # 建立空字典 result = {} i=0 for item in reader: if reader.line_num

  • Python之csv文件从MySQL数据库导入导出的方法

    Python从MySQL数据库中导出csv文件处理 csv文件导入MySQL数据库 import pymysql import csv import codecs def get_conn(): conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='test_csv', charset='utf8') return conn def insert(cur, sql, args): c

  • python中csv文件的若干读写方法小结

    如下所示: //用普通文本文件方式打开和操作 with open("'file.csv'") as cf: lines=cf.readlines() ...... //用普通文本方式打开,用csv模块操作 import csv with open("file.csv") as cf: lines=csv.reader(cf) for line in lines: print(line) ...... import csv headers=['id','usernam

  • python 使用csv模块读写csv格式文件的示例

    import csv class HandleCsv: ''' csv文件处理类 ''' def __init__(self, filename): ''' 构造器 :param filename: csv文件名 ''' self.filename = filename def get_data(self): ''' 获取csv中所有数据 :return: 嵌套字典的列表 ''' with open(self.filename, mode='r', encoding='utf-8') as f:

  • Python操作CSV格式文件的方法大全

    目录 (一)CSV格式文件 (二)CSV库操作csv格式文本 (三)pandas库操作CSV文件 总结 (一)CSV格式文件 1.说明 CSV是一种以逗号分隔数值的文件类型,在数据库或电子表格中,常见的导入导出文件格式就是CSV格式,CSV格式存储数据通常以纯文本的方式存数数据表. (二)CSV库操作csv格式文本 操作一下表格数据: 1.读取表头的2中方式 #方式一 import csv with open("D:\\test.csv") as f: reader = csv.rea

  • Python从csv文件中读取数据及提取数据的方法

    目录 1.从csv文件中读取数据 2.数据切割 数据保存在csv文件中 1.从csv文件中读取数据 参数header=None的有无 (1)没有header=None--直接将csv表中的第一行当作表头 # 读取数据 import pandas as pd data = pd.read_csv("data1.csv") print(data) 打印结果为: (2)有header=None--自动添加第一行当作表头 # 读取数据 import pandas as pd data = pd

  • Python中CSV文件(逗号分割)实战操作指南

    目录 一.csv文件介绍 1.csv文件简介 2.为什么要使用csv文件 二.csv文件查看 1.测试文件创建 2.查看csv文件(列表) 3.查看csv文件(字典) 4.写入文件(列表) 5.写入文件(字典) 总结 一.csv文件介绍 1.csv文件简介 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据.CSV

随机推荐