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

[3] QGIS API Documentation: Qgis Class Reference

[4] Documentation (qgis.org)

QGIS中下载遥感影像的Python代码片段的更多相关文章

  1. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  2. Python 代码片段收藏

    list 列表相关 list 中最小值.最大值 import operator values = [1, 2, 3, 4, 5] min_index, min_value = min(enumerat ...

  3. 有用的Python代码片段

    我列出的这些有用的Python代码片段,为我节省了大量的时间,并且我希望他们也能为你节省一些时间.大多数的这些片段出自寻找解决方案,查找博客和StackOverflow解决类似问题的答案.下面所有的代 ...

  4. 在matlab中进行遥感影像地理坐标的相互转换

    在matlab中进行图像处理,一般使用的都是图像本地坐标,以左上角(1,1)开始.处理完成后,如果要将结果在带地理坐标的遥感影像中显示,或者需要输出成shp文件,就需要涉及到本地坐标和地理坐标的转换, ...

  5. 在matlab中实现遥感影像和shp文件的结合显示

    clc;close all;clear; road=shaperead('boston_roads.shp'); %读取shape文件 figure, mapshow('boston.tif'); % ...

  6. 2019-01-29 VS Code创建自定义Python代码片段

    续前文[日常]Beyond的歌里最多是"唏嘘"吗? - Python分词+词频最后的想法, 发现VS Code支持用户自定义代码片段: Creating your own snip ...

  7. Python - 代码片段,Snippets,Gist

    说明 代码片段来自网上搬运的或者自己写的 华氏温度转摄氏温度 f = float(input('请输入华氏温度: ')) c = (f - 32) / 1.8 print('%.1f华氏度 = %.1 ...

  8. 【转】利用Python中的mock库对Python代码进行模拟测试

    出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...

  9. 在代理中托管特殊方法的python代码实现

    任务简单的介绍是: 在新风格对象模型中,Python操作其实是在类中查找特殊方法的(经典对象是在实例中进行操作的),现在需要将一些新风格的实例包装到代理中,,此代理可以选择将一些特殊的方法委托给内部的 ...

  10. 在eclipse pydev中使用PEP8来规范python代码

    最近在写接口自动话时,代码要上研发的PEP8检查,所以没办法,在pydev中配置如下: 1.打开PEP检查 在pydev 2.3.0之后的版本都自带了pep8检查,但默认是没有开启的 Windows ...

随机推荐

  1. 使用SpeechRecognition进行语音识别

    操作系统 : CentOS7.7.1908_x64 gcc版本 :4.8.5 Python 版本 : 3.6.8 安装语音识别环境: virtualenv -p /usr/bin/python3 py ...

  2. 使用OpenWrt实现IPv6 DDNS

    OpenWrt 增加 crontab 任务 在/root/crontab/ 目录下, 创建脚本 ddns.sh #!/bin/sh # 远程php脚本的URL地址 SERVICE_URL=http:/ ...

  3. Neutron详解

    一:简介     一.概述 1. 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要创建.修改和删除网络 ...

  4. 关于动态抽样(Dynamic Sampling)

    关于动态抽样(Dynamic Sampling) 原文:http://www.oracle.com/technetwork/issue-archive/2009/09-jan/o19asktom-08 ...

  5. Oracle11gr2新增APPEND_VALUES提示

    在11.2中,Oracle新增了APPEND_VALUES提示,使得INSERT INTO VALUES语句也可以使用直接路径插入. 例子很简单: SQL> SELECT * FROM V$VE ...

  6. C++ 多线程的错误和如何避免(3)

    传递给 C++ 线程的构造函数的参数是通过值传递的 VS 平台:2019 问题:如何在线程中改变传递的参数值? 比如: #include <functional> #include < ...

  7. python文件加锁模块之fcntl

    # 示例 import fcntl with open('./test.txt', 'w') as f: fcntl.flock(f, fcntl.LOCK_EX) # 对文件加锁,除加锁进程外其它进 ...

  8. Kotlin 协程五 —— 在Android 中使用 Kotlin 协程

    目录 一.Android MVVM 结构 二.添加依赖 三.在后台线程中执行 3.1 协程解决了什么问题 3.2 保证主线程安全 3.3 withContext 的性能 四.结构化并发 4.1 追踪协 ...

  9. 在矩池云使用ChatGLM-6B & ChatGLM2-6B

    ChatGLM-6B 和 ChatGLM2-6B都是基于 General Language Model (GLM) 架构的对话语言模型,是清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同 ...

  10. Java 常见的两个错误 -------1.栈溢出 java.lang.StackOverflowError 2.堆溢出 java.lang.OutOfMemoryError /OOM

    1 package com.bytezero.exception; 2 3 /** 4 * 5 * @Description Error 6 * @author Bytezero·zhenglei! ...