news 2026/5/31 2:30:53

GDAL 实现数据空间查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GDAL 实现数据空间查询

前言

在GIS开发中,空间查询和属性查询都是常见的基础操作,是每一个GISer都要掌握的必备技能。实现高效的数据查询功能可以提升用户体验,提升数据可视化效率。

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

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

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

1. 开发环境

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

时间:2025年

系统:Windows 11

Python:3.11.7

GDAL:3.11.1

2. 空间查询

GDAL中,有两个图层方法可以用于实现空间查询,分别是SetSpatialFilterSetSpatialFilterRect。此种查询方式为直接在源数据上操作,返回结果为查询图层。

"""
参数
-geom:用于几何查询的几何对象
"
""
SetSpatialFilter(geom)

"""
参数:
-minx:最小x坐标
-miny:最小y坐标
-maxx:最大x坐标
-maxy:最大y坐标
"
""
SetSpatialFilterRect(minx,miny,maxx,maxy)

传入None值时重置查询。sourceLayer.SetSpatialFilter(None)

在进行正式查询前和以前的文章一样,首先获取数据驱动,添加数据源,获取图层数据。定义一个方法SpatialFilter用于实现空间查询,该方法接受两个参数,一个sourcePath传递源数据图层路径,另一个selectPath用于定义查询图层路径。

"""
说明:图层属性过滤
参数:
-sourcePath:待查询 Shp 文件路径
-selectPath:查询 Shp 文件路径
"
""
def SpatialFilter(sourcePath,selectPath):

在以下代码中完成图层数据的读取操作。

# 注册所有驱动
ogr.RegisterAll()

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

checkFilePath(sourcePath,shpDriver)
checkFilePath(selectPath,shpDriver)

# 打开数据源
sourceDs = shpDriver.Open(sourcePath)
selectDs = shpDriver.Open(selectPath)

hasDs = sourceDs and selectDs

ifhasDs is None:
print("数据源打开异常,请检查路径!")
returnFalse

# 获取图层
sourceLayer = sourceDs.GetLayer(0)
selectLayer = selectDs.GetLayer(0)

下面对几何查询以及矩形查询两种实现方式进行介绍。

2.1. 几何查询

通过图层方法GetNextFeature获取第一个要素对象。

# 获取查询几何对象
queryFeat = selectLayer.GetNextFeature()
queryGeom = queryFeat.GetGeometryRef()

print(f"查询要素id:{queryFeat.GetField('Id')}")
print(f"查询几何对象:{queryGeom}")

将几何对象传入SetSpatialFilter方法进行空间过滤。

# 空间过滤
sourceLayer.SetSpatialFilter(queryGeom)

查询完成之后传入None值结束查询。

# 结束查询
sourceLayer.SetSpatialFilter(None)

以下为几何查询部分代码。

# 获取查询几何对象
queryFeat = selectLayer.GetNextFeature()
queryGeom = queryFeat.GetGeometryRef()

print(f"查询要素id:{queryFeat.GetField('Id')}")
print(f"查询几何对象:{queryGeom}")

# 获取要素数量
featureCount = sourceLayer.GetFeatureCount()
print(f"所有要素数量:{featureCount}")

# 空间过滤
sourceLayer.SetSpatialFilter(queryGeom)

queryFeatCount = sourceLayer.GetFeatureCount()
print(f"查询要素数量:{queryFeatCount}")

# 结束查询
sourceLayer.SetSpatialFilter(None)
finalFeatCount = sourceLayer.GetFeatureCount()
print(f"重置查询后要素数量:{finalFeatCount}")

print("n~~~~~~~方式一:结束几何查询~~~~~~~")

若有兴趣,还可以创建自定义几何对象进行空间查询。

# 自定义Geometry查询对象
customGeom = ogr.Geometry(ogr.wkbPolygon)
ringGeom = ogr.Geometry(ogr.wkbLinearRing)

ringGeom.AddPoint(102.884350,32.501570)
ringGeom.AddPoint(105.025865,74.974949)
ringGeom.AddPoint(50.417235,55.701314)
ringGeom.AddPoint(50.417235,32.501570)

ringGeom.CloseRings()
customGeom.AddGeometry(ringGeom)

# 获取要素数量
featureCount = sourceLayer.GetFeatureCount()
print(f"所有要素数量:{featureCount}")

# 空间过滤
sourceLayer.SetSpatialFilter(customGeom)

queryFeatCount = sourceLayer.GetFeatureCount()
print(f"查询要素数量:{queryFeatCount}")

# 结束查询
sourceLayer.SetSpatialFilter(None)
finalFeatCount = sourceLayer.GetFeatureCount()
print(f"重置查询后要素数量:{finalFeatCount}")

print("n~~~~~~~方式一:结束几何查询~~~~~~~")

如下为几何查询输出结果:

如下为该要素在ArcGIS中查询显示结果。

2.2. 矩形查询

矩形查询主要调用SetSpatialFilterRect方法,传入x、y坐标即可。

# 获取要素数量
featureCount2 = sourceLayer.GetFeatureCount()
print(f"所有要素数量:{featureCount2}")

# 空间过滤
sourceLayer.SetSpatialFilterRect(-16.9994,23.1235,42.9111,49.5852,)
queryFeatCount2 = sourceLayer.GetFeatureCount()

如下为矩形查询输出结果:

3. 注意事项

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'
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 15:26:23

3步搞定ComfyUI视频合成:从图像到视频的终极指南

3步搞定ComfyUI视频合成:从图像到视频的终极指南 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 当你精心准备了一系列精美的AI生成图像,却…

作者头像 李华
网站建设 2026/5/29 2:40:54

Display Driver Uninstaller:终极显卡驱动清理解决方案

Display Driver Uninstaller:终极显卡驱动清理解决方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller…

作者头像 李华
网站建设 2026/5/28 20:30:42

魔兽争霸III兼容性修复工具:3分钟解决新系统闪退问题

魔兽争霸III兼容性修复工具:3分钟解决新系统闪退问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在Windows 10/11系…

作者头像 李华
网站建设 2026/5/28 19:10:17

Driver Store Explorer完全指南:轻松管理Windows驱动存储空间

Driver Store Explorer完全指南:轻松管理Windows驱动存储空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Windows系统驱动管理从未如此简单!Driver S…

作者头像 李华
网站建设 2026/5/28 18:38:48

NBTExplorer终极指南:快速掌握我的世界数据编辑技巧

NBTExplorer终极指南:快速掌握我的世界数据编辑技巧 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 想要彻底改变你的我的世界游戏体验吗?N…

作者头像 李华
网站建设 2026/5/28 15:26:31

地址别名识别能力:MGeo处理‘朝阳医院’与‘北京市朝阳医院’

地址别名识别能力:MGeo处理‘朝阳医院’与‘北京市朝阳医院’ 在城市计算、地图服务和位置智能系统中,地址别名识别是一项关键且极具挑战性的任务。用户输入的地址文本往往存在缩写、省略、语序变化甚至错别字等问题,例如“朝阳医院”与“北京…

作者头像 李华