modis数据下载测试处理

% Earthdata 登录信息
% Earthdata 登录信息(使用 Token 代替密码认证) 
token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIjoiVXNlciIsInVpZCI6IjEzNDM1NTM1MyIsImV4cCI6MTczODA1ODg5NSwiaWF0IjoxNzMyODc0ODk1LCJpc3MiOiJodHRwczovL3Vycy5lYXJ0aGRhdGEubmFzYS5nb3YiLCJpZGVudGl0eV9wcm92aWRlciI6ImVkbF9vcHMifbGV2ZWwiPxffEvybVNz_w83pQfg3520JrXIyJti86xbZHhb-bd2lizffWRbFp3wZCYk6WFvVl4won5f9DROFvik9pKwngFNQARZ0GyoOss1v_2ji6IpHMyER5nq_mH0xFKNhJxxzBg1uE0jBObffFzTrZOlKTblxzi8No4tutoqZjQXhP7aK8lHKUsQNgRG1w'; %
% 打开文件
filename1 = 'F:\modis_data\mod_1\mod2024.txt';  % 替换为你的文件名
fid = fopen(filename1, 'r');
% 检查文件是否成功打开
if fid == -1
    error('文件无法打开');
end

lines = {};  % 创建一个空的 cell 数组
line_num = 1;
while ~feof(fid)
    line = fgetl(fid);
    lines{line_num} = line;  % 将每一行内容保存到 cell 数组中
    line_num = line_num + 1;
end
temp=[];
count=0;
for i=1:size(lines,2)
    i
    filename = lines{1,i};
    % 执行下载
    try
        options = weboptions('HeaderFields', {'Authorization', ['Bearer ' token]});
        outfilename = filename(64:108);
        websave(outfilename, filename, options);
%         disp(['Downloaded: ', outfilename]);
    catch
        count=count+1;
        temp(count,1)=i;
        disp(['Failed to download: ', filename]);
    end
end

https://n5eil01u.ecs.nsidc.org/DP4/MOSA/MYD10A1.061/2018.01.31/MYD10A1.A2018031.h08v09.061.2021314061615.hdf
import requests

# Earthdata 登录信息(Token 代替密码认证)
token = 'eyJ0eXAiOiJKV1QiLCJvcmlnaW4iOiJFYXJ0aGRhdGEgTG9naW4iLCJzaWciOiJlZGxqd3RwdWJrZXlfb3BzIiwiYWxnIjoiUlMyNTYifQ.eyJ0eXBlIjoiVXNlciIsInVpZCI6IjEzNDM1NTM1MyIsImV4cCI6MTczODA1ODg5NSwiaWF0IjoxNzMyODc0ODk1LCUYPxffEvybVNz_w83pQfg3520JrXIyJti86xbZHhb-bd2lizffWRbFp3wZCYk6WFvVl4won5f9DROFvik9pKwngFwNQARZ0GyoOss1v_2ji6IpHMyER5nq_mH0xFKNhJxxzBg1uE0jBObffFzTrZOlKTblxzi8No4tutoqZjQXhP7aK8lHKUsQNgRG1w'

# 文件路径
filename1 = 'F:/modis_data/mod_1/mod2024.txt'  # 替换为你的文件名

# 打开文件
try:
    with open(filename1, 'r') as file:
        lines = file.readlines()
except FileNotFoundError:
    raise Exception("文件无法打开")

# 处理每一行
temp = []
count = 0

for i, line in enumerate(lines):
    line = line.strip()  # 移除行尾的换行符
    filename = line
    try:
        # 执行下载
        headers = {'Authorization': f'Bearer {token}'}
        outfilename = filename[63:109]  # 从 64 到 109 索引位置(MATLAB 中是 64 到 108)
        
        response = requests.get(filename, headers=headers, stream=True)
        response.raise_for_status()  # 如果请求失败,会抛出异常
        
        # 保存文件
        with open(outfilename, 'wb') as out_file:
            for chunk in response.iter_content(chunk_size=8192):
                out_file.write(chunk)
        
        print(f"Downloaded: {outfilename}")
    except requests.exceptions.RequestException:
        count += 1
        temp.append(i + 1)  # 保存失败的行数(1-based index)
        print(f"Failed to download: {filename}")

# 打印下载失败的文件行号
print(f"Total failures: {count}")
if count > 0:
    print("Failed to download from lines:", temp)
import os
import shutil

# 源文件夹路径
source_folder = '/path/to/source/folder'

# 目标文件夹路径
mod2017_folder = '/path/to/destination/mod2017'
myd2017_folder = '/path/to/destination/myd2017'
mod2018_folder = '/path/to/destination/mod2018'
myd2018_folder = '/path/to/destination/myd2018'

# 确保目标文件夹存在
os.makedirs(mod2017_folder, exist_ok=True)
os.makedirs(myd2017_folder, exist_ok=True)
os.makedirs(mod2018_folder, exist_ok=True)
os.makedirs(myd2018_folder, exist_ok=True)

# 遍历源文件夹中的文件
for filename in os.listdir(source_folder):
    # 构造文件的完整路径
    file_path = os.path.join(source_folder, filename)
    
    # 跳过目录,确保只处理文件
    if os.path.isdir(file_path):
        continue

    # 根据文件名将文件分类到不同的文件夹
    if filename.startswith('MOD10A1.A2017'):
        shutil.move(file_path, os.path.join(mod2017_folder, filename))
    elif filename.startswith('MYD10A1.A2017'):
        shutil.move(file_path, os.path.join(myd2017_folder, filename))
    elif filename.startswith('MOD10A1.A2018'):
        shutil.move(file_path, os.path.join(mod2018_folder, filename))
    elif filename.startswith('MYD10A1.A2018'):
        shutil.move(file_path, os.path.join(myd2018_folder, filename))

print("文件已分类并移动到相应的文件夹。")
import os
from pymodis import convertmodis_gdal
from datetime import datetime, timedelta

# 设置输入和输出目录
input_dir = 'D:/MODIS_DATA'  # 替换为你的输入数据目录
output_dir = 'D:/MODIS_OUTPUT'  # 替换为你的输出目录

# 设置日期范围(使用开始和结束日期)
start_date = datetime(2022, 1, 1)  # 起始日期
end_date = datetime(2022, 1, 16)  # 截止日期

# 设置初始变量
current_day = start_date
day1 = 1  # 初始天数
epsg = 4326  # 使用 WGS84 坐标系
resampling = 'NEAREST_NEIGHBOR'  # 设置重采样方法

# 循环处理每一天的数据
while current_day <= end_date:
    day_str = current_day.strftime('%Y%j')  # 获取当前日期的 Julian 日期格式
    print(f"正在处理 {day_str} 的数据...")

    # 获取当前日期下的输入文件
    input_files = [os.path.join(input_dir, f) for f in os.listdir(input_dir) if f.startswith(f"MYD10A1.A{day_str}") and f.endswith(".hdf")]

    if not input_files:
        print(f"没有找到 {day_str} 的数据文件,跳过")
        current_day += timedelta(days=1)
        continue

    # 设置输出文件前缀
    prefix = os.path.join(output_dir, f"MOSAIC_{day_str}")  # 输出文件的前缀

    # 创建 convertModisGDAL 对象
    converter = convertmodis_gdal.convertModisGDAL(
        hdfname=input_files,
        prefix=prefix,
        subset='NDSI_Snow_Cover',  # 提取 NDSI_Snow_Cover 波段
        res=None,  # 保持原始分辨率
        outformat='GTiff',  # 输出格式为 GeoTIFF
        epsg=epsg,  # 使用 WGS84 坐标系
    )

    # 执行数据转换(拼接)
    converter.run()
    print(f"{day_str} 拼接完成!")

    # 日期增加 1 天
    current_day += timedelta(days=1)



input_files = [os.path.join(input_dir, f) for f in os.listdir(input_dir) if f.startswith(f"MYD10A1.A{day_str}") and f.endswith(".hdf")]
from pymodis import convertmodis_gdal
import os

# 设置数据目录和输出目录
data_dir = r'D:\ModisTools\MRT\data'  # 原始MODIS数据目录
output_dir = r'D:\ModisTools\MRT\result'  # 输出拼接后的文件目录

# 获取所有符合条件的 HDF 文件
files_by_date = defaultdict(list)
for filename in os.listdir(data_dir):
    if filename.endswith('.hdf') and 'MYD10A1' in filename:
        # 提取文件名中的日期部分(假设日期部分是 'A2018031',即文件名中的第 7 到第 14 个字符)
        date = filename[6:14]  # 例如:从 'MYD10A1.A2018031' 中提取 'A2018031'
        files_by_date[date].append(os.path.join(data_dir, filename))

# 使用 convertmodis_gdal 拼接相同日期的文件
for date, files in files_by_date.items():
    if len(files) > 1:  # 如果有多个文件,则进行拼接
        # 输出文件路径
        output_file = os.path.join(output_dir, f'mosaic_output_{date}.hdf')

        # 使用 convertmodis_gdal 拼接数据
        try:
            convertmodis_gdal.convert(input_files=files, output_file=output_file, output_format='HDF4Image')

            print(f'拼接完成:{output_file}')
        except Exception as e:
            print(f'处理 {date} 时出现错误: {e}')


[root@himac appfolder_2]# python Stitching.py
Traceback (most recent call last):
  File "Stitching.py", line 2, in <module>
    from pymodis import modis
ImportError: cannot import name 'modis' from 'pymodis' (/root/anaconda3/envs/blockfl/lib/python3.8/site-packages/pymodis/__init__.py)

[root@himac appfolder_2]# python hp.py
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '__warningregistry__', 'convertmodis', 'convertmodis_gdal', 'downmodis', 'optparse_required', 'parsemodis', 'print_function', 'productmodis', 'qualitymodis', 'warnings']
import os
import glob
from collections import defaultdict
from datetime import datetime

# 定义文件路径和输出路径
input_dir = "/home/data8/platformtest/backend/appfolder/appfolder_2/datadownload/mod2017"
output_path = "/home/data8/platformtest/backend/appfolder/appfolder_2/datadownload/stitchmod2017"

# 定义重投影参数 (假设已经设置好)
reproject_options = (
    (0, 0, 1, 1),  # 示例的仿射变换矩阵 (gt_out)
    (2400, 2400),  # 图像大小 (xSize, ySize)
    "EPSG:4326"     # 目标坐标系
)

# 每一天的文件命名模式
satellite_bands = [
    "h22v04.061", "h23v04.061", "h24v04.061", "h25v04.061",
    "h23v05.061", "h24v05.061", "h25v05.061", "h26v05.061", "h27v05.061",
    "h23v06.061", "h24v06.061", "h25v06.061", "h26v06.061", "h27v06.061"
]

# 获取所有文件列表
file_groups = defaultdict(list)

# 获取所有文件,并按日期分组
for band in satellite_bands:
    # 根据卫星带和日期生成文件模式
    file_pattern = os.path.join(input_dir, f"MOD10A1.A*.{band}*.hdf")
    all_files = glob.glob(file_pattern)
    
    for file in all_files:
        # 提取文件名中的日期 (A2022001 格式)
        basename = os.path.basename(file)
        date_str = basename.split('.')[1][1:]  # 提取如 "2022001" 这部分
        date = datetime.strptime(date_str, "%Y%j").strftime("%Y-%m-%d")  # 转换为 YYYY-MM-DD 格式
        
        # 将文件按日期分组
        file_groups[date].append(file)

# 为每个日期调用 stitch_and_reproject 函数
for date, files in file_groups.items():
    product = "MODIS"
    
    # 调用 stitch_and_reproject 函数
    try:
        output_file = stitch_and_reproject(
            file_list=files,
            output_path=output_path,
            product=product,
            date=date,
            reproject_options=reproject_options
        )
        print(f"Output file for {date} saved at: {output_file}")
    except Exception as e:
        print(f"Error processing {date}: {e}")
def calc_longtime_snow_mask(dep_list: list, dem_mask = GDAL_MASKS.dem_mask) -> np.ndarray:
    '''
    用于计算长期积雪掩模(snow mask),根据给定的多个图像数据,结合 DEM(数字高程模型)掩码和设定的阈值规则,生成一个最终的掩模图像。这个掩模图像会标记出积雪、土地和云层等区域。
    '''
    if dep_list is None or len(dep_list) <= 0:
        return None
    days = len(dep_list)
    res = np.zeros(dem_mask.shape) + CLOUD_CODE
    snow_cnt = np.zeros(dem_mask.shape)
    land_cnt = np.zeros(dem_mask.shape)
    cloud_cnt = np.zeros(dem_mask.shape)
    for img in dep_list:
        if img is None:
            continue
        snow_cnt += img == SNOW_CODE
        land_cnt += img == LAND_CODE
        cloud_cnt += img == CLOUD_CODE
    res[dem_mask >= LONGTIME_ELEVATION_DECISIONS[0]] = SNOW_CODE
    res[(snow_cnt + cloud_cnt >= days * LONGTIME_SNOW_CONTROL_RATIO) & (dem_mask > LONGTIME_ELEVATION_DECISIONS[1]) & (dem_mask < LONGTIME_ELEVATION_DECISIONS[0])] = SNOW_CODE
    res[(cloud_cnt <= days * LONGTIME_LAND_CONTROL_RATIO) & (land_cnt + cloud_cnt == days) & (dem_mask <= LONGTIME_ELEVATION_DECISIONS[1])] = LAND_CODE

    return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值