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每个光子的分类信息。

读取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)

ICESat-2 从ATL08中获取ATL03分类结果的更多相关文章

  1. mongodb查询之从多种分类中获取各分类最新一条记录

    mongodb查询之从多种分类中获取各分类最新一条记录 2017年04月06日 13:02:47 monkey_four 阅读数:6707更多 个人分类: MongoDBJavaScript   文章 ...

  2. 记录一次bug解决过程:velocity中获取url中的参数

    一.总结 在Webx的Velocity中获取url中参数:$rundata.getRequest().getParameter('userId') 在Webx项目中,防止CSRF攻击(Cross-si ...

  3. mysql获取所有分类的前n条记录的两种方法浅析

      项目中有个需求是获取出展会分类下的前n条展商. 刚开始的思路是用group by 获取出展会的分类,后面再根据分类获取该分类下的n个展商,但也需要第一次获取出展会的时候也获取所有的每个展会分类下的 ...

  4. IOS从视频中获取截图

    从视频中获取截图: NSString *movpath =[[NSBundle mainBundle] pathForResource:@”iosxcode4″ ofType:@”mov”]; mpv ...

  5. MVC 在控制器中获取某个视图动态的HTML代码

    ASP.NET MVC 在控制器中获取某个视图动态的HTML代码   如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中, ...

  6. dede织梦栏目页和文章页中获取当前栏目名称方法

    一般情况下,在dede织梦系统中列表页.栏目页和文章页中获取当前所在栏目名称只需要代码:{dede:type}[field:typename]{/dede:type}即可,不需要定义ID,默认的就是当 ...

  7. 机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集

    机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集   选自Microsoft www.tz365.Cn 作者:Lee Scott 机器之心编译 参与:李亚洲.吴攀. ...

  8. WordPress 获取指定分类ID的分类信息

    get_term:直接从数据库中获取分类信息get_the_category:使用post_id作为参数,先根据post_id查询对应的文章然后再返回对应的分类信息,如果没有文章信息则返回Null 之 ...

  9. 【Android】12.3 在当前Activity中获取另一个Activity的返回值

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activ ...

  10. jmeter csv中获取带引号的数据详情(转)

    最近在工作中,对jmeter实践的点滴的记录这里分享,不一定正确,仅供参考和讨论,有想法的欢迎留言.谈论. 1技巧1:从csv中获取带引号的数据详情 背景:我们从csv中获取数据,在jmeter中使用 ...

随机推荐

  1. CMake 入门教程:从零开始构建 C/C++ 项目

    CMake是一个跨平台的自动化构建工具,可以用于构建各种类型的项目,包括*C++.C.Python.Java*等.本文将从零开始,介绍如何使用CMake构建一个简单的C/C++项目 安装CMake 首 ...

  2. 探索生成式AI的未来:Chat与Agent的较量与融合

    近年来,生成式人工智能(AI)不仅在技术界引起了广泛关注,更成为了推动多个行业革新的关键力量.这种技术之所以备受瞩目,不仅在于其独特的创造性和高效性,还在于它对未来商业模式和社会结构可能产生的深远影响 ...

  3. 基于ArkUI开发框架,图片马赛克处理的实现

     原文:https://mp.weixin.qq.com/s/60HDKcBFV7GTjZpzeHtjeg,点击链接查看更多技术内容.     关于马赛克   马赛克是一种使用较为广泛的图片处理方式, ...

  4. RestfulApi 学习笔记——.net core入门操作(二)

    前言 前面简单介绍了一下restfulapi是什么东西,那么我们应该在.net core 中如何实现呢?或者说该怎么做才能有这个restful api呢? 正文 幸运的是.net core帮助我们实现 ...

  5. 重新整理数据结构与算法(c#)—— 算法套路动态规划算法[二十六]

    前言 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法. 这样一听和分治算法有点相似啊. 是的,分治算法也是将大问题分为小问题,但是他们毕竟不同,不同之处在什么地 ...

  6. 英文A+B

    A+B 题目描述 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出. 输入描述: 测试输入包含若干测试用例,每个测试用例占一行,格式为"A ...

  7. 了解redis的单线程模型工作原理?一篇文章就够了

    1.首先redis是单线程的,为什么redis会是单线程的呢?从redis的性能上进行考虑,单线程避免了上下文频繁切换问题,效率高:从redis的内部结构设计原理进行考虑,redis是基于Reacto ...

  8. OpenKruise v1.3:新增自定义 Pod Probe 探针能力与大规模集群性能显著提升

    简介: 在版本 v1.3 中,OpenKruise 提供了新的 CRD 资源 PodProbeMarker,改善了大规模集群的一些性能问题,Advanced DaemonSet 支持镜像预热,以及 C ...

  9. MSE 治理中心重磅升级-流量治理、数据库治理、同 AZ 优先

    简介: 本次 MSE 治理中心在限流降级.数据库治理及同 AZ 优先方面进行了重磅升级,对微服务治理的弹性.依赖中间件的稳定性及流量调度的性能进行全面增强,致力于打造云原生时代的微服务治理平台. 作者 ...

  10. 如何使用Delta Lake构建批流一体数据仓库

    ​简介:Delta Lake是一个开源存储层,它为数据湖带来了可靠性.Delta Lake提供了ACID事务.可扩展的元数据处理,并统一了流式处理和批处理数据处理.Delta-Lake运行在现有数据湖 ...