ICESat-2 从ATL08中获取ATL03分类结果

这篇具有很好参考价值的文章主要介绍了ICESat-2 从ATL08中获取ATL03分类结果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ICESat-2 ATL03数据和ATL08数据的分段距离不一致,ATL08在ATL03的基础上重新分段,并对分段内的数据做处理得到一系列的结果,详情见数据字典:

ATL08 Product Data Dictionary (nsidc.org)

ATL08使用DRAGANN算法对ATL03数据做了去噪处理,并使用分类算法对每个光子进行分类

标志值 标志含义
-1 未分类
0 噪声
1 地面
2 冠层
3 冠顶

ATL08使用ph_segment_idclassed_pc_indx可以和ATL03对应起来。基于此,可从ATL08中获取ATL03每个光子的分类信息。

ICESat-2 从ATL08中获取ATL03分类结果

读取ATL08

import os
import h5py
import re


def read_hdf5_atl08(filename, beam, verbose=False):
    file_id = h5py.File(os.path.expanduser(filename), 'r')

    # 输出HDF5文件信息
    if verbose:
        print(file_id.filename)
        print(list(file_id.keys()))
        print(list(file_id['METADATA'].keys()))
    # 为ICESat-2 ATL08变量和属性分配python字典
    atl08_mds = {}

    # 读取文件中每个输入光束
    beams = [k for k in file_id.keys() if bool(re.match('gt\\d[lr]', k))]
    if beam not in beams:
        print('请填入正确的光束代码')
        return

    atl08_mds['signal_photons'] = {}
    # -- ICESat-2 Geolocation Group
    for key, val in file_id[beam]['signal_photons'].items():
        atl08_mds['signal_photons'][key] = val[:]

    return atl08_mds

映射ATL08

将 ATL08 映射到 ATL03

def get_atl08_mapping(atl03_ph_index_beg, atl03_segment_id, atl08_classed_pc_indx,
                      atl08_classed_pc_flag, atl08_segment_id):
    """
    Function to map ATL08 to ATL03 class photons
    Args:
        atl03_ph_index_beg:
        atl03_segment_id:
        atl08_classed_pc_indx:
        atl08_classed_pc_flag:
        atl08_segment_id:

    Returns:

    """
    # Get ATL03 data
    indsNotZero = atl03_ph_index_beg != 0
    atl03_ph_index_beg = atl03_ph_index_beg[indsNotZero]
    atl03_segment_id = atl03_segment_id[indsNotZero]

    # Find ATL08 segments that have ATL03 segments
    atl03SegsIn08TF, atl03SegsIn08Inds = ismember(atl08_segment_id, atl03_segment_id)

    # Get ATL08 classed indices and values
    atl08classed_inds = atl08_classed_pc_indx[atl03SegsIn08TF]
    atl08classed_vals = atl08_classed_pc_flag[atl03SegsIn08TF]

    # Determine new mapping into ATL03 data
    atl03_ph_beg_inds = atl03SegsIn08Inds
    atl03_ph_beg_val = atl03_ph_index_beg[atl03_ph_beg_inds]
    newMapping = atl08classed_inds + atl03_ph_beg_val - 2

    # Get max size of output array
    sizeOutput = newMapping[-1]

    # Pre-populate all photon classed array with zeroes
    allph_classed = (np.zeros(sizeOutput + 1)) - 1

    # Populate all photon classed array from ATL08 classifications
    allph_classed[newMapping] = atl08classed_vals

    # Return all photon classed array
    return allph_classed

添加分类信息

def add_atl08_classed_flag(filepath_08, beam, atl03_mod):
    """
    添加ATL08分类数据到ATL03中
    Args:
        filepath_08: ATL08数据文件位置
        beam: 波束,与ATL03保持一致
        atl03_mod: ATL03数据

    Returns:
    携带ATL08分类信息
    """
    val_03 = atl03_mod
    val_08 = read_hdf5_atl08(filepath_08, beam)

    # val_03['classed_pc_flag'] = np.zeros_like(val_03['heights']['h_ph']) + np.NaN
    atl03_heights = val_03['heights']['h_ph']

    # -- 分段中的第一个光子(转换为基于0的索引)
    segment_index_begin = val_03['geolocation']['ph_index_beg']
    segment_id = val_03['geolocation']['segment_id']

    # 追踪到ATL03上特定20m Segment_ID的光子的段ID
    ph_segment_id = val_08['signal_photons']['ph_segment_id']

    # 该索引追溯到ATL03上20m segment_id内的特定光子。
    classed_pc_index = val_08['signal_photons']['classed_pc_indx']
    # 每个光子的陆地植被ATBD分类标志为噪声、地面、树冠和树冠顶部。0=噪音,1=地面,2=冠层,或3=冠层顶部
    classed_pc_flag = val_08['signal_photons']['classed_pc_flag']

    # Map ATL08 classifications to ATL03 Photons
    all_ph_classed = get_atl08_mapping(segment_index_begin, segment_id,
                                       classed_pc_index, classed_pc_flag, ph_segment_id)

    if len(all_ph_classed) < len(atl03_heights):
        n_zeros = len(atl03_heights) - len(all_ph_classed)
        zeros = np.zeros(n_zeros)
        all_ph_classed = np.append(all_ph_classed, zeros)

    val_03['classed_pc_flag'] = all_ph_classed

使用姿势

读取ATL03数据代码见:https://www.cnblogs.com/sw-code/p/18161987

from glob import glob

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.ticker import MultipleLocator

from readers.add_atl08_info import add_atl08_classed_flag
from readers.get_ATL03_x_atc import get_atl03_x_atc
from readers.read_HDF5_ATL03 import read_hdf5_atl03_beam_h5py


def select_atl03_data(atl03_data, mask):
    """
    选择数据范围
    Args:
        atl03_data: 所有数据
        mask (list): 维度范围
    Returns:
    """
    # 选择范围
    d3 = atl03_data
    subset1 = (d3['heights']['lat_ph'] > min(mask)) & (d3['heights']['lat_ph'] < max(mask))

    x_act = d3['heights']['x_atc'][subset1]
    h = d3['heights']['h_ph'][subset1]
    signal_conf_ph = d3['heights']['signal_conf_ph'][subset1]
    lat = d3['heights']['lat_ph'][subset1]
    lon = d3['heights']['lon_ph'][subset1]
    classed_pc_flag = d3['classed_pc_flag'][subset1]

    return x_act, h, signal_conf_ph, lat, lon, classed_pc_flag


def get_atl03_data(filepath, beam):
    """
    读取ATL03数据,根据维度截取数据
    Args:
        filepath (str): h5文件路径
        beam (str): 光束
    Returns:
        返回沿轨道距离,高程距离,光子置信度
    """
    atl03_file = glob(filepath)
    is2_atl03_mds = read_hdf5_atl03_beam_h5py(atl03_file[0], beam=beam, verbose=False)
    # 添加沿轨道距离到数据中
    get_atl03_x_atc(is2_atl03_mds)
    return is2_atl03_mds


def show_classification(x_origin, y_origin, classification, clz):
    """
    :param clz: -1:未分类, 0:噪声, 1:地形, 2:冠层, 3:冠顶, 4:海洋
    :param classification: 分类数据
    :param y_origin:
    :param x_origin:
    """
    plt.subplots(num=1, figsize=(24, 6))
    ax = plt.gca()
    ax.get_xaxis().get_major_formatter().set_useOffset(False)
    plt.xticks(rotation=270)
    ax.set_xlabel('x_atc, km')
    ax.set_ylabel('h, m')
    ax.xaxis.set_major_locator(MultipleLocator(100))
    colors = ['red', 'black', 'green', 'violet', 'blue', 'grey']
    for flag in clz:
        idx = np.where(classification == flag)
        plt.scatter(x_origin[idx], y_origin[idx], s=5, c=colors[flag])

    plt.show()


if __name__ == '__main__':
    data = {
        'filepath': 'D:\\Users\\SongW\\Documents\\ICESat-2 Data\\ATL03\\ATL03_20200620024106_13070701_005_01.h5',
        'filepath_08': 'D:\\Users\\SongW\\Documents\\ICESat-2 Data\\ATL08\\ATL08_20200620024106_13070701_005_01.h5',
        'beam': 'gt2l',
        'mask': [19.6468, 19.6521]
    }
    atl03_data = atl03_data = get_atl03_data(data['filepath'], data['beam'])
    add_atl08_classed_flag(data['filepath_08'], data['beam'], atl03_data)

    x_origin, y_origin, conf, lat, lon, classed_pc_flag = select_atl03_data(atl03_data, data['mask'])

    show_classification(x_origin, y_origin, classed_pc_flag, [-1, 0, 1, 2, 3])

项目源码

sx-code - icesat-2-atl03 (github.com)文章来源地址https://www.toymoban.com/news/detail-860154.html

到了这里,关于ICESat-2 从ATL08中获取ATL03分类结果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【自学笔记】01Java基础-08Java常用API:03日期类详解

    记录Java基础-常用API-有关时间日期的类。 1.1 什么是Date类 Date 类位于 java.util 包中,代表当前所在系统的日期时间信息或表示特定的瞬间,精确到毫秒。 这个类在早期版本的 Java 中被广泛使用,但由于其功能和设计的局限性,自Java8起,推荐使用 java.time 包中的新日期和时间

    2024年01月22日
    浏览(25)
  • 分叉币的发展史及价值|ETH、BCH、BSV 2020-03-08

      昨天有人问我比特币、BCH、BSV和ETH的价值,在这几个币中除了比特币,其它几个币有一个共同的特性,那就是它们都是分叉币,所以看到这个问题,我想到一个话题:分叉币的价值。   在数字货币中我们也能经常看到“分叉币”,越是知名的数字货币越容易出分叉币。那为

    2024年02月13日
    浏览(35)
  • Solr框架 03 使用SolrJ在项目中运用solr,结果和在web界面操作document一样

    01.java的springboot项目中去用solr框架,导入依赖 1新增/修改实现 2删除实现 3查询实现

    2024年02月12日
    浏览(29)
  • 【Python】(2022.07.03)在Jupyter Notebook中调用Stata17并绘制3D图展示回归结果的边际效应

    主要目的是因为stata里边编程的灵活性较之Python要差不少,如果把两个结合起来可以大大提高效率,Stata17中提供了良好的Stata与Python的交互。在Stata官网上提供了相应的介绍,我的安装也主要遵循了Stata官网上的说明 结合stata官网的说明,我们首先需要安装stata_setup这个包,注

    2023年04月08日
    浏览(25)
  • Python遥感图像处理应用篇(二十八):Python绘制遥感图像分类结果混淆矩阵和计算分类精度

    Indians Pines高光谱数据,使用SVM分类方法(选取10%样本量)计算得到的结果。 参考数据: 分类数据:

    2024年02月13日
    浏览(41)
  • 机器学习基础08-模型选择02-分类算法矩阵(基于Pima 数据集)

    算法评估矩阵(Algorithm Evaluation Metrics)用于评估机器学习算法在特定任务上的 性能 。不同的任务可能会使用不同的评估矩阵,因为每个任务的优劣衡量标准都不同。 分类问题或许是最常见的机器学习问题,并且有多种评估矩阵来评估 分类算法。以下几种用来评估分类算法

    2024年02月14日
    浏览(32)
  • 使用 BERT 进行文本分类 (03/3)

            在使用BERT(2)进行文本分类时,我们讨论了什么是PyTorch以及如何预处理我们的数据,以便可以使用BERT模型对其进行分析。在这篇文章中,我将向您展示如何训练分类器并对其进行评估。         上次,我们使用train_test_split将数据拆分为测试和验证数据。接

    2024年02月10日
    浏览(29)
  • 织梦dedecms在搜索结果页按栏目分类显示搜索数据

    搜索结果示范 1、搜索框代码里使用name=\\\"q\\\"作为搜索框属性,例如  2、打开 /include/taglib/arclist.lib.php 找到,大概在188行 $innertext = trim($innertext); 在它下面加入 preg_match(\\\"/~([A-Za-z0-9_]+)~/s\\\", $keyword, $conditions); if(isset($_REQUEST[\\\'q\\\']) $keyword = \\\'~q~\\\') { preg_match(\\\"/~([A-Za-z0-9_]+)~/s\\\", $keyword, $cond

    2024年02月03日
    浏览(39)
  • 【SpringBoot项目】SpringBoot项目-瑞吉外卖【day03】分类管理

    🌕博客x主页:己不由心王道长🌕! 🌎文章说明:SpringBoot项目-瑞吉外卖【day03】分类管理🌎 ✅系列专栏:SpringBoot项目 🌴本篇内容:对黑马的瑞吉外卖项目的day03进行笔记和项目实现🌴 ☕️每日一语:生活不可能像你想象得那么好,但也不会像你想象得那么糟。☕️ 🚩

    2024年02月22日
    浏览(28)
  • es查询响应结果中获取某些字段的值

            有时候使用es查询出的结果包含多个字段,如果数据中仅仅包含几个字段时,我们是很容易挑出自己需要的字段值,但是如果数据中包含几十或者几百甚至更多时,尤其是数据中嵌套好多层时,不容易直接挑取出需要的值,这时候可以借助程序直接查找出来。或者

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包