QGIS中下载遥感影像的Python代码片段

发布时间 2023-08-31 00:53:02作者: 当时明月在曾照彩云归

1. 引言

QGIS是开源免费且好用的GIS软件,并且可以使用Python脚本来控制

这里主要使用的打开QGIS时启动内置的Python解释器,这个Python解释器可以访问iface接口从而实现对QGIS Desktop的实时控制,如下图所示:

image-20230830233917428

本文主要记录一些使用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)