首页 > 其他分享 >ICESat-2 ATL08 数据批量读取

ICESat-2 ATL08 数据批量读取

时间:2024-06-09 23:32:24浏览次数:22  
标签:info 读取 ICESat data file path te ATL08 cycle

ICESat-2 ATL08 数据概述

ICESat-2(Ice, Cloud, and land Elevation Satellite-2)是美国宇航局(NASA)的一颗卫星,旨在测量地球的冰盖、云层和陆地的高程。ATL08数据产品专注于测量地表高程和植被的高度,主要用于研究森林、草地和冰川等地表特征。

ATL08 数据产品结构

ATL08数据产品是一个HDF5格式的文件,包含多个数据组(group),每个数据组对应卫星的一个激光光束。ICESat-2有三个激光光束,每个光束分为左(left, l)和右(right, r)两个子光束,因此总共有六个数据组:/gt1l、/gt1r、/gt2l、/gt2r、/gt3l、/gt3r。

主要数据字段

每个光束数据组下包含多个数据字段,以下是一些关键字段的解释:

latitude: 光子测量点的纬度。
longitude: 光子测量点的经度。
h_canopy: 植被顶端的高度(相对于参考椭球面)。
h_canopy_uncertainty: 植被高度的不确定性。
dem_h: 数字高程模型(DEM)中的地形高度。
下面是一个可以批量读取ICESat-2 ATL08数据的脚本,可以根据需要的变量进行改写。同时可以使用HDFView查看 ATL08 数据的变量内容。


import h5py
import os
import pandas as pd
from datetime import datetime, timedelta


def extract_track_info(fname):
    """
    从文件名中提取轨道号、时间和周期信息。
    参数:
    fname (str): 文件名。
    返回:
    info (dict): 包含轨道号、时间和周期信息的字典。
    """
    try:
        base_name = os.path.basename(fname)
        parts = base_name.split('_')
        info = {
            'date': parts[1],
            'track': int(parts[2][:4]),
            'cycle': int(parts[2][4:6])
        }
        return info
    except (IndexError, ValueError) as e:
        print(f"文件名格式错误: {fname}, 错误信息: {e}")
        return None


def read_atl08(fname):
    """
    读取ICESat-2 ATL08数据,并返回数据和每个光束的数据。
    参数:
    fname (str): HDF5文件的路径。
    返回:
    trajectory_data (dict): 包含每个光束数据的字典。
    """
    groups = ['/gt1l', '/gt1r', '/gt2l', '/gt2r', '/gt3l', '/gt3r']
    trajectory_data = {}

    try:
        with h5py.File(fname, 'r') as fi:
            for g in groups:
                lat = fi[g + '/land_segments/latitude'][:]
                lon = fi[g + '/land_segments/longitude'][:]
                dem_h = fi[g + '/land_segments/dem_h'][:]
                h_te_best_fit = fi[g + '/land_segments/terrain/h_te_best_fit'][:]
                h_te_best_mean = fi[g + '/land_segments/terrain/h_te_mean'][:]
                h_te_median = fi[g + '/land_segments/terrain/h_te_median'][:]
                h_te_interp = fi[g + '/land_segments/terrain/h_te_interp'][:]
                terrain_slope = fi[g + '/land_segments/terrain/terrain_slope'][:]
                cloud_flag_atm = fi[g + '/land_segments/cloud_flag_atm'][:]

                result = pd.DataFrame({
                    'lon': lon,
                    'lat': lat,
                    'dem_h': dem_h,
                    'h_te_best_fit': h_te_best_fit,
                    'h_te_best_mean': h_te_best_mean,
                    'h_te_median': h_te_median,
                    'h_te_interp': h_te_interp,
                    'terrain_slope': terrain_slope,
                    'cloud_flag_atm': cloud_flag_atm
                })
                trajectory_data[g] = result
    except Exception as e:
        print(f"读取文件失败: {fname}, 错误信息: {e}")
        return None

    return trajectory_data


def read_icesat2_ATL08_files(folder_path):
    """
    处理文件夹中的所有HDF5文件,并根据轨道号、时间和周期进行分组。
    参数:
    folder_path (str): 文件夹路径。
    返回:
    grouped_data_by_cycle (dict): 包含每个周期的数据字典。
    """
    file_list = []
    grouped_data_by_cycle = {}
    groups = ['/gt1l', '/gt1r', '/gt2l', '/gt2r', '/gt3l', '/gt3r']

    for file_name in os.listdir(folder_path):
        if file_name.endswith('.h5'):
            file_path = os.path.join(folder_path, file_name)
            file_info = extract_track_info(file_name)
            if file_info is not None:
                file_list.append((file_path, file_info))

    for file_path, file_info in file_list:
        cycle = file_info['cycle']
        if cycle not in grouped_data_by_cycle:
            grouped_data_by_cycle[cycle] = {}
        grouped_data_by_cycle[cycle][file_path] = file_info

    for cycle, files_info in grouped_data_by_cycle.items():
        print(f"处理周期: {cycle}")
        cycle_dates = []
        for file_path, file_info in files_info.items():
            if isinstance(file_info, dict):
                print(f"读取文件: {file_path}")
                trajectory_data = read_atl08(file_path)
                if trajectory_data is not None:
                    grouped_data_by_cycle[cycle][file_path] = trajectory_data

                    file_date = datetime.strptime(file_info['date'], '%Y%m%d%H%M%S')
                    cycle_dates.append(file_date)
        if cycle_dates:
            avg_date = datetime.fromtimestamp(sum(d.timestamp() for d in cycle_dates) / len(cycle_dates))
            avg_date_str = avg_date.strftime('%Y-%m-%d')
        else:
            avg_date_str = None

        grouped_data_by_cycle[cycle]['average_date'] = avg_date_str

    return grouped_data_by_cycle

标签:info,读取,ICESat,data,file,path,te,ATL08,cycle
From: https://blog.csdn.net/weixin_47000954/article/details/139566773

相关文章

  • Qt 读取excel文件
    在Qt中,你可以使用QtXlsxWriter库来对Excel文件进行操作。QtXlsxWriter是一个开源库,用于在Qt应用程序中生成和编辑Excel文件。以下是如何使用QtXlsxWriter库在Qt中对Excel文件进行操作的步骤: 添加QtXlsxWriter库到你的Qt项目中。可以通过在.pro文件中添加以下行来包含QtXls......
  • Python【cv2:读取图片时报错】
    写在前面:opencv库安装在终端用pipinstall安装opencv-python库建议使用国内清华源的镜像去安装,加参数-ihttps://pypi.tuna.tsinghua.edu.cn/simple代码如下:pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simpleopencv-python报错一我一开始直接用cv2.imread(p......
  • 【漏洞复现】多客圈子论坛系统 httpGet 任意文件读取漏洞
    0x01产品简介多客圈子论坛系统是一种面向特定人群或特定话题的社交网络,它提供了用户之间交流、分享、讨论的平台。在这个系统中,用户可以创建、加入不同的圈子,圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、点赞等互动。社交圈子论坛系统除了......
  • 前端读取excel文件
    <!DOCTYPEhtml><html><head><title>js读取Excel文件</title><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/></head><bodyclass="Bodynoover">......
  • 「漏洞复现」锐捷校园网自助服务系统 login_judge.jsf 任意文件读取漏洞(XVE-2024-211
    0x01 免责声明请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需......
  • 从本地读取两个数组,计算一元线性回归
    #include<iostream>#include<fstream>#include<sstream>#include<string>#include<vector>#include<numeric>structLinearRegression{doubleslope;doubleintercept;LinearRegression(conststd::vecto......
  • Spark读取http数据写入hive
    http请求hutool,json转换数据写入到rdd,之后转换为sparksqlSparkSessionspark=SparkSession.builder().master("yarn").appName("json2hive").config("hive.exec.dynamic.partition","true").config("......
  • 锐捷校园网自助服务系统 login_judge.jsf 任意文件读取漏洞复现(XVE-2024-2116)
    0x01产品简介锐捷校园网自助服务系统是锐捷网络推出的一款面向学校和校园网络管理的解决方案。该系统旨在提供便捷的网络自助服务,使学生、教职员工和网络管理员能够更好地管理和利用校园网络资源。0x02漏洞概述校园网自助服务系统/selfservice/selfservice/module/scgroup......
  • I Doc View 在线文档预览 qJvqhFt.json 任意文件读取漏洞复现(XVE-2024-2115)
    0x01产品简介iDocView是一个在线文档解析应用,旨在提供便捷的文件查看和编辑服务。0x02漏洞概述iDocView是一个在线文档预览系统/view/qJvqhFt.json接口处存在任意文件读取漏洞,未授权的攻击者可以利用此接口并携带默认token读取服务器敏感文件信息,使系统处于极度不安全的......
  • Azure 函数(Node.js):如何从代码中读取上传到 Azure 证书刀片的公钥(.cer)?
    我在Node.js上运行了AzureFunctions。(另外,请注意,通过应用程序服务计划运行的底层操作系统是Windows)让我先绕道而行。一直以来,我都是从Node.js代码访问AzureKeyVault,因此我知道如何从Node.js代码访问KeyVault,这样看起来就像这样:co......