当前位置: 首页 > news >正文

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'
http://www.cnnetsun.cn/news/490422.html

相关文章:

  • ComfyUI视频合成技术深度解析:VHS_VideoCombine节点架构与优化策略
  • 数据科学竞赛技巧:MGeo作为baseline提升地址匹配排名
  • Zotero文献去重插件:智能化合并重复条目的终极解决方案
  • 告别手动打字:3步搞定视频硬字幕提取
  • MGeo在电力抄表系统中的实际落地效果
  • GetQzonehistory:简单三步永久保存你的QQ空间青春回忆
  • AssetStudio游戏资源提取终极指南:从入门到精通
  • Zotero插件商店完整指南:一站式学术工具管理终极方案
  • QQ空间历史记录完整备份终极指南:三步永久保存青春记忆
  • NBTExplorer终极指南:轻松掌握Minecraft数据编辑神器
  • NBTExplorer:掌握Minecraft世界的终极数据编辑工具
  • RimSort终极指南:轻松解决《环世界》模组加载冲突
  • GHelper深度解析:如何用轻量工具掌控华硕笔记本性能
  • MGeo更新日志解读:最新版本提升对POI别名的支持能力
  • CodePal:IDEA智能编程助手,开发效率倍增的AI代码神器
  • 3步打造纯净动画观影神器:Hanime1Plugin完全指南
  • 智慧树插件:解锁高效学习的终极秘籍
  • 当你的Minecraft世界需要“数据手术“时,这款神器能做什么?
  • MGeo地址匹配服务高可用架构设计建议
  • 终极免费在线UML绘图工具:PlantUML Editor完整使用手册
  • PotPlayer字幕翻译终极指南:快速实现多语言字幕实时转换
  • NBTExplorer:如何快速掌握Minecraft数据编辑的终极指南
  • 智慧树自动化插件的3大效率提升方案终极指南
  • Windows右键菜单终极优化指南:快速清理与个性化定制
  • 视频字幕提取终极教程:3步掌握硬字幕提取核心技术
  • 开发者的隐秘阅读天堂:3分钟解锁IDEA高效摸鱼新姿势
  • 8分钟玩转RePKG:Wallpaper Engine资源解包与转换完全指南
  • 3大自动化功能深度体验:League Akari如何让你的英雄联盟游戏更智能高效
  • 如何高效使用哔哩下载姬:面向新手的完整B站视频下载指南
  • 灾害风险评估应用:MGeo统计历史事故地点空间聚集性