遥感入门 | H5文件读写

什么是 H5 文件?

H5 是用于存储大量数据的分层数据格式 (HDF) 之一。它用于以多维数组的形式存储大量数据。该格式主要用于存储组织良好的科学数据,以便快速检索和分析。H5 是作为 H4 的一种更增强的文件格式引入的。它现在由 HDF Group 提供支持。

HDF 文件格式简史

HDF 文件格式被 NASA 选择为存储科学数据的标准方法。在此之前,图形基础工作组(Graphics Foundations Task Force,GFTF)于1987年开始制定这样的标准,HDF在对15种不同的文件格式进行调查后被正式批准。

HDF5 文件格式

H5 文件采用符合 HDF5 文件格式规范的分层数据格式。这些规范奠定了存储在磁盘上的 HDF5 文件的整体结构,但最终用户不需要这些底层细节。

H5文件常用于航空航天、物理、工程、金融、学术研究、基因组学、天文学、电子仪器和医学领域。

HDF5 数据模型

HDF5 文件就像一个由异构数据对象组成的容器。例如,这些数据集可以是图像、表格、文本元素、图形,甚至是PDFExcel 文档等文档

读写H5文件

大概流程是查询文件里的主键,读取主键的数据

以下代码是中国海洋一号的CZI_L2C数据中的叶绿素A数据,并保存为PNG图像格式

import h5py
from matplotlib.figure import Figure
from matplotlib.colors import LinearSegmentedColormap
import numpy as np


# RGB 也可以设置透明度
def colormap():
    return LinearSegmentedColormap.from_list('cmap',
                                             ['#FFFFFFFF', '#0198F5FF', '#00FF00FF', '#FFFF00FF', '#FF0000FF',
                                              '#FFFFFF00'],
                                             256)


def trans_png(infile: str, nvi_file: str):
    in_file = h5py.File(infile, mode='r')
    # H5 主键
    print(list(in_file.keys()))
    print(list(in_file["Geophysical Data"].keys()))
    nvi_ds = in_file['/Geophysical Data/Rrs460']

    print(nvi_ds.shape,nvi_ds.dtype)

    for attr_name,attr_value in nvi_ds.attrs.items():
        print(attr_name,attr_value)
    dataset =  nvi_ds[:].astype(float)


    fig = Figure(figsize=dataset.shape[::-1], dpi=400, frameon=False)
    # cmap设置色带
    # vmin,vmax 设置色带范围
    dataset[dataset == nvi_ds.attrs['FillValue']] = np.NAN
    dataset = dataset*nvi_ds.attrs['Slope'] #乘以缩放系数

    vmin = np.nanmin(dataset)
    vmax = np.nanmax(dataset)
    ds = (dataset - vmin) / (vmax - vmin)

    # fig.figimage(ds, cmap=colormap(),vmin=np.nanmin(ds),vmax= np.nanmax(ds))
    fig.figimage(ds, cmap="jet")

    fig.savefig(nvi_file, dpi=1, format='png')

    print('success')


if __name__ == "__main__":
    input_file = r"E:\DDD\HY1C\H1C_OPER_CZI_L2C_20200625T032700_20200625T032755_09418_10\H1C_OPER_CZI_L2C_20200625T032700_20200625T032755_09418_10.h5"
    output_nvi_file = "./H1C_OPER_CZI_L2B_20190803T014203_20190803T014258_04730_10.nvi.png"
    trans_png(input_file, output_nvi_file)

结果如下:

H1C_OPER_CZI_L2B_20190803T014203_20190803T014258_04730_10.nvi

小结

H5文件和NC文件的读写大体上是一样的,海洋一号的数据可以在https://osdds.nsoas.org.cn/ 下载

本文的数据,可以在公众号里回复“海洋一号”下载