You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用GDAL/QGIS批量合并不同文件夹的对应栅格波段?

批量合并栅格波段解决方案

Python + GDAL 实现(跨平台通用)

这个方案适配Windows、Linux、macOS,只需安装GDAL库即可完成批量处理。

步骤1:安装GDAL

未安装的话,先执行以下命令:

pip install gdal

注:部分系统需先安装系统级依赖,比如Ubuntu用sudo apt-get install gdal-bin libgdal-dev,macOS用brew install gdal

步骤2:编写处理脚本

创建merge_raster.py文件,内容如下:

from osgeo import gdal
import os

# 替换为实际文件夹路径
aa_folder = "/path/to/AA_folder"
bb_folder = "/path/to/BB_folder"
output_folder = "/path/to/Output_folder"

# 自动创建输出文件夹
os.makedirs(output_folder, exist_ok=True)

# 遍历所有序号
for idx in range(1, 15001):
    # 构造文件路径
    aa_path = os.path.join(aa_folder, f"AA_{idx}.tif")
    bb_path = os.path.join(bb_folder, f"BB_{idx}.tif")
    output_path = os.path.join(output_folder, f"Merged_{idx}.tif")
    
    # 跳过缺失的文件
    if not os.path.exists(aa_path) or not os.path.exists(bb_path):
        print(f"警告:序号{idx}的文件缺失,跳过")
        continue
    
    # 读取目标波段
    aa_ds = gdal.Open(aa_path)
    band1 = aa_ds.GetRasterBand(1)
    band2 = aa_ds.GetRasterBand(2)
    band3 = aa_ds.GetRasterBand(3)
    
    bb_ds = gdal.Open(bb_path)
    band4 = bb_ds.GetRasterBand(1)
    
    # 获取栅格基础信息
    cols = aa_ds.RasterXSize
    rows = aa_ds.RasterYSize
    proj = aa_ds.GetProjection()
    geotrans = aa_ds.GetGeoTransform()
    dtype = band1.DataType
    
    # 创建输出文件并写入波段
    driver = gdal.GetDriverByName("GTiff")
    output_ds = driver.Create(output_path, cols, rows, 4, dtype)
    output_ds.SetProjection(proj)
    output_ds.SetGeoTransform(geotrans)
    
    output_ds.GetRasterBand(1).WriteArray(band1.ReadAsArray())
    output_ds.GetRasterBand(2).WriteArray(band2.ReadAsArray())
    output_ds.GetRasterBand(3).WriteArray(band3.ReadAsArray())
    output_ds.GetRasterBand(4).WriteArray(band4.ReadAsArray())
    
    # 释放资源
    aa_ds = None
    bb_ds = None
    output_ds = None
    
    print(f"已完成序号{idx}的合并")

步骤3:运行脚本

修改脚本中的路径为实际路径后,执行:

python merge_raster.py

Bash 脚本实现(Linux/macOS)

习惯命令行的话,可通过gdalbuildvrt和gdal_translate组合完成批量处理:

创建merge_raster.sh文件:

#!/bin/bash

# 替换为实际文件夹路径
AA_DIR="/path/to/AA_folder"
BB_DIR="/path/to/BB_folder"
OUTPUT_DIR="/path/to/Output_folder"

mkdir -p $OUTPUT_DIR

for idx in {1..15000}
do
    AA_FILE="${AA_DIR}/AA_${idx}.tif"
    BB_FILE="${BB_DIR}/BB_${idx}.tif"
    OUTPUT_FILE="${OUTPUT_DIR}/Merged_${idx}.tif"
    
    if [ ! -f "$AA_FILE" ] || [ ! -f "$BB_FILE" ]; then
        echo "警告:序号${idx}的文件缺失,跳过"
        continue
    fi
    
    # 虚拟合并波段后转存为TIFF
    gdalbuildvrt -separate /tmp/temp.vrt "$AA_FILE" "$AA_FILE" "$AA_FILE" "$BB_FILE" -b 1 -b 2 -b 3 -b 1
    gdal_translate /tmp/temp.vrt "$OUTPUT_FILE"
    
    echo "已完成序号${idx}的合并"
done

rm /tmp/temp.vrt

赋予执行权限并运行:

chmod +x merge_raster.sh
./merge_raster.sh

注意事项

  • 脚本会自动跳过缺失对应序号的文件
  • 处理大文件时,Python脚本内存占用更低;Bash方案通过虚拟VRT避免内存过载
  • 如需调整输出TIFF的压缩参数,可在gdal_translate中添加-co COMPRESS=LZW,或在Python的driver.Create中传入对应参数

内容的提问来源于stack exchange,提问作者Elias B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:40:42