山科-宿鑫 2018.4.13
IDL作为一种语言,应用其实并不广泛,其中遥感类用的比较多,这包括NASA(美国宇航局)、DLR(德国宇航局)。遥感数据中有一种科学数据集,是NASA推崇的,格式为HDF-EOS跟HDF5,下面介绍如何用IDL来解析它们。
  IDL8.3后版本,推出了一个新函数:H5_LIST.pro跟H5_GETDATA.pro,可以轻松获取H5的数据。下面来演示一下:
H5_LIST,'I:\VIIRS_AOD\GAERO-VAOOO_npp_d20170210_t0640220_e0646024_b27409_c20171030130915224552_noaa_ops.h5'
 
然后,我想获取其中一个字段的数据:
 
可以看到已经正确读取到了数据。
但是知道8.5还是没有类似于H5这样的函数应用于HDF数据,下面提供了一个简单的函数来获取HDF数据,注意的是,没加任何错误处理:
HDF_LIST.pro
;+
;@作者:宿鑫
;@time:2017
;@功能:获取HDF数据集中的数据名称
;@参数:File:HDF文件
;-
PRO HDF_LIST,File
  COMPILE_OPT IDL2
  hdf_id = HDF_SD_START(File,/READ)
  HDF_SD_FILEINFO,hdf_id,datasetnum,Attributes
  FOR i = 0,datasetnum-1 DO BEGIN
    DatasetID = HDF_SD_SELECT(hdf_id,i)
    HDF_SD_GETINFO,DatasetID,name = dataset_name,natts = dstNum
    PRINT,dataset_name
    HDF_SD_ENDACCESS,DatasetID
  ENDFOR
  HDF_SD_END,hdf_id
END
HDF_GetData.pro
;+ ;@作者:山科-宿鑫 ;@time:2017 ;@功能:获取HDF数据相应字段的数据 ;@参数:file:HDF文件,Field:数据名称,使用HDF_LIST.pro获取 ;- FUNCTION HDF_GETDATA,File,Field COMPILE_OPT IDL2 hdf_id = HDF_SD_START(File,/READ) sds_index = HDF_SD_NAMETOINDEX(hdf_id,Field) dst_id = HDF_SD_SELECT(hdf_id,sds_index) HDF_SD_GETDATA,dst_id,data HDF_SD_ENDACCESS,dst_id HDF_SD_END,hdf_id RETURN,data END
用法跟H5一模一样,首先是获得需要的字段:
HDF_LIST,'I:\H8Person\MODIS\MYD13\152\MYD13C2.A2017152.006.2017192081419.hdf'
 
再获取数据:
 
2018.11.15号更新
NetCDF(.nc)文件获取数据
;+
; :DESCRIPTION:
;    Describe the procedure.
;    NCFile:NETCDF文件
;    fieldName:需要提取的字段
;    返回值:数据数组
; :AUTHOR: SUXIN
; 2018.11
;-
function NC_Getdata,NCFile,fieldName
  COMPILE_OPT IDL2
  
  NCID = NCDF_OPEN(NCFile)
  DATAID = NCDF_VARID(NCID, fieldName)
  if DATAID eq -1 then begin
    print,'没有此字段'
    return,!NULL
  endif
  NCDF_VARGET, NCID, DATAID, Data
  return,Data
 
end
源码下载链接:https://download.csdn.net/download/wudixinxin/10347713









 
