GDAL 空间关系解析

^ 关注我,带你一起学GIS ^

前言

空间关系用于判断几何对象之间位置关系,GDAL支持相交、相离、包含等多种空间关系。在GIS开发中,空间分析离不开准确的空间关系判断,选择何种空间关系,对数据查询和分析速度的影响也会有差异,所以,熟练掌握各种空间关系是很有必要的。

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

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

1. 开发环境

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

时间:2025年

系统:Windows 11

Python:3.11.7

GDAL:3.11.1

2. 判断几何关系

定义一个方法SpatialRelations用于判断要素间空间关系,该方法接收两个参数,其中polygonPath指向面文件路径,pointPath指向点文件路径。

python 复制代码
"""
说明:判断空间关系
参数:
    -polygonPath:面图层数据路径
    -pointPath:点图层数据路径
"""
def SpatialRelations(polygonPath,pointPath):

对于数据的基础操作步骤为获取数据驱动,获取数据源,再到获取目标图层。

ini 复制代码
# 检查文件是否存在
checkFilePath(polygonPath)
checkFilePath(pointPath)

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

# 获取数据源
polygonDs = shpDriver.Open(polygonPath)
pointDs = shpDriver.Open(pointPath)

# 获取图层
polygonLayer = polygonDs.GetLayer(0)
pointLayer = pointDs.GetLayer(0)

方法checkFilePath用于检查文件路径是否正常,接受一个路径参数。

python 复制代码
"""
说明:检查文件路径是否正常
参数:
    -filePath:文件数据路径
"""
def checkFilePath(filePath):
    if os.path.exists(filePath):
        print("文件数据路径存在")
    else:
        print("文件数据路径不存在,请检查!")

本文基于以下数据进行空间关系判断。

3. 相交关系

通过GetNextFeature或者GetFeature方法获取要素,其中GetFeature方法需要传入指定FId参数。

ini 复制代码
    # 遍历面图层要素
    for polyFeature in polygonLayer:
        # 获取几对象
        polyGeom = polyFeature.GetGeometryRef()
        # 获取要素Id
        featId = polyFeature.GetField("Id")
        print(f"n面状要素~~~~~Id:{featId}n")

        # 获取几何要素
        polyGeom = polyFeature.GetGeometryRef()
        # print(f"面状几何:{polyGeom}")

        # 遍历点图层要素
        for ptFeature in pointLayer:
            # 获取几何对象
            ptGeom = ptFeature.GetGeometryRef()
            # print(f"点状几何:{ptGeom1}")

            # 获取要素名称
            featName = ptFeature.GetField("name")   

            # 相交
            result = polyGeom.Intersect(ptGeom)

            description = "不相交" if result == False else "^^😊相交😊^^"

            print(f"面要素【{featId}】与点要素【{featName}】 是否相交:{result} ({description})") 

其中相交 关系输出结果显示如下,与图形显示结果一致。

其中相离 关系输出结果显示如下,与图形显示结果一致。

其中相接 关系输出结果显示如下,与图形显示结果一致。

还有包含(Contains)、重叠(Overlaps)、在...之内(Within) 等空间关系,留给感兴趣的读者自行实现。

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程序开头添加以下代码:

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

图片效果

OpenLayers示例数据下载,请在公众号后台回复:ol数据

全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试

GIS之路 公众号已经接入了智能 助手,可以在对话框进行提问,也可以直接搜索历史文章进行查看。

都看到这了,不要忘记点赞、收藏 + 关注

本号不定时更新有关 GIS开发 相关内容,欢迎关注


GeoTools 开发合集(全)

OpenLayers 开发合集

GDAL 实现数据空间查询

GDAL 实现数据属性查询

GDAL 实现创建几何对象

GDAL 实现自定义数据坐标系

GDAL 实现矢量数据读写

GDAL 数据类型大全

GDAL 实现 GIS 数据读取转换(全)

相关推荐
jeffwang9 小时前
我做了个让 AI 看屏幕跑测试的工具,因为 Playwright 测不了我的 Flutter Web
前端
HSunR9 小时前
dify 搭建ai作业批改流
开发语言·前端·javascript
代码不加糖9 小时前
2026 跨境电商独立站实战:从 0 到 1 搭建高转化 SaaS 商城(附源码)
开发语言·前端·javascript
亲亲小宝宝鸭9 小时前
拖一拖控件,拖出个问卷(低代码平台)
前端·低代码
江南十四行10 小时前
ReAct Agent 基本理论与项目实战(一)
前端·react.js·前端框架
We་ct10 小时前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·leetcode·typescript·动态规划
小呆呆66610 小时前
Codex 穷鬼大救星
前端·人工智能·后端
当时只道寻常11 小时前
Vue3 + IntersectionObserver 实现高性能图片懒加载
前端
sakiko_11 小时前
UIKit学习笔记3-布局、滚动视图、隐藏或显示视图
前端·笔记·学习·objective-c·swift·uikit
有一个好名字12 小时前
Agent Loop —— 一切从那个 while 循环开始
前端·javascript·chrome