如何用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
相关产品推荐
相关产品推荐

