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
[3] QGIS API Documentation: Qgis Class Reference
QGIS中下载遥感影像的Python代码片段的更多相关文章
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- Python 代码片段收藏
list 列表相关 list 中最小值.最大值 import operator values = [1, 2, 3, 4, 5] min_index, min_value = min(enumerat ...
- 有用的Python代码片段
我列出的这些有用的Python代码片段,为我节省了大量的时间,并且我希望他们也能为你节省一些时间.大多数的这些片段出自寻找解决方案,查找博客和StackOverflow解决类似问题的答案.下面所有的代 ...
- 在matlab中进行遥感影像地理坐标的相互转换
在matlab中进行图像处理,一般使用的都是图像本地坐标,以左上角(1,1)开始.处理完成后,如果要将结果在带地理坐标的遥感影像中显示,或者需要输出成shp文件,就需要涉及到本地坐标和地理坐标的转换, ...
- 在matlab中实现遥感影像和shp文件的结合显示
clc;close all;clear; road=shaperead('boston_roads.shp'); %读取shape文件 figure, mapshow('boston.tif'); % ...
- 2019-01-29 VS Code创建自定义Python代码片段
续前文[日常]Beyond的歌里最多是"唏嘘"吗? - Python分词+词频最后的想法, 发现VS Code支持用户自定义代码片段: Creating your own snip ...
- Python - 代码片段,Snippets,Gist
说明 代码片段来自网上搬运的或者自己写的 华氏温度转摄氏温度 f = float(input('请输入华氏温度: ')) c = (f - 32) / 1.8 print('%.1f华氏度 = %.1 ...
- 【转】利用Python中的mock库对Python代码进行模拟测试
出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...
- 在代理中托管特殊方法的python代码实现
任务简单的介绍是: 在新风格对象模型中,Python操作其实是在类中查找特殊方法的(经典对象是在实例中进行操作的),现在需要将一些新风格的实例包装到代理中,,此代理可以选择将一些特殊的方法委托给内部的 ...
- 在eclipse pydev中使用PEP8来规范python代码
最近在写接口自动话时,代码要上研发的PEP8检查,所以没办法,在pydev中配置如下: 1.打开PEP检查 在pydev 2.3.0之后的版本都自带了pep8检查,但默认是没有开启的 Windows ...
随机推荐
- NC17889 新建 Microsoft Office Word 文档
题目链接 题目 题目描述 CSL正在学习<计算机办公自动化>文件的建立与删除. CSL发现,当他新建一个word文档时,会得到一个名为"新建 Microsoft Office W ...
- java 注解结合 spring aop 实现日志traceId唯一标识
MDC 的必要性 日志框架 日志框架成熟的也比较多: slf4j log4j logback log4j2 我们没有必要重复造轮子,一般是建议和 slf4j 进行整合,便于后期替换为其他框架. 日志的 ...
- 【Unity3D】边缘检测特效
1 边缘检测原理 边缘检测的原理是:检测每个像素周围的像素亮度差,如果亮度差异较大,就将该像素识别为边缘,并进行边缘着色. 本文完整资源见→Unity3D边缘检测特效. 使用过卷积神经网络 ...
- 【笔记】css —— BFC 原理
一.什么是 BFC BFC 即 Block Formatting Contexts (块级格式化上下文),具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素 ...
- OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正
前言 相机标定,重映射可以进行插值映射从而矫正图像,这是一种方法,也有矩阵映射方法,本篇使用重映射方式解说畸变矫正的计算原理. Demo 横向纵向区域固定拉伸: 横向纵向拉伸: ...
- 迭代器,map,filter,reduce,sorted函数---day12
1.迭代器 迭代器能被next调用,并不断返回下一个值的对象,叫作迭代器(迭代器是对象) 概念:迭代器指的是迭代取值的工具,迭代是一个重复的过程每次重复都是基于上一次的结果而继续单纯的重复不是迭代. ...
- Swift高级进阶-Swift编译过程,”SIL代码“,“IR语法”
swift编译过程 如果不懂LLVM,Clang的同学可以去了解下它的知识点 一些文章中有详细介绍 OC 的编译过程 ,本文来探索一下 Swift 的编译过程.Swift 的编译过程中使用 Swif ...
- 面试官上来就让手撕HashMap的7种遍历方式,当场愣住,最后只写出了3种
写在开头 今天有个小伙伴私信诉苦,说面试官上来就让他手撕HashMap的7种遍历方式,最终只写出3种常用的,怀疑面试官是在故意***难.这个问题大家怎么看? 反正我个人感觉这肯定不是***难,&quo ...
- rt_snprintf()是什么
在c++中snprintf()函数的解释 1,函数原型: int snprintf(char* dest_str,size_t size,const char* format,...); 2,功能 将 ...
- 通过Glide加载不可见的图片
今天遇到一个需求,需要点击分享的时候生成图片以及二维码. 即:将带有图片以及二维码的布局文件生成Bitmap,当然这个布局文件是后台生成的,并不可见,这时候会发现使用Glide加载图片没有反应. 源码 ...