乐于分享
好东西不私藏

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

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

1、首先需要注册earthdata的账号

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 ParametersUTM zone处填写研究区所属的维度带。

Output Pixel Size处填写目标分辨率

点击Save Parameter file,选择保存地址,以.prm文件结尾(非结果输出地址,而是该程序运行的一个类似于代码的文件)。

点击Runoutput file会出现在指定文件夹中。

7、批量数据的处理,适用于多年数据

(1)将以上单次处理步骤操作一遍,目的是为了生成prm文件。用记事本打开prm文件,更换为以下代码:INPUT_FILENAMEOUTPUT_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>>> 处理任务结束!“)

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

点击阅读原文 了解更多详情