;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;++ netCDFファイル読み込みサンプル ++ ;++ readCDF.pro V1.1 2005/06 by VNIJ ++ ;++ --------------------------------------------------------------- ++ ;++ 実行方法: ++ ;++ WAVE> readCDF, data ++ ;++ WAVE> Info, data, /Full ++ ;++ --------------------------------------------------------------- ++ ;++ 注意:                           ++ ;++ readCDFを実行するとファイルセレクタが立ち上がります ++ ;++ HDFファイルはreadHDF.proをご使用ください ++ ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;-- HDFコマンド ;-- status = NCOPEN (path, mode, Help=help, Usage=usage) ;-- status = NCINQUIRE (cdfid, ndims, nvars, natts, recdim, Help=help, Usage=usage) ;-- status = NCDIMINQ (cdfid, dimid, name, length, Help=help, Usage=usage) ;-- status = NCVARINQ (cdfid, varid, name, datatype, ndims, dim, natts, Help=help, Usage=usage) ;-- status = NCVARGET (cdfid, varid, start, count, value, Help=help, Usage=usage) ;-- status = NCATTNAME (cdfid, varid, attnum, name, Help=help, Usage=usage) ;-- status = NCATTGET (cdfid, varid, name, value, Help=help, Usage=usage) ;-- status = NCCLOSE (cdfid, Help=help, Usage=usage) ;--------------------------------------------------------------------- Pro ReadCDF, netcdf_data ;+++++ HDF初期設定 +++++ @hdf_startup ;+++++ ファイルオープン +++++ WgFileSelection,file,Title='netCDFファイルを選んでください' cdfid = Ncopen(file, NC_NOWRITE) ;** netCDFファイルオープン ** netcdf_data = Asarr('file',file) ;-- データ格納変数 -- ;+++++ 変数の数(variables)と次元数(dimensions)をチェック +++++ status = Ncinquire(cdfid, ndims, nvars, ngatts, xdimid) ;** 変数、次元情報 ** ; Print,'次元総数:',ndims ; Print,'変数総数:',nvars ; Print,'ngatts=',ngatts ; Print,'xdimid=',xdimid ; 次元数 Print,'[次元総数:',ndims,']' dims = LONARR(ndims) For dim = 0L, ndims-1 Do Begin status = Ncdiminq(cdfid, dim, dim_name, dim_size);** 次元情報 ** dims(dim) = dim_size Print,' 次元番号 = ',dim Print,'    次元名= ',dim_name Print,'    サイズ= ',dim_size endfor ;+++++ 各変数の値と属性数 +++++ vtp=['BYTE','CHAR','SHORT','LONG','FLOAT','DOUBLE']+'型' Print,'' Print,'[変数総数:',nvars,']' For varid = 0L, nvars-1 Do Begin status = Ncvarinq(cdfid, varid, var_name, var_type, var_ndims, $ var_dims, var_natts);** 変数情報 ** Print,' 変数ID:',varid Print,'    変数名   : ',var_name Print,'    データタイプ: ',vtp(var_type-1) Print,'    次元数   : ',var_ndims Print,'    配列の大きさ : ' For i=0,var_ndims-1 Do Print,' ',dims(var_dims(i)) ; Print,'   Natts    : ',var_natts ;+++++ データ読み込み変数の作成 +++++ Case var_type Of NC_BYTE: idata = 1B NC_CHAR: idata = 1B NC_SHORT: idata = 1 NC_LONG: idata = 1L NC_FLOAT: idata = 1.0 NC_DOUBLE: idata = 1.0D Else: Message,'変数型が不明です....' Endcase ;-- NCVARGETの引数作成 -- cmd0 = 'start = [0' cmd1 = 'count = [dims(var_dims(0))' cmd2 = 'data = Replicate(idata,dims(var_dims(0))' For num=0,var_ndims-2 Do Begin cmd0 = cmd0+',0' cmd1 = cmd1+',dims(var_dims('+Strtrim(num+1,2)+'))' cmd2 = cmd2+',dims(var_dims('+Strtrim(num+1,2)+'))' EndFor cmd0 = cmd0+']' cmd1 = cmd1+']' cmd2 = cmd2+')' s0 = Execute(cmd0) s1 = Execute(cmd1) s2 = Execute(cmd2) ;-- データの読み込みと格納 -- If (s0 Eq 1) And (s1 Eq 1) And (s2 Eq 1) Then Begin status = Ncvarget(cdfid, varid, start, count, data) EndIf Else Begin Print, '... 変数の作成に失敗しました。データの読み込み中止 ...' data = -1 EndElse If (var_type Eq NC_CHAR) Then data = String(data) netcdf_data(var_name) = data ;-- データの格納 -- ; ;+++++ 変数の属性 +++++ ; Print ; Print,'変数',var_name,'には',Strtrim(var_natts,2),'個の属性があります:' ; For att_num=0L, var_natts-1 Do Begin ; status = Ncattname(cdfid, varid, att_num, att_name) ; ;print,'Attribute:',varid ; print,' 属性名: ',att_name ; status = Ncattinq(cdfid, varid, att_name, att_type, att_len) ; ;print, 'Type: ',att_type ; ;print, 'Length:',att_len ; ; num_bytes = att_len*nctypelen(att_type) ; case att_type of ; NC_BYTE: att_value = BYTARR(att_len) ; NC_CHAR: att_value = BYTARR(att_len) ; NC_SHORT: att_value = INTARR(att_len) ; NC_LONG: att_value = LONARR(att_len) ; NC_FLOAT: att_value = FLTARR(att_len) ; NC_DOUBLE: att_value = DBLARR(att_len) ; else: message,'Unknown attribute type' ; endcase ; ; status = Ncattget(cdfid, varid, att_name, att_value) ; ; If att_type Eq NC_CHAR Then $ ; Print,' 属性値: ', STRING(att_value) $ ; Else $ ; Print,' 属性値: ', att_value ; ; Endfor ;- att_num - ; Print ; Hak, /Mesg Endfor ;- varid - ;+++++ ファイルを閉じる +++++ status = Ncclose (cdfid) End