首页 > 编程语言 >【Python&GIS】基于Python批量合并矢量数据

【Python&GIS】基于Python批量合并矢量数据

时间:2023-10-20 16:15:02浏览次数:33  
标签:shp layer GIS Python 矢量 ogr output path ds

  老样子最近有项目需要将N个矢量文件合并成一个,总不能用ArcGIS一个个导入吧。所以我就想着用Python编个程序实现批量合并矢量。我之前也发了一些关于Python操作矢量数据的文章:【Python&GIS】Python处理矢量数据的基本操作(查询、修改、删除、新建),如果大家感兴趣可以去我的主页看看,给我点个关注

一、导入库

import os
from osgeo import ogr

二、合并shp

        整体的思路就是创建一个空的shp资源,然后遍历文件夹中所有的shp,然后针对每一个shp再遍历它的要素,将每个要素写入创建的新shp中。需要注意的是最后需要释放内存,不然数据不会写入shp。

def Merge_shp(path):
    print("-----------------合并shp-----------------")
    path_lists = os.listdir(path)
    src_proj = None
    for c in path_lists:
        if c.endswith(".shp"):
            print(c)
            ds = ogr.Open(path+c)
            layer = ds.GetLayer()
            # 打开需要转换的矢量数据,获取图层
            src_proj = layer.GetSpatialRef()
            break
    # 获取其源坐标信息
    output_file = path+"Merge.shp"
    driver = ogr.GetDriverByName('ESRI Shapefile')
    output_ds = driver.CreateDataSource(output_file)
    output_layer = output_ds.CreateLayer("Shp", srs=src_proj, geom_type=ogr.wkbMultiPolygon)
    new_field = ogr.FieldDefn('value', ogr.OFTReal)  # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
    output_layer.CreateField(new_field)
    for i in range(0, len(path_lists)):
        if path_lists[i].endswith(".shp"):
            print("正在合并%s......" % path_lists[i])
            input_ds = ogr.Open(path + path_lists[i])
            input_layer = input_ds.GetLayer()
            for feature in input_layer:
                output_layer.CreateFeature(feature.Clone())
            input_ds = None
    output_ds = None

三、获取要素面积

        我这里给shp添加了一个新的字段,用来计算面积。大家视情况而定,这个可以没有。

def Get_polygon_area(path_shp):
    """
    :param path_shp: 输入矢量文件
    :return:
    """
    print("---------------获取矢量面积---------------")
    driver = ogr.GetDriverByName("ESRI Shapefile")  # 创建数据驱动
    ds = driver.Open(path_shp, 1)  # 创建数据资源
    layer = ds.GetLayer()
    new_field = ogr.FieldDefn("Area", ogr.OFTReal)  # 创建新的字段
    # new_field.SetWidth(32)
    # new_field.SetPrecision(16)
    layer.CreateField(new_field)
    for feature in layer:
        geom = feature.GetGeometryRef()
        geom2 = geom.Clone()
        area = geom2.GetArea()  # 默认为平方米
        # area = area / 1000000 # 转化为平方公里
        feature.SetField("Area", area)
        # feature.GetField('Area')
        layer.SetFeature(feature)
    ds = None

四、完整代码

# -*- coding: utf-8 -*-
"""
@Time : 2023/10/20 11:56
@Auth : RS迷途小书童
@File :Vector Data Batch Merge.py
@IDE :PyCharm
@Purpose:矢量数据批量合并成一个文件并计算面积
"""
import os
from osgeo import ogr


def Merge_shp(path):
    print("-----------------合并shp-----------------")
    path_lists = os.listdir(path)
    src_proj = None
    for c in path_lists:
        if c.endswith(".shp"):
            print(c)
            ds = ogr.Open(path+c)
            layer = ds.GetLayer()
            # 打开需要转换的矢量数据,获取图层
            src_proj = layer.GetSpatialRef()
            break
    # 获取其源坐标信息
    output_file = path+"Merge.shp"
    driver = ogr.GetDriverByName('ESRI Shapefile')
    output_ds = driver.CreateDataSource(output_file)
    output_layer = output_ds.CreateLayer("Shp", srs=src_proj, geom_type=ogr.wkbMultiPolygon)
    new_field = ogr.FieldDefn('value', ogr.OFTReal)  # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
    output_layer.CreateField(new_field)
    for i in range(0, len(path_lists)):
        if path_lists[i].endswith(".shp"):
            print("正在合并%s......" % path_lists[i])
            input_ds = ogr.Open(path + path_lists[i])
            input_layer = input_ds.GetLayer()
            for feature in input_layer:
                output_layer.CreateFeature(feature.Clone())
            input_ds = None
    output_ds = None


def Get_polygon_area(path_shp):
    """
    :param path_shp: 输入矢量文件
    :return:
    """
    print("---------------获取矢量面积---------------")
    driver = ogr.GetDriverByName("ESRI Shapefile")  # 创建数据驱动
    ds = driver.Open(path_shp, 1)  # 创建数据资源
    layer = ds.GetLayer()
    new_field = ogr.FieldDefn("Area", ogr.OFTReal)  # 创建新的字段
    # new_field.SetWidth(32)
    # new_field.SetPrecision(16)
    layer.CreateField(new_field)
    for feature in layer:
        geom = feature.GetGeometryRef()
        geom2 = geom.Clone()
        area = geom2.GetArea()  # 默认为平方米
        # area = area / 1000000 # 转化为平方公里
        feature.SetField("Area", area)
        # feature.GetField('Area')
        layer.SetFeature(feature)
    ds = None


if __name__ == "__main__":
    path1 = r"G:/2/"
    Merge_shp(path1)
    Get_polygon_area(path1+"Merge.shp")

        大家在使用时只需要将你要合并的shp全部放入一个文件夹,然后再将main中文件夹路径改成自己的就行了,程序最后会在该目录下生成Merge.shp文件,这个就是合并之后的结果。

标签:shp,layer,GIS,Python,矢量,ogr,output,path,ds
From: https://www.cnblogs.com/RSran/p/17777339.html

相关文章

  • Python深浅拷贝
    Python深浅拷贝拷贝/浅拷贝/深拷贝只针对可变数据类型拷贝(赋值)当lt2为lt的拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2变化简单的赋值lt=[1,2,3]lt2=ltlt.append(4)print(lt)#因为列表是可变类型,所以lt的值变化,lt2的值也会跟着变化print(l......
  • python设置代理ip,动态代理IP有哪些优势?
    在网络爬虫开发中,使用代理IP是非常常见的技巧,Python作为一门强大的编程语言,也提供了很多方法来使用代理IP,下面,我将就如何在Python中使用代理IP进行详细的阐述,并举例说明,需要的朋友可以参考下。1.方法一:使用urllib模块Python中最基础的网络请求是使用urllib模块,我们可以利用它来使......
  • 【从零学习python 】02. 开发工具介绍及交互式编程及注释详解
    编写Python代码根据我们之前介绍的知识,我们知道,所谓代码其实就是将一段普通文本按照一定的规范编写,然后交给电脑解析并且执行。那既然是一段文本,那我们是否可以直接使用文本编辑器来编码呢?答案是肯定的,但是这样开发起来,效率会很低。一、常见的代码编辑工具实际上,在我们实际工作......
  • 【从零学习python 】03. Python编程基础:变量、数据类型与标识符
    变量以及数据类型一、变量的定义对于重复使用,并且经常需要修改的数据,可以定义为变量,来提高编程效率。定义变量的语法为:变量名=变量值。(这里的=作用是赋值。)定义变量后可以使用变量名来访问变量值。如下示例:#不使用变量打印三次"今天天气真好",如果需要变成打印"......
  • 【从零学习python 】04. Python中的输出和输入
    输出简单来说,就是将程序的运行结果显示出来。一、普通的输出生活中的“输出”软件中的图形化界面输出python中变量的输出print('helloworld')二、格式化输出格式化操作的目的比如有以下代码:print("我今年10岁")print("我今年11岁")print("我今年12岁")......
  • 【从零学习python 】05. Python中运用算数运算符进行计算和字符串拼接
    进制现代的计算机和依赖计算机的设备里都用到二进制(即0和1)来保存和表示数据,一个二进制表示一个比特(Bit)。在二进制的基础上,计算机还支持八进制和十六进制这两种进制。除了计算机里的进制以外,我们生活中经常用到的是十进制。Python语言支持二进制、八进制、十六进制以......
  • 【从零学习python 】05. Python中运用算数运算符进行计算和字符串拼接
    进制现代的计算机和依赖计算机的设备里都用到二进制(即0和1)来保存和表示数据,一个二进制表示一个比特(Bit)。在二进制的基础上,计算机还支持八进制和十六进制这两种进制。除了计算机里的进制以外,我们生活中经常用到的是十进制。Python语言支持二进制、八进制、十六进制以......
  • 【从零学习python 】05. Python中运用算数运算符进行计算和字符串拼接
    进制现代的计算机和依赖计算机的设备里都用到二进制(即0和1)来保存和表示数据,一个二进制表示一个比特(Bit)。在二进制的基础上,计算机还支持八进制和十六进制这两种进制。除了计算机里的进制以外,我们生活中经常用到的是十进制。Python语言支持二进制、八进制、十六进制以......
  • python实现可视化的MD5、sha256哈希加密小工具
    python实现可视化的MD5、sha256哈希加密小工具,分享给大家,具体如下:效果图:刚启动的状态超过十条不全量显示importhashlibimporttkinterastk#窗口控制windowss=tk.Tk()windowss.title('Python_md5')#窗口title,并非第一行windowss.geometry('820x550')windowss.res......
  • 深入理解 Python 虚拟机:进程、线程和协程
    深入理解Python虚拟机:进程、线程和协程在本篇文章当中深入分析在Python当中进程、线程和协程的区别,这三个概念会让人非常迷惑。如果没有深入了解这三者的实现原理,只是看一些文字说明,也很难理解。在本篇文章当中我们将通过分析部分源代码来详细分析一下这三者根本的区别是什......