MODIS数据下载、拼接、提取与格式转换——以NDVI数据为例

2、进入官网(https://ladsweb.modaps.eosdis.nasa.gov/search/)并登录,查找所需数据。

3、选中所需数据,包括时间、边界位置并按步骤下载

4、下载好的MODIS数据,这里是月尺度的数据,格式为hdf格式

5、下载工具MRT
地址:https://pan.baidu.com/s/1516MgWy-0hbC1uQhzcf7FA 提取码:8h79,(别人提供的下载好的)。安装MRT要先确保安装完java,没有安装的小伙伴自行前往下载:Java SE – Downloads。有的电脑已经有就跳过此步骤。安装好点击bin里的ModisTool.jar打开软件。


6、单幅影像拼接与转换格式、重投影步骤
Input files:上传同一时间点(比如同一个月或同一天)需要拼接或者重投影或转换的数据。
Select Bands:选择需要的波段
Outputfile:选择合适的输出地址和文件名,注意要加.tif
Output Project Type处选择目标坐标系,一般为UTM,打开Edit Projection Parameters,UTM zone处填写研究区所属的维度带。
Output Pixel Size处填写目标分辨率
点击Save Parameter file,选择保存地址,以.prm文件结尾(非结果输出地址,而是该程序运行的一个类似于代码的文件)。
点击Run,output file会出现在指定文件夹中。


7、批量数据的处理,适用于多年数据
(1)将以上单次处理步骤操作一遍,目的是为了生成prm文件。用记事本打开prm文件,更换为以下代码:INPUT_FILENAME和OUTPUT_FILENAME的地址需要换成你数据存放和拟输出的地址,文件名采用以下默认文件名。注意,只需要写到在哪个盘,比如我的输入文件在H:\download_data文件夹里,并且每一年一个文件夹,那么只写到H盘,最后输出文件会也会和输入文件在同一个文件夹下。
INPUT_FILENAME = H:\TmpMosaic.hdf
OUTPUT_FILENAME = H:\output.tif
SPECTRAL_SUBSET = ( 1 )
SPATIAL_SUBSET_TYPE = INPUT_LAT_LONG
SPATIAL_SUBSET_UL_CORNER = ( 49.999999996 77.786191329 )
SPATIAL_SUBSET_LR_CORNER = ( 39.999999996 91.37851024 )
OUTPUT_PROJECTION_TYPE = UTM
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
UTM_ZONE = 44
OUTPUT_PIXEL_SIZE = 250
RESAMPLING_TYPE = NEAREST_NEIGHBOR
这里可以修改坐标系和分辨率,以及重采样方式(一般不改),其他不用修改。保存。

(2)在python中运行以下代码,路径配置部分MRT_BIN是指MRT软件安装后bin文件夹的位置,ROOT_DIR为输入文件(待处理)的地址注意里面只能包含hdf文件,TEMPLATE_PRM 为上一步修改的prm文件的位置,选择需要处理的年份,运行代码,就会进行处理,处理完后结果在输入数据的文件夹中,tif格式的就是结果。
import os
import subprocess
# =========================================================
# 1. 路径配置
# =========================================================
MRT_BIN = r’E:\ruanjiananzhuang\MRT\MRT_after\bin’
ROOT_DIR = r’H:\download_data’
TEMPLATE_PRM = r’H:\download_data\test.prm’
YEARS_TO_PROCESS = [2023]
mrt_mosaic_exe = os.path.join(MRT_BIN, ‘mrtmosaic.exe’)
resample_exe = os.path.join(MRT_BIN, ‘resample.exe’)
for year in YEARS_TO_PROCESS:
data_dir = os.path.join(ROOT_DIR, f”{year}monthly”)
if not os.path.exists(data_dir): continue
print(f”\n— 正在攻克{year} 年数据 —“)
os.chdir(data_dir)
hdfs = [f for f in os.listdir(‘.’) if f.upper().endswith(‘.HDF’) and ‘mosaic’ not in f]
groups = {}
for f in hdfs:
parts = f.split(‘.’)
if len(parts) > 2:
date_key = parts[1]
groups.setdefault(date_key, []).append(f)
for date_key, files in groups.items():
if len(files) < 2: continue
mosaic_hdf = f”{date_key}_mosaic.hdf”
resample_prm = f”{date_key}_resample.prm”
output_tif = f”NDVI_{date_key}_250m.tif”
# 建立一个临时清单文件,MRT 对这个格式最认可
list_file = f”list_{date_key}.txt”
with open(list_file, ‘w’) as f:
for hdf in files:
f.write(f”{hdf}\n”)
if os.path.exists(output_tif): continue
# — A. 拼接:使用 -i 指向清单文件 —
print(f”正在拼接 {date_key}…”)
# 注意:这里的 -i 后面直接跟清单文件名
subprocess.run([mrt_mosaic_exe, “-i”, list_file, “-o”, mosaic_hdf], shell=True)
# — B. 重采样 —
if os.path.exists(mosaic_hdf):
with open(TEMPLATE_PRM, ‘r’, encoding=’utf-8′, errors=’ignore’) as f:
lines = f.readlines()
with open(resample_prm, ‘w’, encoding=’utf-8′) as f:
for line in lines:
if line.strip().startswith(‘INPUT_FILENAME’):
f.write(f”INPUT_FILENAME = {mosaic_hdf}\n”)
elif line.strip().startswith(‘OUTPUT_FILENAME’):
f.write(f”OUTPUT_FILENAME = {output_tif}\n”)
else:
f.write(line)
print(f”正在重采样 {date_key}…”)
subprocess.run([resample_exe, ‘-p’, resample_prm], shell=True)
# 清理
if os.path.exists(output_tif):
os.remove(mosaic_hdf)
os.remove(list_file)# 清理清单文件
else:
print(f”[失败] {date_key} 拼接未生成 HDF”)
print(“\n>>> 处理任务结束!“)

版权声明:本公众号为非盈利性新媒体,所刊载文章版权属于原作者及相关出版商所有,如发生侵权行为,请及时与公众号编辑联系,我们会与原作者、相关出版机构协商解决。

点击阅读原文 了解更多详情
夜雨聆风