QGIS中下载遥感影像的Python代码片段
1. 引言
QGIS是开源免费且好用的GIS软件,并且可以使用Python脚本来控制
这里主要使用的打开QGIS时启动内置的Python解释器,这个Python解释器可以访问iface
接口从而实现对QGIS Desktop的实时控制,如下图所示:
本文主要记录一些使用QGIS Desktop来实现下载在线遥感影像的步骤和Python代码片段
注:当然可以直接使用QGIS直接导出在线遥感影像,但有时需要分步骤导出很多影像时,使用脚本控制会更方便
2. 获取图层
from qgis.core import QgsProject # 获取当前项目中的图层字典 layer_dict = QgsProject.instance().mapLayers() # 打印图层字典中的图层名称和ID for layer_id, layer in layer_dict.items(): print("Layer Name:", layer.name()) print("Layer ID:", layer_id) print("-------------")
3. 加载WMS
from qgis.core import QgsRasterLayer # 定义XYZ格式地图的URL xyz_url = "type=xyz&url=https://gac-geo.googlecnapps.cn/maps/vt?lyrs%3Ds%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=20&zmin=0" # 创建XYZ图层 layer = QgsRasterLayer(xyz_url, "XYZ Map", "wms") # 检查图层是否加载成功 if layer.isValid(): # 将图层添加到当前项目 QgsProject.instance().addMapLayer(layer) print("XYZ Map layer added successfully.") else: print("Failed to load XYZ Map layer.")
4. 获取图层范围与投影
from qgis.core import QgsProject # 获取图层对象 layer = QgsProject.instance().mapLayersByName('NingBoTestHeight')[0] # 获取图层的范围 extent = layer.extent() # 打印图层的范围 print("Min X:", extent.xMinimum()) print("Min Y:", extent.yMinimum()) print("Max X:", extent.xMaximum()) print("Max Y:", extent.yMaximum()) # 获取图层的投影信息 crs = layer.crs() # 打印图层的投影信息 print("CRS Name:", crs.authid())
5. 导出WMS遥感影像
from qgis.core import QgsRasterFileWriter, QgsRectangle, QgsProject # 获取图层对象 layer = QgsProject.instance().mapLayersByName('Google')[0] layer2 = QgsProject.instance().mapLayersByName('test')[0] # 定义输出文件路径 output_file = '/path/to/your/tiff/file.tif' # 创建一个写入器对象 writer = QgsRasterFileWriter(output_file) # 定义导出范围 extent = layer2.extent() pipe = QgsRasterPipe() provider = layer.dataProvider() pipe.set(provider.clone()) # 执行导出 if writer.writeRaster(pipe, layer2.width(), layer2.height(), extent, layer.crs(), QgsCoordinateTransformContext()): print("导出失败") else: print("导出成功")
6. 读取本地TIFF
# 定义TIFF文件路径 tiff_file = '/path/to/your/tiff/file.tif' # 创建一个QgsRasterLayer对象 layer = QgsRasterLayer(tiff_file, 'layer_name') # 检查图层是否有效 if layer.isValid(): # 获取图层的范围属性 extent = layer.extent() print('Min X:', extent.xMinimum()) print('Min Y:', extent.yMinimum()) print('Max X:', extent.xMaximum()) print('Max Y:', extent.yMaximum()) else: # 如果图层无效,则尝试直接读取范围属性 extent = QgsRasterLayer.extentFromUri(tiff_file) if extent is not None: print('Min X:', extent.xMinimum()) print('Min Y:', extent.yMinimum()) print('Max X:', extent.xMaximum()) print('Max Y:', extent.yMaximum()) else: print('Failed to read extent from file!')
7. 读取本地数据并导出在线影像
from qgis.core import QgsRasterFileWriter, QgsRectangle, QgsProject, QgsRasterLayer # 定义输出文件路径 tiff_file = '/path/to/your/tiff/file.tif' output_file = '/path/to/your/tiff/file2.tif' # 创建一个QgsRasterLayer对象 layer2 = QgsRasterLayer(tiff_file, 'tiff_file') # 获取图层对象 layer = QgsProject.instance().mapLayersByName('Google')[0] # 检查图层是否有效 if layer2.isValid(): # 获取图层的范围属性 extent = layer2.extent() print('Min X:', extent.xMinimum()) print('Min Y:', extent.yMinimum()) print('Max X:', extent.xMaximum()) print('Max Y:', extent.yMaximum()) # 创建一个写入器对象 writer = QgsRasterFileWriter(output_file) pipe = QgsRasterPipe() provider = layer.dataProvider() pipe.set(provider.clone()) # 执行导出 if writer.writeRaster(pipe, layer2.width(), layer2.height(), extent, layer.crs(), QgsCoordinateTransformContext()): print("导出失败") else: print("导出成功") else: # 如果图层无效,则尝试直接读取范围属性 extent = QgsRasterLayer.extentFromUri(tiff_file) if extent is not None: print('Read extent from file directly!') print('Min X:', extent.xMinimum()) print('Min Y:', extent.yMinimum()) print('Max X:', extent.xMaximum()) print('Max Y:', extent.yMaximum()) else: print('Failed to read extent from file!')
8. 总结
这是一种半自动化的方式,好处时可以实时控制QGIS并实时将结果显示在QGIS中,缺点是在QGIS中写Python代码实在是有点难受,并且这是半自动化的步骤,很多情况是不能脱离QGIS Desktop运行的,尤其是使用了iface
接口的情况下
9. 参考资料
[1] PyQGIS开发者手册 (luolingchun.github.io)
[2] Welcome to the QGIS Python API documentation project
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)