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 数据读取转换(全)

相关推荐
可别3904 小时前
Vue 极简实现语音实时转写(录音转文字,低网络依赖、开箱即用)
前端·javascript·vue.js
阿猫的故乡4 小时前
Vue插槽从入门到项目实战:默认插槽、具名插槽、作用域插槽,一次讲明白
前端·javascript·vue.js
SEO-狼术4 小时前
Build Interactive Maps Crack
前端
小则又沐风a4 小时前
进程最终篇---进程控制(模拟实现xshell)
java·linux·服务器·前端
Invictus_cl4 小时前
条纹圆形进度条(彩虹色)
开发语言·前端·javascript
excel4 小时前
从封装到继承:深入理解 TypeScript 类中的 public、private、protected、static
前端
向日的葵0064 小时前
vue3路由的replace属性(四)
前端·javascript·vue.js·vue路由
杨超越luckly4 小时前
Agent应用指南:利用GET请求获取理想汽车门店位置信息
前端·python·html·汽车·可视化
阿猫的故乡4 小时前
Vue模板引用和组件暴露:ref拿DOM、defineExpose调方法,案例多到眼花
前端·javascript·vue.js
小雨下雨的雨10 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙