とらりもんHOME  Index  Search  Changes  Login

とらりもん - HDF Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

(We assume you are using Ubuntu Linux 16.04)

!What is HDF?
* HDF is a data format which is common and popular for satellite data especially of NASA and JAXA.
* There are HDF4 and HDF5.
* HDF5 may be simpler and easier to understand and handle.
* HDF4までのscientific dataset (SDS)はHDF5ではdatasetになったらしい。

If you want to use HDF4, go to [[HDF4]] page!!

[[HDF5 documents|https://portal.hdfgroup.org/display/HDF5/HDF5+User+Guides]]

!Installing HDF5 libraries:
* HDF5
sudo apt-get install hdf5-tools hdf5-helpers libhdf5-dev libhdf5-doc libhdf5-serial-dev


!HDF5 useful commands
... Perhaps "h5dump" works for most of your purpose!
h5dump -H HDF5_filename   ..... show HDF5 file headder info.
h5dump -n HDF5_filename   ..... show summary of datasets in HDF5 file.
h5dump -d データセット名 -b -o 出力ファイル名 HDF5ファイル名   .... HDF5ファイルの中のデータセットをシンプルなrawバイナリのファイルに書き出す。
h5ls HDF5ファイル名/グループ名/データ名 ... データの構造(配列のサイズなど)を表示
例: h5ls GPMCOR_DPR_1405281041_1214_001397_L2S_DD2_05A.h5/MS/PRE/sigmaZeroMeasured

!h5dump command
詳細は, https://support.hdfgroup.org/HDF5/doc/RM/Tools/h5dump.htm

例: 表示する桁数が不十分なとき:

h5dump - A target_file
h5dump - A -m '%.3f' target_file

!Example: How to find a unit of a product?

$ h5dump -n GPMMRG_MAP_2201_M_L3S_MCM_05A.h5
HDF5 "GPMMRG_MAP_2201_M_L3S_MCM_05A.h5" {
FILE_CONTENTS {
  group      /
  group      /Grid
  dataset    /Grid/Latitude
  dataset    /Grid/Longitude
  dataset    /Grid/gaugeQualityInfo
  dataset    /Grid/monthlyPrecipRate
  ...
  }
}

$ h5dump -a /Grid/monthlyPrecipRate/units GPMMRG_MAP_2201_M_L3S_MCM_05A.h5
HDF5 "GPMMRG_MAP_2201_M_L3S_MCM_05A.h5" {
ATTRIBUTE "units" {
   DATATYPE  H5T_STRING {
      STRSIZE 6;
      STRPAD H5T_STR_NULLTERM;
      CSET H5T_CSET_ASCII;
      CTYPE H5T_C_S1;
   }
   DATASPACE  SCALAR
   DATA {
   (0): "mm/hr"
   }
}
}

!HDF5 to GeoTiff
$ gdal_translate 'HDF5:"GPMMRG_MAP_2101_M_L3S_MCM_04G.h5"://Grid/monthlyPrecipRateGC' 2021_01_monthlyPrecipRateGC.tiff
* まずHDF5ファイルの構造を調べて, 抜き出したいdatasetを知る。例: $ gdalinfo GPMMRG_MAP_2101_M_L3S_MCM_04G.h5
* その中のダブルクオートで書かれている部分(HDF5:.....)を抜き出し, gdal_translateに入れればOK。


!Handle HDF5 file in C language and/or C++ language
* A good tutorial: [[ftp://hdfgroup.org/HDF5/releases/hdf5-1.6/hdf5-1.6.7/src/unpacked/doc/html/Tutor/title.html]]
* コンパイラはh5cc (Cの場合)やh5c++ (C++の場合)を使うべし! コンパイルオプションとか気にしないでよいのでスゲー楽。
* HDF5ファイルを作るサンプルプログラム(C言語)
/* H5test_write.c
  * Creating and closing a dataset.
  * editted on "h5_crtdat.c" taken from ftp://hdfgroup.org/HDF5/releases/hdf5-1.6/hdf5-1.6.7/src/unpacked/doc/html/Tutor/title.html
  * 2017/12/15 Kenlo Nasahara
  * compile: h5cc H5test_write.c
  */

# include <hdf5.h>
# define FILE "dset.h5"

int main() {
   hid_t       file_id, dataset_id, dataspace_id;
   hsize_t     dims[2] = {4, 6};
   herr_t      status;

   int         i, j, dset_data[4][6];

   /* Initialize the dataset. */
   for (i = 0; i < 4; i++)
      for (j = 0; j < 6; j++)
         dset_data[i][j] = i * 6 + j + 1;


   /* Create a new file using default properties. */
   file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

   /* Create the data space for the dataset. */
   dataspace_id = H5Screate_simple(2, dims, NULL);

   /* Create the dataset. */
   dataset_id=  H5Dcreate(file_id, "/dset", H5T_STD_I32LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);

   /* Write the dataset. */
   status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);

   /* End access to the dataset and release resources used by it. */
   status = H5Dclose(dataset_id);

   /* Terminate access to the data space. */
   status = H5Sclose(dataspace_id);

   /* Close the file. */
   status = H5Fclose(file_id);
}

* 上で作ったHDF5ファイルを読むサンプルプログラム(C言語)↓
/* H5test_read.c
  * Reading a dataset.
  * editted on "h5_rdwt.c" taken from ftp://hdfgroup.org/HDF5/releases/hdf5-1.6/hdf5-1.6.7/src/unpacked/doc/html/Tutor/title.html
  * 2017/12/15 Kenlo Nasahara
  * compile: h5cc H5test_read.c
  */

#include <hdf5.h>
#include<stdio.h>
#include<stdlib.h>
#define FILE "dset.h5"

int main() {
   hid_t       file_id, dataset_id, dataspace_id, filespace_id;  // identifiers
   herr_t      status;
   int         *dset_data;
   int         x, y;
   int         rank;
   hsize_t     dims[2];

   /* Open an existing file. */
   file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT);

   /* Open an existing dataset. */
   dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);

   /* Read the dataset. */
   filespace_id= H5Dget_space (dataset_id);    // just for reading rand and dimensions
   rank        = H5Sget_simple_extent_ndims(filespace_id);               // read rank
   status      = H5Sget_simple_extent_dims (filespace_id, dims, NULL);   // read dimensions
   dset_data   = calloc(sizeof(int), dims[0]*dims[1]);    // array for data
   status      = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);

   for (y = 0; y < dims[0]; y++)
      for (x = 0; x < dims[1]; x++)
         printf("%d ", dset_data[y*dims[1]+x]);

   /* Close the dataset. */
   status = H5Dclose(dataset_id);

   /* Close the file. */
   status = H5Fclose(file_id);
   free(dset_data);
}

* HDF5ファイルを作るサンプルプログラム(C++)
/* H5test_write.cpp
  * Creating and closing a dataset.
  * editted on "H5test_write.c"
  * 2017/12/15 Kenlo Nasahara
  * compile: h5c++ H5test_write.cpp
  */

# include <iostream>
# include <H5Cpp.h>
# define FILE "dset.h5"

using namespace std;
  
int main() {
   H5::H5File    file(FILE, H5F_ACC_TRUNC);
   H5::IntType   datatype( H5::PredType::NATIVE_INT );
   datatype.setOrder( H5T_ORDER_LE );
   hsize_t       dims[2] = {4, 6};
   H5::DataSpace dataspace( 2, dims );
   H5::DataSet   dataset   = file.createDataSet( "/dset", datatype, dataspace );
   int         i, j, dset_data[4][6];
   for (i = 0; i < 4; i++)
      for (j = 0; j < 6; j++)
         dset_data[i][j] = i * 6 + j + 1;
   dataset.write(dset_data, datatype );
   return 0;  // successfully terminated
}

* 上で作ったHDF5ファイルを読むサンプルプログラム(C++)↓
/* H5test_read.cpp
  * Reading a dataset.
  * editted on "H5test_read.c"
  * 2017/12/15 Kenlo Nasahara
  * compile: h5c++ H5test_read.cpp
  */

# include <iostream>
# include <H5Cpp.h>
# include <stdlib.h>
# define FILE "dset.h5"

using namespace std;

int main() {
   H5::H5File    file(FILE, H5F_ACC_RDONLY);
   H5::DataSet   dataset   = file.openDataSet("/dset");
   H5::DataSpace dataspace = dataset.getSpace();
   int           rank=dataspace.getSimpleExtentNdims();
   hsize_t       dims[2];
   int ndims=dataspace.getSimpleExtentDims(dims, NULL);

   int         *dset_data;
   dset_data   = (int*)calloc(sizeof(int), dims[0]*dims[1]);

   dataset.read(dset_data, H5::PredType::NATIVE_INT);

   int x, y;
   for (y = 0; y < dims[0]; y++)
      for (x = 0; x < dims[1]; x++)
         printf("%d ", dset_data[y*dims[1]+x]);

   free(dset_data);
}


!Handle HDF5 file with python (Ubuntu)

$ sudo apt-get install python-h5py python3-h5py
$ ipython3
import h5py
import numpy as np
fn='GPMTRM_PR1_1311302305_0038_091382_L2S_PU2_8b18_mod.h5'
infh=h5py.File(fn, 'r')
za=infh['/NS/PRE/localZenithAngle'].value