记录: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)安装、影像批量拼接、重投影和格式转换
4、如何在 Windows 11 上创建和打开批处理 (BAT) 文件
感谢以上参考内容给予的源码与注释支持,让本文在豆包的辅助下批处理MCE43A3数据;感谢博文、技术文创作者、豆包技术支持人员等。