基于PyQGIS实现遥感影像下载

基于,pyqgis,实现,遥感,影像,下载 · 浏览次数 : 15

小编点评

**使用PyQGIS实现在线遥感影像下载** ```python import os from PyQt5.QtWidgets import QApplication, QMainWindow from qgis.core import QgsRasterLayer, QgsRasterPipe, QgsRasterFileWriter 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_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.") # 设置地图显示范围 canvas.setExtent(layer_google.extent()) canvas.setLayers([layer_google]) # 刷新地图视图 canvas.refresh() # 运行QGIS应用程序事件循环 qgs.exec_() ``` **下载遥感影像的步骤:** 1. 获取在线遥感影像的URL。 2. 创建输出文件夹并设置输出大小。 3. 创建输出文件并写入遥感影像数据。 4. 释放资源。 **注意:** * 确保 QGIS 的 Python 解释器已设置到 QGIS 安装包下的 bin 文件中。 * 可以在 PyQGIS 中使用其他方法来获取遥感影像数据,例如从 GeoTIFF 文件中读取数据。 * 可以根据需要修改代码中的输出路径和文件格式。

正文

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环境):

image-20230831110530392

使用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_()

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

image-20230831103820155

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如下图所示:

image-20230831110105930

上述代码是加载的在线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实现遥感影像下载相似的内容:

基于PyQGIS实现遥感影像下载

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

基于 .net core 8.0 的 swagger 文档优化分享-根据命名空间分组显示

之前也分享过 Swashbuckle.AspNetCore 的使用,不过版本比较老了,本次演示用的示例版本为 .net core 8.0,从安装使用开始,到根据命名空间分组显示,十分的有用

跟我一起学习和开发动态表单系统-前端用vue、elementui实现方法(3)

基于 Vue、Element UI 和 Spring Boot + MyBatis 的动态表单系统前端实现解析 在现代企业信息系统中,动态表单是一种非常常见的功能。它可以根据业务需求灵活地调整表单结构,以满足不同的数据收集和展示需求。在本文中,我们将探讨一种基于 Vue、Element UI 和 S

基于Bootstrap Blazor开源的.NET通用后台权限管理系统

前言 今天大姚给大家分享一个基于Bootstrap Blazor开源的.NET通用后台权限管理系统,后台管理页面兼容所有主流浏览器,完全响应式布局(支持电脑、平板、手机等所有主流设备),可切换至 Blazor 多 Tabs 模式,权限控制细化到网页内任意元素(按钮、表格、文本框等等):Bootstr

基于Chrome扩展的浏览器可信事件与网页离线PDF导出

基于Chrome扩展的浏览器可信事件与网页离线PDF导出 Chrome扩展是一种可以在浏览器中添加新功能和修改浏览器行为的软件程序,我们可以基于Manifest规范的API实现对于浏览器和Web页面在一定程度上的修改,例如广告拦截、代理控制等。Chrome DevTools Protocol则是Ch

基于cifar数据集合成含开集、闭集噪声的数据集

前言 噪声标签学习下的一个任务是:训练集上存在开集噪声和闭集噪声;然后在测试集上对闭集样本进行分类。 训练集中被加入的开集样本,会被均匀得打上闭集样本的标签充当开集噪声;而闭集噪声的设置与一般的噪声标签学习一致,分为对称噪声:随机将闭集样本的标签替换为其他类别;和非对称噪声:将闭集样本的标签替换为特

基于 JuiceFS 构建高校 AI 存储方案:高并发、系统稳定、运维简单

中山大学的 iSEE 实验室(Intelligence Science and System) Lab)在进行深度学习任务时,需要处理大量小文件读取。在高并发读写场景下,原先使用的 NFS 性能较低,常在高峰期导致数据节点卡死。此外,NFS 系统的单点故障问题也导致一旦数据节点宕机,该机器上的数据将

基于Python和TensorFlow实现BERT模型应用

本文分享自华为云社区《使用Python实现深度学习模型:BERT模型教程》,作者: Echo_Wish。 BERT(Bidirectional Encoder Representations from Transformers)是Google提出的一种用于自然语言处理(NLP)的预训练模型。BERT

基于 Cloudflare Workers 和 cloudflare-docker-proxy 搭建镜像加速服务

本文主要介绍了如何基于 Cloudflare Workers 和 cloudflare-docker-proxy 搭建 dockerhub、gcr、quay 等镜像加速服务。 最近,受限于各种情况,部分主流镜像站都关了,为了能够正常使用,建议自己搭建一个加速器。 写文之前,也已经部署好了一个,可以直

Vite-Wechat网页聊天室|vite5.x+vue3+pinia+element-plus仿微信客户端

基于Vue3+Pinia+ElementPlus仿微信网页聊天模板Vite5-Vue3-Wechat。 vite-wechat使用最新前端技术vite5+vue3+vue-router@4+pinia+element-plus搭建网页端仿微信界面聊天系统。包含了聊天、通讯录、朋友圈、短视频、我的等功