1. 引言

之前的文章:QGIS中下载遥感影像的Python代码片段 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com),记述了在 QGIS 的 Python Console 中使用Python代码操作QGIS Desktop进行遥感影像的下载

上述这个方式的弊端之一就是需要在QGIS Desktop中进行操作,是一种半自动化的操作,有没有一种全自动化的脚本方式呢?

答案就是使用PyQGIS来实现

PyQGIS是QGIS 的Python绑定(QGIS是C++编写),使用PyQGIS可以实现对QGIS功能模块的访问与操作

本文主要记录使用PyQIS来实现在线遥感影像的加载与下载

如果需要实现批量下载,只需添加一下循环代码即可

2. 加载在线遥感影像

笔者使用的是PyCharm,首先需要将Python解释器设置为QGIS的Python解释器

如下图所示,设置为QGIS安装包下的bin下的python-qgis-ltr.bat(这个文件会包含了需要设置Python环境):

使用PyQGIS实现在线影像的加载,加载的是XYZ格式的在线瓦片地图,基于WMS服务

from PyQt5.QtWidgets import QMainWindow
from qgis.core import QgsRasterLayer
from qgis.core import QgsProject
from qgis.core import QgsApplication
from qgis.gui import QgsMapCanvas if __name__ == '__main__': # 初始化QGIS应用程序
QgsApplication.setPrefixPath("D:\\QGIS 3.22.5\\apps\\qgis-ltr", True)
qgs = QgsApplication([], False)
qgs.initQgis() # 创建QGIS窗口和地图视图
window = QMainWindow()
canvas = QgsMapCanvas()
window.setCentralWidget(canvas)
window.show() # 加载地图图层
# 定义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.") # 设置地图显示范围
canvas.setExtent(layer.extent())
canvas.setLayers([layer]) # 刷新地图视图
canvas.refresh() # 运行QGIS应用程序事件循环
qgs.exec_()

加载结果如下,可以进行缩放、平移的基础操作:

3. 下载遥感影像

使用PyQGIS调用QgsRasterFileWriter来实现遥感影像下载:

import os
from PyQt5.QtWidgets import QApplication, QMainWindow
from qgis.core import QgsRasterPipe
from qgis.core import QgsRasterFileWriter
from qgis.core import QgsRasterLayer
from qgis.core import QgsProject
from qgis.core import QgsApplication
from qgis.gui import QgsMapCanvas if __name__ == "__main__": QgsApplication.setPrefixPath("D:\\QGIS 3.22.5\\apps\\qgis-ltr", True)
qgs = QgsApplication([], True)
qgs.initQgis() app = QApplication([]) # 创建主窗口
window = QMainWindow() # 创建地图画布
canvas = QgsMapCanvas()
window.setCentralWidget(canvas) # 定义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_google = QgsRasterLayer(xyz_url, "Google", "wms") # 检查图层是否加载成功
if layer_google.isValid():
# 将图层添加到当前项目
QgsProject.instance().addMapLayer(layer_google)
print("XYZ Map layer added successfully.")
else:
print("Failed to load XYZ Map layer.") # 定义瓦片的大小(像素)
tile_size = 512
output_folder = "/path/to/your/tiff" # 创建输出文件夹
os.makedirs(output_folder, exist_ok=True) # 下载Google地图
# 创建一个写入器对象
output_tile = os.path.join(output_folder, f'test.tif')
writer = QgsRasterFileWriter(output_tile) # 定义导出范围
pipe = QgsRasterPipe()
provider = layer_google.dataProvider()
pipe.set(provider.clone())
writer.writeRaster(pipe, tile_size, tile_size, layer_google.extent(), layer_google.crs()) # 释放资源
del writer # # 显示主窗口
# window.show()
#
# # 启动应用程序主事件循环
# app.exec_() qgs.exitQgis()

下载的test.tif如下图所示:

上述代码是加载的在线Google地图下载为512*512像素的GeoTiff,投影坐标系为在线Google地图的坐标系,也就是EPSG3857

通常,可以加载另一个参考文件,如某省的轮廓的shp文件,然后获取这个参考文件的范围extent,从而进行对应的遥感影像下载

在代码中添加一些循环条件就可以实现批量下载遥感影像

4. 总结

使用PyQGIS的方式,实现了自动化的遥感影像下载,可以在无桌面环境的方式下进行

一开始笔者想使用Python来控制QGIS Desktop,比如,运行PyQIS会启动一个QGIS Desktop,在PyQGIS中加载地图则会显示在QGIS Desktop中

实际操作下来应该是不可行的,笔者上述的PyQGIS的在线地图显示是基于QT的QMainWindow实现的

亦可能是哪里没操作正确,如果知道敬请告知

不过也不是什么大问题,使用PyQGIS的本意就是想使用脚本来自动化以及使用一个IDE来写代码,而不是在QGIS Desktop的Python Console中编写代码片段

5. 参考资料

[1] PyQGIS开发者手册 (luolingchun.github.io)

[2] Welcome to the QGIS Python API documentation project

[3] QGIS API Documentation: Qgis Class Reference

[4] Documentation (qgis.org)

基于PyQGIS实现遥感影像下载的更多相关文章

  1. 基于GDAL的遥感影像显示(C#版)

    基于GDAL的遥感影像显示(C#版) - 菜菜的专栏 - 博客频道 - CSDN.NET  http://blog.csdn.net/RSyaoxin/article/details/9220735

  2. Python核对遥感影像批量下载情况的方法

      本文介绍批量下载遥感影像时,利用Python实现已下载影像文件的核对,并自动生成未下载影像的下载链接列表的方法.   批量下载大量遥感影像数据对于GIS学生与从业人员可谓十分常见.然而,对于动辄成 ...

  3. 基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!

    1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (G ...

  4. Earthdata批量下载MODIS遥感影像的方法

      本文介绍在Earthdata网站中,批量下载MODIS遥感影像的方法.   首先,打开网页:https://search.earthdata.nasa.gov/search ,如果没有Earthd ...

  5. 批量下载Landsat遥感影像的方法

      本文介绍在USGS网站批量下载Landsat系列遥感影像的方法.   首先,打开EarthExplorer的官网,首先完成注册与登录.   接下来,点击左侧"Search Criteri ...

  6. DGIS之遥感影像数据获取

    1.概要 在GIS圈的同行或多或少接触过遥感,记得在大学老师就说过"数据是GIS的核心".本文介绍在国内下载遥感影像的方法. 地理空间数据云,这个是中科院计算机网络中心建设的一个免 ...

  7. 遥感影像和DEM数据获取处理、GeoServer切片发布并使用Cesium加载

    1. 数据获取 笔者这里使用的是哨兵一号(Sentinel-1).ALOS的遥感影像和ALOS的DEM数据 下载地址为:ASF Data Search (alaska.edu) ASF(Alaska ...

  8. Python gdal读取MODIS遥感影像并结合质量控制QC波段掩膜数据

      本文介绍基于Python中GDAL模块,实现MODIS遥感影像数据的读取.计算,并基于质量控制QC波段进行图像掩膜的方法.   前期的文章Python GDAL读取栅格数据并基于质量评估波段QA对 ...

  9. 遥感影像滤波处理软件 — timesat3.2

    最近因为要做遥感影像的滤波处理,经过女神推荐,决定用Timesat,可是该软件3.1版本只适合xp系统以及2011的matlab,后来在官网上找到了最新的3.2版本.支持64位操作系统以及2014的m ...

  10. 地理空间数据云--TM影像下载

    实验要用到遥感影像,,TM,,之前是可以在美国USGS上下载的,但是要FQ了,有点麻烦,, 想到之前本科实在地理空间数据云平台下载的,就试了一下以前的账号,完美!,, TM数据很丰富,到2017年的都 ...

随机推荐

  1. [Docker] Dockerfile常用保留字

    FROM 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板.第一条必须是from MAINTAINER 镜像维护者的姓名和邮箱地址 RUN 容器构建时需要运行的命令,也就是在 do ...

  2. LVM(逻辑卷管理器)

    目录 一.LVM概述 二.基本术语 三.PE.PV.VG.LV之间的关系 四.LVM的工作原理 五.LVM的使用 1.部署逻辑卷 第一步: 还原快照,并在虚拟机添加两块新硬盘设备,开机 第二步: 让新 ...

  3. 解决highlightjs中纯文本被解析成HTML无法展示的问题,记一次工作中bug修复的思考

    壹 ❀ 引 在本周迭代bug修复工作中,遇到了两个比较头疼的bug(同一个客户所提),bug问题描述也很奇怪,客户表示产品的富文本编辑器里的代码块功能,在纯文本语言模式下贴特定代码进去有的看不见,有的 ...

  4. 【Unity3D】Photon环境搭建

    1 简介 ​ Photon 是一个泛用性的 ScoketServer 套装软件,可用于多人在线游戏.聊天室.大厅游戏,并同时支持 Windows.Unity3D.iOS.Android.Flash 等 ...

  5. 硬件开发笔记(十四):RK3568底板电路LVDS模块、MIPI模块电路分析、LVDS硬件接口、MIPI硬件接口详解

    前言   本篇继续分析底板原理图mipi/lvds屏幕电路原理图.硬件接口详解.   LVDS与MIPI的区别   液晶屏有RGB TTL.LVDS.MIPI.HDMI接口,这些接口区别于信号的类型( ...

  6. OpenCV开发笔记(六十三):红胖子8分钟带你深入了解SIFT特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. ASP.NET Core 微信支付(一)【统一下单 APIV3】

    官方参考资料 签名:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0.shtml 签名生成:https://wechatp ...

  8. Go中响应式编程库github.com/ReactiveX/RxGo详细介绍

    最近的项目用到了 RxGo ,因为之前从没有接触过,特意去学了学,特此记录下.文章很多内容是复制了参考资料或者官方文档.如果涉及侵权,请联系删除,谢谢. 1.RxGo简介 1.1 基础介绍 RxGo是 ...

  9. 【Azure App Service】通过Visual Studio部署Azure App Service 遇见 401 'Unauthorized'错误

    问题描述 最近通过Visual Studio 2022部署Azure App Service的时候,突然遇见了部署失败, 401 Unauthorized错误. 错误消息: Build started ...

  10. mysql-对应删除 dict 脚本

    -- 1. 此 dict 是在不同租户下的数据字典,查询时需要根据 departid 进行分类查询 -- 2. 删除dict, dict分类主表类型与挂载的子表数据 -- 3. 通过查询到的主表的 g ...