MRT数据批处理MCD43A3-提取波段、镶嵌、投影、重采样、裁剪

169 阅读8分钟

记录:Windows 批处理脚本(Batch Script)

一、波段提取代码前提

前情提要:::代码运行前的准备工作: 1、MRT 工具安装: 确认 MRT (MODIS Reprojection Tool) 已正确安装在指定路径 (D:/ModisTools/bin/mrtmosaic.exe) 检查 MRT 配置文件目录 (D:\ModisTools\data) 是否存在且包含必要的参数文件 2、数据准备与要求: MRT进行批处理时,所有路径必须为英文,要求数据格式为HDF 确保源 HDF 文件存在于指定目录 (G:\MCD43A3\2021) 文件名应符合脚本中的匹配模式 (YYYYDDD.*.hdf),其中 YYYY 是年份,DDD 是年积日,原始下载数据名称 3、目录结构: 确保输出目录 (G:\MCD43A3\test\2021_COM\WSA2 和 G:\MCD43A3\test\2021_COM\QA2) 不需要管理员权限 工作目录 (G:\MCD43A3\test\2021workplace) 可写入、这里主要是hdf文件夹内的文件名称文档 MOSAICINPUT.txt 4、环境配置: Windows 系统权限足够执行批处理脚本(普通权限即可) 中文显示正常(chcp 65001 设置 UTF-8 代码页)、保证在CMD中显示是正常的中文格式(不重要,也可以删除代码中的全部中文)

MOSAICINPUT.txt的Python代码:

import os
from rich.progress import Progress, SpinnerColumn, BarColumn, TextColumn

def save_filenames_to_txt(folder_path, output_file, extension='.hdf'):
    """
    将指定文件夹中的所有特定后缀文件名称保存到txt文件中
    
    参数:
    folder_path (str): 要扫描的文件夹路径
    output_file (str): 保存文件名的txt文件路径
    extension (str): 要筛选的文件后缀,默认为'.hdf'
    """
    try:
        # 检查文件夹是否存在
        if not os.path.exists(folder_path):
            print(f"错误: 文件夹 '{folder_path}' 不存在")
            return
        
        # 获取文件夹中的所有文件名称
        all_files = os.listdir(folder_path)
        
        # 筛选指定后缀的文件
        filtered_files = [f for f in all_files if f.endswith(extension)]
        
        if not filtered_files:
            print(f"警告: 文件夹中未找到后缀为 '{extension}' 的文件")
            return
        
        # 显示进度条
        with Progress(
            SpinnerColumn(),
            TextColumn("[progress.description]{task.description}"),
            BarColumn(bar_width=None),
            TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
            transient=True
        ) as progress:
            task = progress.add_task("[cyan]正在写入文件...", total=len(filtered_files))
            
            # 写入txt文件
            with open(output_file, 'w', encoding='utf-8') as f:
                for filename in filtered_files:
                    f.write(filename + '\n')
                    progress.update(task, advance=1)
        
        print(f"已成功将 {len(filtered_files)}{extension} 文件名称保存到 {output_file}")
        
    except Exception as e:
        print(f"发生错误: {e}")

if __name__ == "__main__":
    # 配置参数
    folder_to_scan = "G:/MCD43A3/2021/"    # 要扫描的文件夹路径
    output_txt_file = "G:/MCD43A3/test/2021workplace/MOSAICINPUT.txt"  # 输出的txt文件名称
    file_extension = '.hdf'  # 指定要筛选的文件后缀
    
    # 执行保存操作
    save_filenames_to_txt(folder_to_scan, output_txt_file, file_extension)

MCD43A3波段提取命令行代码: 复制到 batch.txt,更改文件扩展名为 batch.bat(修改文件扩展名,可百度、或者notepad直接保存为batch.bat)

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

:: 配置区域
set "MRTDATADIR=D:\ModisTools\data"
set "HDFDIR=G:\MCD43A3\2021"
set "WORKDIR=G:\MCD43A3\test\2021workplace"
set /a START_DAY=2021001
set /a END_DAY=2021366

:: WSA配置
set "WSA_OUTPUTDIR=G:\MCD43A3\test\2021_COM\WSA2"
set "WSA_QA_FLAG=_WSA"
:: 根据自己下载的数据,用hdf查看有多少波段,需要提取哪一个波段,然后设置为1即可;如MCD43A3是30个波段,我需要前7波段和后第4-10波段
set "WSA_SUBSET=0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0"

:: QA配置
set "QA_OUTPUTDIR=G:\MCD43A3\test\2021_COM\QA2"
set "QA_QA_FLAG=_QA"
:: 根据自己下载的数据,用hdf查看有多少波段,需要提取哪一个波段,然后设置为1即可
set "QA_SUBSET=1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"

set "MRTTOOL=D:/ModisTools/bin/mrtmosaic.exe"

:: 创建输出目录和工作目录
if not exist "%WSA_OUTPUTDIR%" mkdir "%WSA_OUTPUTDIR%"
if not exist "%QA_OUTPUTDIR%" mkdir "%QA_OUTPUTDIR%"
if not exist "%WORKDIR%" mkdir "%WORKDIR%"

:: 主循环
set /a CURRENT_DAY=START_DAY
:PROCESS_LOOP
if !CURRENT_DAY! gtr !END_DAY! goto FINISH

echo 处理日期: !CURRENT_DAY!

:: 处理WSA数据
call :PROCESS_DATA "%WSA_OUTPUTDIR%" "%WSA_QA_FLAG%" "%WSA_SUBSET%"

:: 处理QA数据
call :PROCESS_DATA "%QA_OUTPUTDIR%" "%QA_QA_FLAG%" "%QA_SUBSET%"

:: 增加日期
set /a CURRENT_DAY+=1
goto PROCESS_LOOP

:PROCESS_DATA
set "OUTPUTDIR=%~1"
set "QA_FLAG=%~2"
set "SUBSET=%~3"

set "INPUT_FILE=%WORKDIR%\MOSAICINPUT_!CURRENT_DAY!%QA_FLAG%.TXT"
set "OUTPUT_HDF=%OUTPUTDIR%\MOSAIC_!CURRENT_DAY!!QA_FLAG!.hdf"

:: 创建输入文件列表
dir "%HDFDIR%\*!CURRENT_DAY!.*.hdf" /a/b/s > "!INPUT_FILE!" 2>nul

if exist "!INPUT_FILE!" (
    echo 找到 !CURRENT_DAY! 的 HDF 文件,开始%QA_FLAG:~1%拼接...
    
    :: 直接将结果输出到目标文件夹
    "%MRTTOOL%" -i "!INPUT_FILE!" -s "%SUBSET%" -o "!OUTPUT_HDF!"
    
    if exist "!OUTPUT_HDF!" (
        echo 日期 !CURRENT_DAY! 的%QA_FLAG:~1%数据处理完成
    ) else (
        echo 错误: MRT 处理%QA_FLAG:~1%数据失败,未生成输出文件
    )
    
    :: 删除输入文件列表
    del "!INPUT_FILE!" 2>nul
) else (
    echo 警告: 未找到 !CURRENT_DAY! 的 HDF 文件用于%QA_FLAG:~1%处理
)
exit /b

:FINISH
echo.
echo 处理完成!
echo WSA结果保存在: %WSA_OUTPUTDIR%
echo QA结果保存在: %QA_OUTPUTDIR%
dir "%WSA_OUTPUTDIR%\MOSAIC_*%WSA_QA_FLAG%.hdf" /b
dir "%QA_OUTPUTDIR%\MOSAIC_*%QA_QA_FLAG%.hdf" /b
pause

二、批量投影、重采样、裁剪(与第一部分成套使用)

代码运行前提: 1、需要根据MRT保存一份参数文件,如下图所示: T图1在这里插入图片描述 上图6中的子图:只需要修改Datum:WGS84 ,然后OK就可以 在这里插入图片描述

1、输入文件; 2、选择波段B1-B7,共7个波段; 3、裁剪范围;使用经纬度进行裁剪 4、输出类型:GEOTIFF; 5、投影类型选择Geographic; 6、点击打开子图中修改WGS84就可以 ; 7、输出像元大小 0.05度; 8、保存为参数文件(重要获取内容)——我的参数文件之一:


INPUT_FILENAME = G:\MCD43A3\test\2021_COM\QA\MOSAIC_2021001_QA.hdf

SPECTRAL_SUBSET = ( 1 1 1 1 1 1 1 )

SPATIAL_SUBSET_TYPE = INPUT_LAT_LONG

SPATIAL_SUBSET_UL_CORNER = ( 45.0 100.0 )
SPATIAL_SUBSET_LR_CORNER = ( 18.0 125.0 )

OUTPUT_FILENAME = G:\MCD43A3\test\reproject\.tif

RESAMPLING_TYPE = NEAREST_NEIGHBOR

OUTPUT_PROJECTION_TYPE = GEO

OUTPUT_PROJECTION_PARAMETERS = ( 
 0.0 0.0 0.0
 0.0 0.0 0.0
 0.0 0.0 0.0
 0.0 0.0 0.0
 0.0 0.0 0.0 )

DATUM = WGS84

OUTPUT_PIXEL_SIZE = 0.005

MCD43A3投影、重采样、裁剪命令行代码:

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

:: 配置区域 - 根据实际情况修改
:: MRT安装的路径以及data数据路径
set "MRTDATADIR=D:\ModisTools\data"
:: hdf输入路径 和 tif输出路径
set "INPUT_DIR=G:\MCD43A3\test\2021_COM\QA"
set "OUTPUT_DIR=G:\MCD43A3\test\reproject"
:: 单一PRM参考文件
set "PRM_FILE=G:\MCD43A3\test\2021workplace\parament\mcd43a3_qa_sin_to_geo.prm"  
:: 重采样路径,在MRT安装路径下面寻找
set "MRTTOOL=D:/ModisTools/bin/resample.exe"
:: 处理日志,可不需要,MRT本身就有日志生成
set "LOG_FILE=%OUTPUT_DIR%\reprojection_log.txt"

:: 以上内容根据按照路径的要求修改;
:: 下面的代码如果不需要修改文件名称,一般不需要修改,输出文件名称是根据 参数文件中输出文件名称的前缀 + MRT提取各波段名称;

:: 设置MRT环境变量
set "PATH=%PATH%;%MRTDATADIR%\bin"

:: 创建输出目录和日志文件
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"
echo 开始批量投影转换: %date% %time% > "%LOG_FILE%"

:: 检查PRM文件是否存在
if not exist "%PRM_FILE%" (
    echo 错误: PRM参考文件 "%PRM_FILE%" 不存在!
    echo 错误: PRM参考文件 "%PRM_FILE%" 不存在! >> "%LOG_FILE%"
    goto :EOF
) else (
    echo 使用PRM参考文件: "%PRM_FILE%" >> "%LOG_FILE%"
)

:: 统计文件数量
set /a FILE_COUNT=0
for %%f in ("%INPUT_DIR%\*.hdf") do set /a FILE_COUNT+=1

echo 找到 %FILE_COUNT% 个HDF文件需要处理 >> "%LOG_FILE%"
echo 开始处理...

:: 初始化计数器
set /a PROCESSED=0
set /a FAILED=0

:: 遍历输入目录中的所有HDF文件
for %%f in ("%INPUT_DIR%\*.hdf") do (
    set "INPUT_FILE=%%f"
    set "FILENAME=%%~nf"
    
    echo.
    echo 正在处理: !FILENAME!.hdf
    echo 正在处理: !FILENAME!.hdf >> "%LOG_FILE%"
    
    :: 构建输出文件路径(修改为.tif扩展名)
    set "OUTPUT_FILE=%OUTPUT_DIR%\!FILENAME!.tif"
    
    :: 执行投影转换(输出为GeoTIFF格式)
    "%MRTTOOL%" -p "%PRM_FILE%" -i "!INPUT_FILE!" -o "!OUTPUT_FILE!"
    
    :: 检查处理结果
    if exist "!OUTPUT_FILE!" (
        echo 投影转换成功: !OUTPUT_FILE!
        echo 投影转换成功: !OUTPUT_FILE! >> "%LOG_FILE%"
        set /a PROCESSED+=1
    ) else (
        echo 投影转换失败: !INPUT_FILE!
        echo 投影转换失败: !INPUT_FILE! >> "%LOG_FILE%"
        set /a FAILED+=1
    )
)

echo.
echo ======================================
echo 批量投影转换完成!
echo 共处理: %FILE_COUNT% 个文件
echo 成功: %PROCESSED%
echo 失败: %FAILED%
echo 日志文件: %LOG_FILE%
echo 结果保存在: %OUTPUT_DIR%
echo ======================================

:: 将处理结果追加到日志文件
echo. >> "%LOG_FILE%"
echo ====================================== >> "%LOG_FILE%"
echo 批量投影转换完成: %date% %time% >> "%LOG_FILE%"
echo 共处理: %FILE_COUNT% 个文件 >> "%LOG_FILE%"
echo 成功: %PROCESSED% >> "%LOG_FILE%"
echo 失败: %FAILED% >> "%LOG_FILE%"
echo ====================================== >> "%LOG_FILE%"

pause

最终运行结果展示图:(已裁剪,已重采样) 在这里插入图片描述 本篇仅用于记录。

参考链接:

1、MRT(MODIS Reprojection Tool)安装、影像批量拼接、重投影和格式转换

2、利用MRT对MODIS数据进行批量重投影+批量波段合成

3、Windows批处理(cmd/bat)常用命令教程

4、如何在 Windows 11 上创建和打开批处理 (BAT) 文件

5、豆包AI代码编程辅助

感谢以上参考内容给予的源码与注释支持,让本文在豆包的辅助下批处理MCE43A3数据;感谢博文、技术文创作者、豆包技术支持人员等。