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

打印 上一主题 下一主题

主题 995|帖子 995|积分 2985

ICESat-2 ATL03数据和ATL08数据的分段距离不一致,ATL08在ATL03的基础上重新分段,并对分段内的数据做处置惩罚得到一系列的效果,详情见数据字典:
ATL08 Product Data Dictionary (nsidc.org)
ATL08使用DRAGANN算法对ATL03数据做了去噪处置惩罚,并使用分类算法对每个光子进行分类
标志值标志含义-1未分类0噪声1地面2冠层3冠顶ATL08使用ph_segment_id和classed_pc_indx可以和ATL03对应起来。基于此,可从ATL08中获取ATL03每个光子的分类信息。

读取ATL08
  1. import os
  2. import h5py
  3. import re
  4. def read_hdf5_atl08(filename, beam, verbose=False):
  5.     file_id = h5py.File(os.path.expanduser(filename), 'r')
  6.     # 输出HDF5文件信息
  7.     if verbose:
  8.         print(file_id.filename)
  9.         print(list(file_id.keys()))
  10.         print(list(file_id['METADATA'].keys()))
  11.     # 为ICESat-2 ATL08变量和属性分配python字典
  12.     atl08_mds = {}
  13.     # 读取文件中每个输入光束
  14.     beams = [k for k in file_id.keys() if bool(re.match('gt\\d[lr]', k))]
  15.     if beam not in beams:
  16.         print('请填入正确的光束代码')
  17.         return
  18.     atl08_mds['signal_photons'] = {}
  19.     # -- ICESat-2 Geolocation Group
  20.     for key, val in file_id[beam]['signal_photons'].items():
  21.         atl08_mds['signal_photons'][key] = val[:]
  22.     return atl08_mds
复制代码
映射ATL08

将 ATL08 映射到 ATL03
  1. def get_atl08_mapping(atl03_ph_index_beg, atl03_segment_id, atl08_classed_pc_indx,
  2.                       atl08_classed_pc_flag, atl08_segment_id):
  3.     """
  4.     Function to map ATL08 to ATL03 class photons
  5.     Args:
  6.         atl03_ph_index_beg:
  7.         atl03_segment_id:
  8.         atl08_classed_pc_indx:
  9.         atl08_classed_pc_flag:
  10.         atl08_segment_id:
  11.     Returns:
  12.     """
  13.     # Get ATL03 data
  14.     indsNotZero = atl03_ph_index_beg != 0
  15.     atl03_ph_index_beg = atl03_ph_index_beg[indsNotZero]
  16.     atl03_segment_id = atl03_segment_id[indsNotZero]
  17.     # Find ATL08 segments that have ATL03 segments
  18.     atl03SegsIn08TF, atl03SegsIn08Inds = ismember(atl08_segment_id, atl03_segment_id)
  19.     # Get ATL08 classed indices and values
  20.     atl08classed_inds = atl08_classed_pc_indx[atl03SegsIn08TF]
  21.     atl08classed_vals = atl08_classed_pc_flag[atl03SegsIn08TF]
  22.     # Determine new mapping into ATL03 data
  23.     atl03_ph_beg_inds = atl03SegsIn08Inds
  24.     atl03_ph_beg_val = atl03_ph_index_beg[atl03_ph_beg_inds]
  25.     newMapping = atl08classed_inds + atl03_ph_beg_val - 2
  26.     # Get max size of output array
  27.     sizeOutput = newMapping[-1]
  28.     # Pre-populate all photon classed array with zeroes
  29.     allph_classed = (np.zeros(sizeOutput + 1)) - 1
  30.     # Populate all photon classed array from ATL08 classifications
  31.     allph_classed[newMapping] = atl08classed_vals
  32.     # Return all photon classed array
  33.     return allph_classed
复制代码
添加分类信息
  1. def add_atl08_classed_flag(filepath_08, beam, atl03_mod):
  2.     """
  3.     添加ATL08分类数据到ATL03中
  4.     Args:
  5.         filepath_08: ATL08数据文件位置
  6.         beam: 波束,与ATL03保持一致
  7.         atl03_mod: ATL03数据
  8.     Returns:
  9.     携带ATL08分类信息
  10.     """
  11.     val_03 = atl03_mod
  12.     val_08 = read_hdf5_atl08(filepath_08, beam)
  13.     # val_03['classed_pc_flag'] = np.zeros_like(val_03['heights']['h_ph']) + np.NaN
  14.     atl03_heights = val_03['heights']['h_ph']
  15.     # -- 分段中的第一个光子(转换为基于0的索引)
  16.     segment_index_begin = val_03['geolocation']['ph_index_beg']
  17.     segment_id = val_03['geolocation']['segment_id']
  18.     # 追踪到ATL03上特定20m Segment_ID的光子的段ID
  19.     ph_segment_id = val_08['signal_photons']['ph_segment_id']
  20.     # 该索引追溯到ATL03上20m segment_id内的特定光子。
  21.     classed_pc_index = val_08['signal_photons']['classed_pc_indx']
  22.     # 每个光子的陆地植被ATBD分类标志为噪声、地面、树冠和树冠顶部。0=噪音,1=地面,2=冠层,或3=冠层顶部
  23.     classed_pc_flag = val_08['signal_photons']['classed_pc_flag']
  24.     # Map ATL08 classifications to ATL03 Photons
  25.     all_ph_classed = get_atl08_mapping(segment_index_begin, segment_id,
  26.                                        classed_pc_index, classed_pc_flag, ph_segment_id)
  27.     if len(all_ph_classed) < len(atl03_heights):
  28.         n_zeros = len(atl03_heights) - len(all_ph_classed)
  29.         zeros = np.zeros(n_zeros)
  30.         all_ph_classed = np.append(all_ph_classed, zeros)
  31.     val_03['classed_pc_flag'] = all_ph_classed
复制代码
使用姿势

读取ATL03数据代码见:https://www.cnblogs.com/sw-code/p/18161987
  1. from glob import glob
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4. from matplotlib.ticker import MultipleLocator
  5. from readers.add_atl08_info import add_atl08_classed_flag
  6. from readers.get_ATL03_x_atc import get_atl03_x_atc
  7. from readers.read_HDF5_ATL03 import read_hdf5_atl03_beam_h5py
  8. def select_atl03_data(atl03_data, mask):
  9.     """
  10.     选择数据范围
  11.     Args:
  12.         atl03_data: 所有数据
  13.         mask (list): 维度范围
  14.     Returns:
  15.     """
  16.     # 选择范围
  17.     d3 = atl03_data
  18.     subset1 = (d3['heights']['lat_ph'] > min(mask)) & (d3['heights']['lat_ph'] < max(mask))
  19.     x_act = d3['heights']['x_atc'][subset1]
  20.     h = d3['heights']['h_ph'][subset1]
  21.     signal_conf_ph = d3['heights']['signal_conf_ph'][subset1]
  22.     lat = d3['heights']['lat_ph'][subset1]
  23.     lon = d3['heights']['lon_ph'][subset1]
  24.     classed_pc_flag = d3['classed_pc_flag'][subset1]
  25.     return x_act, h, signal_conf_ph, lat, lon, classed_pc_flag
  26. def get_atl03_data(filepath, beam):
  27.     """
  28.     读取ATL03数据,根据维度截取数据
  29.     Args:
  30.         filepath (str): h5文件路径
  31.         beam (str): 光束
  32.     Returns:
  33.         返回沿轨道距离,高程距离,光子置信度
  34.     """
  35.     atl03_file = glob(filepath)
  36.     is2_atl03_mds = read_hdf5_atl03_beam_h5py(atl03_file[0], beam=beam, verbose=False)
  37.     # 添加沿轨道距离到数据中
  38.     get_atl03_x_atc(is2_atl03_mds)
  39.     return is2_atl03_mds
  40. def show_classification(x_origin, y_origin, classification, clz):
  41.     """
  42.     :param clz: -1:未分类, 0:噪声, 1:地形, 2:冠层, 3:冠顶, 4:海洋
  43.     :param classification: 分类数据
  44.     :param y_origin:
  45.     :param x_origin:
  46.     """
  47.     plt.subplots(num=1, figsize=(24, 6))
  48.     ax = plt.gca()
  49.     ax.get_xaxis().get_major_formatter().set_useOffset(False)
  50.     plt.xticks(rotation=270)
  51.     ax.set_xlabel('x_atc, km')
  52.     ax.set_ylabel('h, m')
  53.     ax.xaxis.set_major_locator(MultipleLocator(100))
  54.     colors = ['red', 'black', 'green', 'violet', 'blue', 'grey']
  55.     for flag in clz:
  56.         idx = np.where(classification == flag)
  57.         plt.scatter(x_origin[idx], y_origin[idx], s=5, c=colors[flag])
  58.     plt.show()
  59. if __name__ == '__main__':
  60.     data = {
  61.         'filepath': 'D:\\Users\\SongW\\Documents\\ICESat-2 Data\\ATL03\\ATL03_20200620024106_13070701_005_01.h5',
  62.         'filepath_08': 'D:\\Users\\SongW\\Documents\\ICESat-2 Data\\ATL08\\ATL08_20200620024106_13070701_005_01.h5',
  63.         'beam': 'gt2l',
  64.         'mask': [19.6468, 19.6521]
  65.     }
  66.     atl03_data = atl03_data = get_atl03_data(data['filepath'], data['beam'])
  67.     add_atl08_classed_flag(data['filepath_08'], data['beam'], atl03_data)
  68.     x_origin, y_origin, conf, lat, lon, classed_pc_flag = select_atl03_data(atl03_data, data['mask'])
  69.     show_classification(x_origin, y_origin, classed_pc_flag, [-1, 0, 1, 2, 3])
复制代码
项目源码

sx-code - icesat-2-atl03 (github.com)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表