とらりもんHOME  Index  Search  Changes  Login

HDF

(Ubuntu Linux 16.04での動作を前提とします)

HDFとは

主にNASAあたりの衛星データによく使われる, データ規格。HDF4とHDF5がある。HDF5の方がシンプルでわかりやすい気がする。

ライブラリのインストール

  • HDF5
sudo apt-get install hdf5-tools hdf5-helpers libhdf5-dev libhdf5-doc libhdf5-serial-dev

HDF4のよく使うコマンド

  • HDFファイルの内容を確認するには
hdfls
ncdump-hdf

HDF5のよく使うコマンド

... 基本, h5dumpでだいたいいける。

h5dump -H HDF5ファイル名   ..... HDF5ファイルのヘッダーを表示。
h5dump -n HDF5ファイル名   ..... HDF5ファイルの中にどんなデータがあるか, 概要を表示。
h5dump -d データセット名 -b -o 出力ファイル名 HDF5ファイル名   .... HDF5ファイルの中のデータセットをシンプルなrawバイナリのファイルに書き出す。

HDF5ファイルをC言語や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);
}

HDF5ファイルを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

Last modified:2017/12/31 22:12:53
Keyword(s):
References:[とらりもんHOME]