<IDLでHDFファイル(HDF v5: ".h5")を読み込むメモ>
read_hdfなどという単純な関数を使うわけではないので記録がてらメモを。
HDFファイルは一つのファイルで複数の画像やメタ情報が格納されているなど
構造化されている形式を持つので若干ややこしい。
HDF5ファイルの構造は「ファイル→グループ→データ」のような複数層構造になっている
file_id = H5F_OPEN(file_name)
group_id = H5G_OPEN(file_id, group_name)
dataset_id = H5D_OPEN(group_id, dataset_name)
という感じでOPENを重ねていく。Group層がない構造の場合、Groupを飛ばして直接データにアクセスする形。
サンプルコードを示しながらメモ
下記のやり方はグループ名を指定せずに画像を開く
;; ===============================================================
;; H5 file open ;;
;; まずfile_nameで指定した.h5ファイルのidをH5F_OPENで取得する
;; このファイルidでしばらく作業を進める
file_id = H5F_OPEN(file_name)
;; Check number of objects ;; HDFファイルに格納されているオブジェクトの数をチェック
obj_num = H5G_GET_NUM_OBJS(file_id)
;; Get object name from the h5 file ;; 各オブジェクトの名前を取得する
obj_name = strarr(obj_num)
for i=0, obj_num-1,1 do begin
obj_name[i] = H5G_GET_OBJ_NAME_BY_IDX(file_id, i)
; obj_info = H5G_GET_OBJINFO(file_id, obj_name[i]) ;; <= オブジェクトの情報を知りたいときに
endfor
;; オブジェクトの名前を使ってうまく画像データかメタデータかを判断する処理 ;;
;; たとえばLandsat8なら画像オブジェクトは"B01"といった感じなので
count=0l
image_obj_num = lonarr(obj_num)
for i=0, obj_num-1,1 do begin
if strmid(obj_name[i],0,1) eq "B" and strlen(tmp_obj_name) eq 3 then begin
image_obj_num[count] = i
count++
endif
endfor
image_obj_num = image_obj_num[0:count-1]
;; Open images ;;
;; オブジェクト名を指定してまずデータセットidを取得する ;;
dataset_id1 = H5D_OPEN(file_id, obj_name[image_obj_num[0]])
;; データセットidを利用して画像データを取得
image = H5D_READ(dataset_id1)
;; ===============================================================