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指向点文件路径。
"""
说明:判断空间关系
参数:
-polygonPath:面图层数据路径
-pointPath:点图层数据路径
"""
def SpatialRelations(polygonPath,pointPath):
对于数据的基础操作步骤为获取数据驱动,获取数据源,再到获取目标图层。
# 检查文件是否存在
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用于检查文件路径是否正常,接受一个路径参数。
"""
说明:检查文件路径是否正常
参数:
-filePath:文件数据路径
"""
def checkFilePath(filePath):
if os.path.exists(filePath):
print("文件数据路径存在")
else:
print("文件数据路径不存在,请检查!")
本文基于以下数据进行空间关系判断。![]()
3. 相交关系
通过GetNextFeature或者GetFeature方法获取要素,其中GetFeature方法需要传入指定FId参数。
# 遍历面图层要素
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开发环境中同时安装GDAL与PostGIS,其中投影库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'
图片效果
![]()
![]()
❝
OpenLayers示例数据下载,请在公众号后台回复:ol数据
全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试
❝
GIS之路 公众号已经接入了智能 助手,可以在对话框进行提问,也可以直接搜索历史文章进行查看。
都看到这了,不要忘记点赞、收藏 + 关注 哦 !
本号不定时更新有关 GIS开发 相关内容,欢迎关注 ![]()
![]()
![]()