GDAL 实现矢量合并

前言

矢量数据作为数据处理的半壁江山,在日常工作中涉及到多种操作,矢量数据合并也是一项常用操作,该功能涉及到两个及以上的数据源在几何对象与属性对象之间的合并操作。

在之前的文章中讲了如何使用GDAL或者ogr2ogr工具将txt以及csv文本数据转换为Shp格式,本篇教程在之前一系列文章的基础上讲解如何使用GDAL 实现矢量合并

  • GDAL 简介
  • GDAL 下载安装
  • GDAL 开发起步
  • GDAL 实现 GIS 数据读取转换(全)

如果你还没有看过,建议从以上内容开始。

1. 开发环境

本文使用如下开发环境,以供参考。

时间:2025年

系统:Windows 11

Python:3.11.7

GDAL:3.11.1

2.Union合并方法

矢量图层Layer对象上具有一个方法Union可用于数据裁剪。该方法接收合并图层和结果图层两个必填参数,剩下三个可选参数,最后返回一个整型值。

"""
说明:GDAL 矢量合并
参数:
-unionLayer:用于裁剪的矢量图层
-resultLayer:生成结果数据图层
"
""
def Union(unionLayer,resultLayer):

3. 矢量图层合并

老规矩定义一个图层合并方法LayerUnion用于数据合并,该方法接收如下三个参数。

"""
说明:GDAL 图层合并操作
参数:
-sourcePath: 源文件Shp数据路径
-unionPath:用于合并的Shp数据路径
-resultPath:用于存放合并结果的数据路径
"
""
def LayerUnion(sourcePath,unionPath,resultPath):

然后添加数据驱动,只不过在添加数据驱动前使用checkFilePath方法检查文件路径是否存在,之后判断数据驱动是否正常。

# 检查文件是否存在
checkFilePath(sourcePath)
checkFilePath(unionPath)
checkFilePath(resultPath)

# 添加数据驱动
shpDriver = ogr.GetDriverByName("ESRI Shapefile")

# 检查数据驱动是否正常
checkDriver(shpDriver)

在打开Shp数据源时传递第二个可选参数,该参数为布尔类型,将其值设置为True意为以可写模式打开数据源。

"""
以可写模式打开数据源
"
""

# 获取数据源
# sourceDs = shpDriver.Open(sourcePath)
# unionDs = shpDriver.Open(unionPath)
sourceDs = shpDriver.Open(sourcePath,True)
clipDs = shpDriver.Open(unionPath,True)

以源数据图层sourceLayer属性结构创建结果图层,获取源图层空间参考以及几何数据类型信息,并创建结果图层属性字段。

# 获取图层
sourceLayer = sourceDs.GetLayer(0)
srs = sourceLayer.GetSpatialRef()
geomType = sourceLayer.GetGeomType()

unionLayer = unionDs.GetLayer(0)

# 创建输出数据源
resultDs = shpDriver.CreateDataSource(resultPath)

# 根据源数据结构创建输出图层
resultLayer = resultDs.CreateLayer("resultLayer",srs,geomType)

# 添加数据结构
featureDefn = sourceLayer.GetLayerDefn()
fieldCount = featureDefn.GetFieldCount()

# 创建要素
# resultFeature = ogr.Feature(featureDefn)

# 添加字段(复制源图层字段定义)
foriinrange(fieldCount):
fieldDefn = featureDefn.GetFieldDefn(i)
resultLayer.CreateField(fieldDefn)

在源数据图层上调用方法Union进行图层合并,返回值为一个整型数值。合并完成后关闭所有数据源并返回结果。

print(f"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~图层合并开始~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
"""
图层裁剪
"
""
result = sourceLayer.Union(unionLayer,resultLayer,[],GetProgress,GetData)
print(f"裁剪结果:{result}")

# 关闭数据源
sourceDs = unionDs = resultDs = None
print(f"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~图层合并结束~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
returnresult

GetProgress为获取裁剪进度函数。

"""
说明:定义进度获取函数
参数:
-complete:完成度(0.0-1.0)
-message:进度消息
-userData:用户数据
"
""
def GetProgress(complete,message,userData):
print(f"进度:{complete * 100:.1f}% - {message}")
# 返回1表示继续处理,返回0表示取消
return1

GetData为获取裁剪数据函数。


def GetData(data):
print("裁剪数据:")

数据合并信息输出如下。

裁剪数据在ArcGIS中显示如下。

4. 注意事项

windows开发环境中同时安装GDALPostGIS,其中投影库PROJ的环境变量指向PostGIS的安装路径,在运行GDAL程序时,涉及到要素、几何与投影操作时会导致异常。具体意思为GDAL不支持PostGIS插件中的投影库版本,需要更换投影库或者升级版本。

RuntimeError: PROJ: proj_identify: D:Program FilesPostgreSQL13sharecontribpostgis-3.5projproj.db contains DATABASE.LAYOUT.VERSION.MINOR = 2 whereas a number >= 5 is expected. It comes from another PROJ installation.

解决办法为修改PROJ的环境变量到GDAL支持的版本或者在GDAL程序开头添加以下代码:

os.environ['PROJ_LIB'] = r'D:\Programs\Python\Python311\Libsite-packages\osgeo\data\proj'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1146171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升用户体验的标签切换方案:QTabWidget实战案例

让标签页更聪明:从QTabWidget到工业级界面的实战进阶你有没有遇到过这样的场景?程序一启动,卡顿好几秒才弹出主窗口——只因为四个标签页里藏着三个“重量级”模块:一个要加载万行日志,一个得初始化三维渲染引擎&#…

circuit simulator中实现前仿真与后仿真的统一平台方案

如何用一个电路仿真器打通前后仿:构建高效统一的验证平台在今天的深亚微米工艺下,芯片设计早已不是画完原理图、跑个前仿真就万事大吉的事了。尤其是模拟、射频和混合信号电路,后仿真的结果常常让人“惊喜”——增益掉了3dB,带宽缩…

一文说清MOSFET工作原理:开关模式基础认知

深入浅出MOSFET:从零理解开关模式下的核心原理与实战设计你有没有遇到过这样的问题:用MCU控制一个电机,明明代码写对了,可MOSFET一上电就发热甚至烧毁?或者在做DC-DC电源时,效率怎么都提不上去,…

设计模式学习(11) 23-9 组合模式

文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析(JDK中的组合模式实现)0.个人感悟 组合模式的应用场景比较专,适合树状嵌套场景&…

FreeRTOS任务调度模式选择核心要点

FreeRTOS任务调度模式选择:从理论到实战的深度指南在嵌入式系统的世界里,“实时性”不是锦上添花的功能,而是生死攸关的底线。当你设计一个工业控制器、医疗设备或智能网关时,系统能否在毫秒级内响应关键事件,往往决定…

慢生活并非消极躺平,而是主动选择将生活节奏调整到与身心需求匹配的状态

慢生活的核心本质慢生活并非消极躺平,而是主动选择将生活节奏调整到与身心需求匹配的状态。它强调有意识地脱离社会时钟的裹挟,通过减少无效忙碌来提升生命质量。现代心理学研究表明,适度放慢节奏能降低皮质醇水平,提高多巴胺分泌…

OrCAD下载与License配置:实战案例分享

从零搞定OrCAD:下载、安装到License激活的完整实战指南 最近帮团队新来的几位工程师搭环境,又经历了一遍OrCAD的部署流程。说实话,虽然这软件用了十几年了,但每次重新配置一次,还是能踩出几个“经典老坑”——尤其是 …

aarch64虚拟化性能优化策略实战案例分析

aarch64虚拟化性能优化实战:从理论到落地的深度拆解当前我们为何必须关注aarch64虚拟化?几年前,ARM架构还只是手机和嵌入式设备的代名词。但今天,在云原生、边缘计算与绿色数据中心的浪潮推动下,aarch64(即…

vivado2019.2安装破解教程在课程设计中的实际应用情况研究

在课程设计中搭建FPGA开发环境:从vivado2019.2破解实践谈起 在高校电子类专业的教学一线,一个真实而普遍的问题始终存在:学生需要使用Xilinx Vivado进行FPGA开发,但正版授权昂贵、实验室资源紧张,个人电脑又难以合法部…

2.智梯云枢・全维管控广告系统——解决串口卡顿 + 优化稳定性

之前代码 不能停止 只能kill进程pid停止#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <dirent.h> #include <sys/types.h> #include <sys/wait.h> #includ…

跨模块数据传递方案:SystemVerilog接口实践

跨模块数据传递的优雅解法&#xff1a;深入掌握SystemVerilog接口实战你有没有遇到过这样的场景&#xff1f;一个简单的请求-应答协议&#xff0c;DUT端口连了req,gnt,data[7:0],valid,ready……十几个信号。写测试平台时&#xff0c;每个driver、monitor都要把这些信号一一声明…

移动电源智能监测技术全面升级

随着智能手机、平板电脑等电子设备的普及&#xff0c;移动电源已成为现代人生活中不可或缺的“能量伴侣”。然而&#xff0c;近年来因移动电源质量问题引发的起火、爆炸等安全事故频发&#xff0c;尤其在民航等密闭空间中的隐患&#xff0c;让安全技术升级成为行业发展的核心命…

Redis 助力大数据平台实现高性能读写操作

Redis 助力大数据平台实现高性能读写操作 关键词&#xff1a;Redis, 大数据平台, 高性能读写, 内存数据库, 数据缓存, 分布式系统, 实时数据处理 摘要&#xff1a;在当今数据驱动的时代&#xff0c;大数据平台面临着前所未有的性能挑战。本文深入探讨Redis作为高性能内存数据库…

Pspice在OrCAD Capture中的集成配置:手把手教程

手把手教你打通 Pspice 与 OrCAD Capture 的“任督二脉”你有没有遇到过这种情况&#xff1a;满怀信心地打开 OrCAD Capture&#xff0c;画好了一个运放电路&#xff0c;准备跑个瞬态仿真看看响应——结果点击“Run Pspice”按钮时&#xff0c;发现它灰了&#xff1f;或者仿真一…

ARM Compiler 5.06目标文件格式解析:ELF结构全面讲解

深入ARM编译器的“黑盒”&#xff1a;从目标文件看ELF如何塑造嵌入式系统 你有没有遇到过这样的场景&#xff1f; 代码明明编译通过&#xff0c;链接时却报出 multiple definition of init_system &#xff1b;或者固件烧录后跑飞&#xff0c;调试器显示PC指针跳到了一片空…

L298N外围元件选型(电阻/电容/电感)系统学习

L298N驱动直流电机&#xff1a;从“能转”到“稳转”的无源元件设计之道你有没有遇到过这样的场景&#xff1f;MCU代码写得一丝不苟&#xff0c;PWM调速逻辑清晰&#xff0c;方向控制准确无误——可一接上电机&#xff0c;系统就复位、单片机重启、电机嗡嗡作响像在唱歌……最后…

数字电路与射频前端协同设计:现代通信设备深度剖析

数字电路与射频前端协同设计&#xff1a;现代通信设备的“神经”与“肌肉”如何共舞&#xff1f;你有没有遇到过这样的情况&#xff1a;明明算法跑得飞快&#xff0c;FPGA逻辑也写得滴水不漏&#xff0c;可实测时却发现Wi-Fi信号突然掉速、5G吞吐量上不去&#xff0c;甚至接收灵…

全面讲解PL2303芯片USB Serial驱动下载注意事项

一次搞懂PL2303 USB转串口&#xff1a;驱动下载避坑全指南你有没有遇到过这种情况——手里的USB转TTL模块插上电脑&#xff0c;设备管理器里却只显示“未知设备”&#xff1f;或者刚烧录完程序&#xff0c;再插回去COM口就消失了&#xff1f;又或者明明能识别&#xff0c;但高波…

vivado安装操作指南:适合初学者的完整流程

手把手教你安装 Vivado&#xff1a;从零开始搭建 FPGA 开发环境 你是不是也遇到过这种情况——刚想入门 FPGA&#xff0c;兴冲冲地打开 Xilinx 官网准备下载 Vivado&#xff0c;结果发现安装包几十个 G&#xff0c;流程复杂得像在解密&#xff0c;还没开始写代码就被“卡死”在…

大电流电感的热管理与散热设计实践案例

大电流电感的热管理&#xff1a;从设计误区到实战优化你有没有遇到过这样的情况&#xff1f;一款电源模块在实验室测试时表现良好&#xff0c;效率达标、波形干净。可一旦进入满载老化测试&#xff0c;电感就开始发热发烫&#xff0c;甚至出现啸叫、温升失控——最终系统不得不…