简介这份资源面向从事遥感与地球科学分析的科研人员和学生提供利用MRTMODIS Reprojection Tool对MODIS数据进行批处理重投影与数据集提取的脚本工具。MODIS数据广泛用于气候研究、环境监测与资源管理而MRT可将原始HDF-EOS格式转换为GeoTIFF或ENVI等常用格式并支持UTM、Lambert、Mercator等多种投影切换批处理特性则能一次性完成多个产品的重投影、裁剪与镶嵌显著提升大规模数据处理效率。压缩包共1个文件为MATLAB脚本.m整体约1KB脚本中通常包含输入路径、输出格式、投影参数及处理指令可驱动MRT自动化执行任务并支持按感兴趣区域、时间范围或波段进行数据集提取减少冗余数据、聚焦后续分析。目前已有418人学习下载适合具备一定遥感、GIS背景及MATLAB编程经验、需要批量处理MODIS数据的用户参考使用。1. 从一堆 HDF 到一张能用的栅格MODIS 批处理重投影到底在解决什么如果你手头有一批 MODIS 的 HDF 文件比如 MOD13Q1、MOD11A2、MCD43A4打开一看是正弦投影Sinusoidal每个文件还带一堆子数据集NDVI、EVI、质量波段、观测天数……而下游的 GIS 或遥感分析流程只认 WGS84 或某个本地投影的 GeoTIFF那你迟早会撞上「批处理 重投影 数据集提取」这三件事。Mrt_bat.zip 这类工具包本质就是把 MRTMODIS Reprojection Tool的命令行能力包成可批量调用的脚本让几百上千个 HDF 不用一个个手点。它解决的不是算法问题而是工程问题怎么稳定、可重复、可排错地把 MODIS 原始文件转成能进分析管线的栅格。适合谁做植被指数时序、地表温度、土地覆盖变化的一线从业者尤其是那些被「文件太多、投影不对、波段选错」卡住的人。这一章先把概念和选型理由讲清楚后面再落到命令、参数和踩坑。2. 先搞懂 MRT 与 MODIS 数据结构的对应关系2.1 MRT 能做什么、不能做什么MRT 是 NASA 官方提供的一套 MODIS 重投影和子集提取工具核心能力有三块重投影把正弦投影转到地理坐标或 UTM、子集提取按波段、按地理范围裁剪、格式转换HDF 到 GeoTIFF/HDF-EOS。它不能做的是批量调度、失败重试、并行加速、元数据整理。所以 Mrt_bat.zip 这类批处理包的价值不在 MRT 本身而在它把 MRT 的mrtmosaic、resample、resample -p这些命令串成了可循环的流程。常见做法是先用resample做单文件重投影再用mrtmosaic做拼接最后用脚本遍历目录。我一般会先确认 MRT 的安装路径和MRT_HOME环境变量因为批处理脚本里经常硬编码这个路径换机器就翻车。2.2 MODIS HDF 里到底有哪些子数据集MODIS 产品的一个 HDF 文件里通常包含多个 SDSScientific Data Sets比如 MOD13Q1 有 12 个波段NDVI、EVI、VI Quality、red reflectance、NIR reflectance、MIR reflectance、view zenith angle、sun zenith angle、relative azimuth angle、pixel reliability 等。重投影时如果不指定波段MRT 默认会输出所有波段文件体积大、后续分析还得再筛。所以「数据集提取」这一步核心就是搞清楚你要哪几个 SDS以及它们在 MRT 参数里对应的编号。常见做法是先用gdalinfo或hdp命令 dump 一下 HDF 结构确认波段顺序再写进参数文件。2.3 重投影的目标投影怎么选MODIS 正弦投影的坐标单位是米全球覆盖但很多分析工具不支持。目标投影常见三种地理坐标WGS84EPSG:4326、UTM按研究区带号、Albers 等积投影适合大区域面积统计。选哪个取决于你的分析目的做时序曲线WGS84 够用做面积统计必须等积投影做局地高精度UTM 更合适。MRT 支持通过参数文件指定输出投影常见做法是复制一份sample.prm改OUTPUT_PROJECTION_TYPE和OUTPUT_PROJECTION_PARAMETERS。这里有个坑MRT 的投影参数顺序是固定的写错一个数字输出就是错的而且不会报错。3. 用 Mrt_bat.zip 跑通第一批 MODIS 重投影3.1 环境准备与目录结构先把 MRT 装好Windows 下通常是解压到某个目录Linux 下需要编译或找预编译版本。然后确认 Java 环境因为 MRT 的resample是 Java 写的。目录结构建议这样MODIS_BATCH/ ├── input/ # 放原始 HDF ├── output/ # 放重投影结果 ├── prm/ # 放参数文件 ├── logs/ # 放日志 └── run_batch.sh # 批处理脚本批处理脚本的核心逻辑是遍历input/下的 HDF为每个文件生成一个临时 prm调用resample然后检查输出。下面是一个最小可用的 bash 脚本#!/bin/bash # MODIS 批处理重投影脚本 MRT_HOME/opt/MRT/bin INPUT_DIR./input OUTPUT_DIR./output PRM_TEMPLATE./prm/template.prm for hdf in ${INPUT_DIR}/*.hdf; do basename$(basename $hdf .hdf) # 为每个文件生成独立 prm sed s|INPUT_FILE|$hdf|g; s|OUTPUT_FILE|${OUTPUT_DIR}/${basename}.tif|g \ $PRM_TEMPLATE ./prm/${basename}.prm # 调用 resample ${MRT_HOME}/resample -p ./prm/${basename}.prm \ ./logs/${basename}.log 21 if [ $? -ne 0 ]; then echo FAILED: $basename ./logs/failed.txt fi done逻辑说明sed把模板里的占位符替换成实际路径避免手写每个 prm。resample -p是 MRT 的标准调用方式-p后面跟参数文件。日志重定向到logs/方便排查。参数说明MRT_HOME要改成你的实际路径INPUT_DIR和OUTPUT_DIR按需调整template.prm里至少要指定INPUT_FILE、OUTPUT_FILE、OUTPUT_PROJECTION_TYPE、OUTPUT_PROJECTION_PARAMETERS、SPECTRAL_SUBSET。3.2 参数文件里必须改的 5 个字段MRT 的 prm 文件字段很多但批处理场景下真正要改的就几个。下面是一个针对 MOD13Q1 的示例INPUT_FILE placeholder OUTPUT_FILE placeholder 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 RESAMPLING_TYPE NEAREST_NEIGHBOR OUTPUT_PIXEL_SIZE 0.0025 SPECTRAL_SUBSET ( 1 1 0 0 0 0 0 0 0 0 0 0 )字段解释OUTPUT_PROJECTION_TYPE GEO表示输出地理坐标OUTPUT_PROJECTION_PARAMETERS全 0 是 GEO 的默认值DATUM WGS84必须和投影类型匹配RESAMPLING_TYPE对分类数据用NEAREST_NEIGHBOR对连续数据可以用BILINEAROUTPUT_PIXEL_SIZE是输出分辨率MOD13Q1 原始 250m转成度大约是 0.0025SPECTRAL_SUBSET里 1 表示保留该波段0 表示丢弃顺序对应 HDF 里的 SDS 顺序。这里最容易翻车的是SPECTRAL_SUBSET的位数和 HDF 实际波段数不一致导致输出波段错位。3.3 批量提取指定数据集的两种方式第一种是改SPECTRAL_SUBSET只保留你要的波段。第二种是用SUBSET_BOUNDS做地理裁剪只输出研究区范围。两者可以同时用。比如只要 NDVI 和 EVI且只裁剪华北平原SPECTRAL_SUBSET ( 1 1 0 0 0 0 0 0 0 0 0 0 ) SUBSET_BOUNDS ( 110.0 30.0 120.0 42.0 )注意SUBSET_BOUNDS的顺序是(min_lon min_lat max_lon max_lat)写反了会输出空文件。我一般会先用一个文件测试确认输出范围和波段数正确再跑全量。如果研究区跨多个 UTM 带建议用 GEO 投影避免带号切换的麻烦。4. 批处理重投影的避坑与排查4.1 现象resample 报错 “Error: Cannot open input file”原因路径里有空格或中文MRT 的 Java 程序对非 ASCII 路径支持很差。解决把输入输出目录改成纯英文无空格路径或者用软链接绕开。血泪经验是Windows 下把数据放在C:\Users\张三\Desktop\这种路径十有八九会报这个错。4.2 现象输出文件波段数不对或者全是 0原因SPECTRAL_SUBSET的位数和 HDF 实际 SDS 数量不匹配或者OUTPUT_PIXEL_SIZE设得太大导致重采样后全是空值。解决先用gdalinfo确认 HDF 的波段数和顺序再数着位数写SPECTRAL_SUBSET。OUTPUT_PIXEL_SIZE不要超过原始分辨率的 2 倍否则信息损失严重。4.3 现象批处理跑了一半卡住日志里没有报错原因MRT 的 Java 进程在内存不足时会静默挂起尤其是同时处理多个大文件时。解决在脚本里加timeout命令比如timeout 300 ${MRT_HOME}/resample -p ...超时就跳过并记录。另外可以分批跑每 50 个文件休息一下避免内存泄漏累积。4.4 现象输出投影对了但位置偏了几百米原因DATUM和OUTPUT_PROJECTION_TYPE不匹配比如投影类型是 UTM 但 datum 写了 WGS84 而没给 UTM 带号。解决UTM 投影必须指定带号OUTPUT_PROJECTION_PARAMETERS里第一个参数是带号比如( 50 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 )表示 50 带。GEO 投影则全 0。4.5 现象批处理脚本在 Linux 下正常Windows 下路径全错原因Windows 的路径分隔符是反斜杠bash 脚本里用的是正斜杠MRT 在 Windows 下对混合分隔符处理不一致。解决统一用正斜杠或者在 Windows 下用 Git Bash 或 WSL 跑脚本。如果必须用 cmd把脚本改成.bat但要注意sed在 Windows 下不可用得换powershell或手动生成 prm。5. 进阶用 GDAL 替代 MRT 做更灵活的重投影MRT 稳定但老旧对多线程和云优化格式支持差。如果你已经装了 GDAL其实可以用gdalwarp直接处理 MODIS HDF而且支持多线程和压缩。下面是一个用 Python 调 GDAL 的批处理示例import os from osgeo import gdal input_dir ./input output_dir ./output os.makedirs(output_dir, exist_okTrue) for f in os.listdir(input_dir): if not f.endswith(.hdf): continue src_path os.path.join(input_dir, f) dst_path os.path.join(output_dir, f.replace(.hdf, .tif)) # 用 gdal.Warp 做重投影和裁剪 gdal.Warp( dst_path, src_path, dstSRSEPSG:4326, outputBounds(110.0, 30.0, 120.0, 42.0), xRes0.0025, yRes0.0025, resampleAlgnear, creationOptions[COMPRESSLZW, TILEDYES] ) print(fDone: {f})逻辑说明gdal.Warp一步完成重投影、裁剪、重采样和格式转换。dstSRS指定目标投影outputBounds是裁剪范围xRes/yRes是输出分辨率resampleAlg对应 MRT 的RESAMPLING_TYPE。creationOptions里的COMPRESSLZW能显著减小文件体积TILEDYES对后续按块读取更友好。参数说明如果只要特定波段可以在gdal.Warp前用gdal.Translate提取子数据集或者用gdal.BuildVRT组合。相比 MRTGDAL 的优势是支持多线程加multithreadTrue、支持 VRT 虚拟拼接、支持云存储路径。缺点是 MODIS 的 HDF 子数据集名称需要手动指定不如 MRT 的SPECTRAL_SUBSET直观。我自己的习惯是小批量、要严格复现 NASA 官方流程的用 MRT大批量、要压缩和并行、后续进 Python 分析的用 GDAL。两者没有绝对优劣关键是看你的下游工具链。另外不管用哪种批处理脚本一定要加日志和失败重试因为 MODIS 文件偶尔会下载不完整重投影时报错是常态。希望帮到你。本文还有配套的精品资源点击获取