;=========================================================== ;++ ----------------------------------------------------- ++ ;++ HDF->netCDFへの変換サンプル ++ ;++ HDF2netCDF.pro V1.0 2005/08 By VNIJ ++ ;++ ----------------------------------------------------- ++ ;++ 使い方: ++ ;++ WAVE> HDF2netCDF ++ ;++ ファイルセレクタでHDFファイルを選ぶと、同名の ++ ;++ netCDFファイルを作成する。拡張子は.nc ++ ;++ ----------------------------------------------------- ++ ;=========================================================== Pro HDF2netCDF ;+++++ HDF初期設定 +++++ @hdf_startup ; @hdf_common ;+++++ HDFファイル名の取得 +++++ WgFileSelection,file,Title='HDFファイルを選んでください' ;----- netCDFファイル名の作成 ----- Parsefilename, file, Fileroot=cdf_file, Path=path cdf_file=path+cdf_file+'.nc' ;+++++ HDFファイルのオープン +++++ hdfid = Ncopen(file, NC_NOWRITE) ;----- netCDFファイル名のオープン ----- cdfid = Nccreate(cdf_file,NC_CLOBBER) ;+++++ HDFファイルから変数の数(variables)と次元数(dimensions)を読み込む +++++ status = Ncinquire(hdfid, ndims, nvars, ngatts, xdimid) ;** 変数、次元情報 ** Print,'次元総数:',ndims Print,'変数総数:',nvars Print,'ngatts=',ngatts Print,'xdimid=',xdimid ; 次元数 Print,'[次元総数:',ndims,']' dims = LONARR(ndims) dim_id=dims For dim = 0L, ndims-1 Do Begin status = Ncdiminq(hdfid, dim, dim_name, dim_size);** 次元情報 ** dims(dim) = dim_size Print,' 次元番号 = ',dim Print,'    次元名= ',dim_name Print,'    サイズ= ',dim_size ;----- netCDFファイル:次元情報の定義書き込み ----- dim_id(dim) = Ncdimdef(cdfid,dim_name, dim_size) Endfor ;+++++ HDFファイルから各変数の値と属性数を読み込む +++++ Print,'' Print,'[変数総数:',nvars,']' variableID=Lonarr(nvars) For varid = 0L, nvars-1 Do Begin status = Ncvarinq(hdfid, varid, var_name, var_type, var_ndims, $ var_dims, var_natts);** 変数情報 ** Print,' 変数ID:',varid Print,'    変数名   : ',var_name Print,'    データタイプ: ',var_type Print,'    次元数   : ',var_ndims Print,'    配列の大きさ : ' For i=0,var_ndims-1 Do Print,' ',dims(dim_id(var_dims(i))) ; Print,'   Natts    : ',var_natts ;----- netCDFファイル:次元情報の定義を保存 ----- v_id = Ncvardef(cdfid,var_name, var_type, var_ndims, dim_id(var_dims)) variableID(varid)=v_id ;-- 変数のIDを保存 -- Endfor ;- varid - ;+++++ データ値の読み込みと保存 +++++ status = Ncclose(cdfid) cdfid = ncopen(cdf_file, NC_WRITE) For varid = 0L, nvars-1 Do Begin ;+++++ HDFファイルからデータを読み込む +++++ status = Ncvarinq(hdfid,varid,var_name,var_type,var_ndims,var_dims,var_natts) s = HdfGetSds(file,data) Info,data ;----- netCDFファイルへデータを書き込む ----- start = Lonarr(var_ndims) count = dims(dim_id(var_dims)) s = Ncvarput(cdfid, variableID(varid), start, count, data) EndFor ;+++++ HDFファイルを閉じる +++++ status = Ncclose (hdfid) ;----- netCDFファイルを閉じる ----- status = Ncclose (cdfid) If (status Eq -1) Then Print,"*** netCDF file の保存に失敗しました ***" Return End