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.Clip裁剪方法

矢量图层Layer对象上具有一个方法Clip可用于数据裁剪。该方法接收裁剪图层和结果图层两个必填参数,剩下三个可选参数。

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

3. 矢量裁剪

定义一个图层裁剪方法LayerClip用于数据提取,该方法接收如下三个参数。

"""
说明:GDAL 空间分析操作
参数:
-sourcePath: 待裁剪Shp数据路径
-clipPath:用于裁剪的Shp数据路径
-resultPath:用于存放裁剪结果的数据路径
"
""
def LayerClip(sourcePath,clipPath,resultPath):

在添加数据驱动前使用checkFilePath方法检查文件路径是否存在,之后判断数据驱动是否正常。在打开Shp数据源时传递第二个可选参数,该参数为布尔类型,将其值设置为True意为以可写模式打开数据源。

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

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

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

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

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

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

clipLayer = clipDs.GetLayer(0)

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

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

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

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

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

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

print(f"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~图层裁剪开始~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
"""
图层裁剪
"
""
# result = sourceLayer.Clip(clipLayer,resultLayer)
result = sourceLayer.Clip(clipLayer,resultLayer,[],GetProgress,GetData)
print(f"裁剪结果:{result}")

# 关闭数据源
sourceDs = clipDs = 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/1140962.shtml

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

相关文章

至理名言【人生智慧】

做自己认为有价值的事生活中的爱,会让生活变可爱爱不是一种感觉,而是一种决定

基于SpringBoot的足球社区管理系统毕业设计

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot框架的足球社区管理系统,以满足足球爱好者在信息交流、赛事组织、社区互动等方面的需求。具体研究目的如下&…

基于SpringCloud的在线交易电商平台毕业设计

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在深入探讨基于SpringCloud架构的在线交易电商平台的设计与实现,以提升电商平台的性能、可扩展性和稳定性。具体研究目的如下: 首…

基于html5的网上团购系统设计与实现毕业论文+PPT(附源代码+演示视频)

文章目录基于html5的网上团购系统设计与实现一、项目简介(源代码在文末)1.运行视频2.🚀 项目技术栈3.✅ 环境要求说明4.包含的文件列表(含论文)数据库结构与测试用例系统功能结构前台运行截图后台运行截图项目部署源码…

基于SpringBoot的养老院管理系统毕设

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一套基于SpringBoot框架的养老院管理系统,以提升养老院管理效率和服务质量。具体研究目的如下:优化养老院管理流程&…

基于SpringBoot的新能源充电系统毕业设计

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在深入探讨基于SpringBoot框架的新能源充电系统的设计与实现,以应对当前新能源汽车产业发展中充电基础设施不足、充电效率低下以及用户体验不…

基于SpringBoot的校园失物招领系统毕设

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot框架的校园失物招领系统,以解决当前校园失物招领过程中存在的诸多问题。具体研究目的如下: 首先…

A.每日一题——1161. 最大层内元素和

题目链接:1161. 最大层内元素和(中等) 算法原理: 解法:层序遍历 9ms击败53.81% 时间复杂度O(N) 思路很简单,就是层序遍历的同时统计一下每层元素的和,然后利用顺序表找到对应最大值所在层数即可…

亲测好用10个AI论文工具,MBA论文写作必备!

亲测好用10个AI论文工具,MBA论文写作必备! AI 工具如何助力论文写作,让研究更高效 在当今快速发展的学术环境中,MBA 学生和科研工作者面临着越来越高的论文写作要求。无论是开题报告、文献综述还是最终的论文撰写,都需…

数据结构————栈

一.栈 1. 栈的的概念 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。进行元素插入和删除的一段是栈顶,另一端是栈底。栈中的元素遵从后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入…

基于Simulink的智能车辆雨天行驶仿真

目录 手把手教你学Simulink 一、引言:为什么“智能汽车需要雨天仿真”? 二、雨天仿真系统架构总览 输入: 输出: 三、关键模型1:降雨强度与路面附着系数 四、关键模型2:传感器性能降级建模 1. 摄像头(视觉) 2. 毫米波雷达 3. 激光雷达(LiDAR) 五、自适应控制…

stm32处理器对中断的响应说明

一、问题 1.stm32处理器每秒能够响应多少次中断? 2.stm32处理器每秒能够响应多少次周期性均匀的中断? 3.如何定量和定性的分析stm32处理器能够在单位每秒时间响应中断的次数呢?二、stm32处理的中断说明 1.需要了解stm32处理器的中断机制 2.需…

教AI学会说“我是小喵“竟然这么神奇?LlamaFactory微调揭秘

当AI也需要"自我介绍"你有没有想过,当你问ChatGPT"你是谁"的时候,它为什么知道自己是由OpenAI开发的?而不是说"我是小度,百度出品"?这就像你教小孩子自我介绍一样——"你好&#x…

基于Simulink的车与行人(V2P)通信仿真(行人预警场景)

目录 手把手教你学Simulink 一、引言:为什么“智能汽车需要V2P”? 二、V2P 系统架构总览 关键组件: 三、BSM-P 消息结构(SAE J2735 扩展) 四、V2P 通信技术选型 五、碰撞风险评估模型 1. 行人预测位置(匀速模型): 2. 车辆预测位置: 3. 最小距离预测: 4. 风…

exe打开应用程序无法启动,因为应用程序的并行配置不正确

问题现象描述:exe打开应用程序无法启动,因为应用程序的并行配置不正确。问题分析:将exe文件放到其他电脑确可以运行,由此确定不是exe问题,而是系统哪里出现问题。然后又随便复制其他exe放有问题电脑上可以打开&#xf…

基于Simulink的智能车辆雨天行驶仿真(感知与控制)

目录 手把手教你学Simulink 一、引言:为什么“智能汽车需要雨天仿真”? 二、雨天仿真系统架构总览 输入: 输出: 三、关键模型1:降雨强度与路面附着系数 四、关键模型2:传感器性能降级建模 1. 摄像头(视觉) 2. 毫米波雷达 3. 激光雷达(LiDAR) 五、自适应控…

华为研究团队突破代码修复瓶颈,8B模型击败32B巨型对手!

这项由华为技术有限公司、南洋理工大学、香港大学和香港中文大学联合完成的突破性研究发表于2026年1月,论文编号为arXiv:2601.01426v1。研究团队通过一种名为SWE-Lego的创新训练方法,让相对较小的8B参数模型在软件代码自动修复任务上的表现超越了许多32B…

2026继续教育必备10个降AI率工具测评榜单

2026继续教育必备10个降AI率工具测评榜单 2026年继续教育者为何需要专业降AI率工具? 在2026年的学术与职业发展环境中,继续教育已成为提升竞争力的重要途径。然而,随着AI生成内容检测技术的不断升级,越来越多的学习者和研究者遭遇…

[转]5 个很火火的个人 AI 知识库 GitHub 项目,收藏一波。

01 siyuan:个人知识管理工具 这个叫 思源笔记的开源项目,肯定很多人用过。在 GitHub 上都有 4 万的 Star 了。 它在极致的编辑体验与绝对的数据隐私之间找到平衡点,它不仅是一个笔记工具,更是一个基于本地的个人知识管理系统。 而…

ios应用为什么需要“签名”?揭开苹果签名的神秘面纱,从原理到方案一次讲透

在iOS世界里,“签名”这个词几乎无处不在,却又常常让人感到困惑。为什么iPhone不能像安卓一样随便安装APK?为什么安装企业App时要“信任开发者”?为什么有的应用突然打不开,提示“未受信任的开发者”?这些问…