QGIS批量将分幅遥感影像合并

要在QGIS中编程实现批量将分幅遥感影像拼接成完整影像,可以按照以下步骤进行操作:

1. 首先,确保已经安装并正确配置了QGIS Python环境,并导入所需的库。以下是代码的导入部分:


from qgis.core import QgsProject, QgsRasterLayer, QgsRectangle, QgsMapSettings, QgsVectorLayer
 

2. 定义要使用的文件夹和文件名模式,以及最终输出拼接影像的文件名。代码如下:


import os

# 分幅影像所在文件夹路径
input_folder = '/path/to/input_folder'
# 分幅影像文件名模式(假设文件名模式为IMG_xxx.tif)
filename_pattern = 'IMG_{}.tif'
# 最终输出拼接影像的文件名
output_filename = 'merged_image.tif'
# 最终输出拼接影像的保存路径
output_path = '/path/to/output_folder/' + output_filename
 

请根据实际情况修改上述路径和文件名模式。

3. 创建一个空白的地图设置对象(`QgsMapSettings`),用于定义合成影像的范围和分辨率。代码如下:


# 创建地图设置对象
map_settings = QgsMapSettings()
# 设置输出影像的分辨率(单位:米/像素)
resolution = 10.0
map_settings.setOutputDpi(300) # 输出影像的 DPI

# 定义合成影像的范围
xmin = 0
ymin = 0
xmax = 10000  # 自定义合适的范围
ymax = 10000  # 自定义合适的范围
extent = QgsRectangle(xmin, ymin, xmax, ymax)
# 设置地图设置对象的范围和分辨率
map_settings.setExtent(extent)
map_settings.setLayers([layer])  # 将图层添加到地图设置对象中(如果需要渲染器进行绘制)

# 计算合成影像的大小(宽度和高度)
width = int(extent.width() / resolution)
height = int(extent.height() / resolution)
map_settings.setOutputSize(QSize(width, height))
 

4. 创建一个QgsProject对象,并加载分幅影像作为栅格图层。代码如下:


# 创建项目对象
project = QgsProject().instance()

# 遍历分幅影像文件
for i in range(1, num_of_images + 1):  # 根据实际情况修改循环条件
    # 构建分幅影像文件的路径
    file_path = os.path.join(input_folder, filename_pattern.format(i))

    # 加载分幅影像为栅格图层
    layer = QgsRasterLayer(file_path, 'Image {}'.format(i))
    project.addMapLayer(layer)

# 在地图设置对象上设置图层
map_settings.setLayers(project.mapLayers().values())
 

请根据实际情况修改示例代码中的循环条件和文件路径。

5. 调用`QgsMapRendererCustomPainterJob`将分幅影像渲染为一个完整的影像。代码如下:


# 创建绘制作业对象
job = QgsMapRendererCustomPainterJob(map_settings)

# 运行绘制作业
image = QImage(map_settings.outputSize(), QImage.Format_ARGB32_Premultiplied)
image.fill(Qt.transparent)
painter = QPainter(image)
job.render(painter)
painter.end()
 

6. 将合成影像保存到指定路径。代码如下:


# 保存合成影像
image.save(output_path)
 

完成以上步骤后,将获得一个包含所有分幅影像拼接而成的完整影像,并且可以根据需要进行保存和处理。请注意按照实际情况修改示例代码中的文件夹路径。

猜你喜欢

转载自blog.csdn.net/weixin_58851039/article/details/131389673