【223】◀▶ IDL HDF 文件操作说明
参考:I/O - HDF Routines —— HDF 操作函数
01 | HDF_SD_START | 打开一个 SDS 模式的 HDF 文件。 | |
02 | HDF_SD_END | 关闭一个 SDS 模式的 HDF 文件。 | |
03 | HDF_SD_NAMETOINDEX | 返回变量索引。 | |
04 | HDF_SD_SELECT | 返回变量标识符。 | |
05 | HDF_SD_GETDATA | 读取变量数据。 | |
06 | HDF_SD_ENDACCESS | 结束到一个变量的通道。 | |
07 | HDF_SD_ATTRFIND | 返回属性索引。 | |
08 | HDF_SD_ATTRINFO | 读取属性数据。 | |
09 | HDF_SD_FILEINFO | 返回文件信息。 | |
10 | HDF_SD_GETINFO | 返回变量信息。 | |
11 | HDF_SD_CREATE | 创建一个变量。 | |
12 | HDF_SD_ADDDATA | 写入变量数据。 | |
13 | HDF_SD_DIMGETID | 创建一个维度。 | |
14 | HDF_SD_DIMSET | 设置维度信息。 | |
15 | HDF_SD_DIMGET | 返回一个 SD 数据集维度的信息。 | |
16 | HDF_SD_ATTRSET | 写入属性数据。 | |
17 | HDF_SD_SETINFO | 设置变量信息。 |
HDF(Hierarchical Data Formats)数据格式由 NCSA 开发。HDF 提供了大量的数据模式,包括多维数组、表格、图像、注解和调色板。在下面的章节中,将描述 HDF 科学数据系列(SDS)的数据模式,因为它是 HDF 中最具灵活性的,并且它和 NetCDF 具有相似性。也就是说,HDF SDS 的基本组成也是变量、属性和维数。
注意:IDL读取数据与在其他软件上显示的数据位置相反,左上对右下!
注意:HDF记录数据与实际数据是通过一个数量关系获取的,如下图所示:
实际结果 = 显示结果 × slope + intercept |
序号 | 名称 |
功能说明 |
语法 & 举例 | ||
01 | HDF_SD_START |
打开或新建一个 SDS 模式的 HDF 文件,并初始化这个SD接口。 |
;打开一个新的 HDF 文件 SDinterface_id = HDF_SD_START('test.hdf', /CREATE) ;当结束文件的时候需要调用 HDF_SD_END HDF_SD_END, SDinterface_id ------------------------------------------------------------------------------------- IDL> file = 'D:\McDelfino\dell-dev\IDL\A.L2_LAC' IDL> hdfid = HDF_SD_START(file, /RDWR) IDL> hdfid 393216
|
||
02 | HDF_SD_END |
|
关闭一个 SDS 模式的 HDF 文件。 |
SDinterface_id = HDF_SD_START('test.hdf', /CREATE) ;使用多种命令读取 HDF 文件中的 SD 数据,当完成数据集操作,要调用 HDF_SD_ENDACCESS 来结束数据集操作 HDF_SD_ENDACCESS, SDdataset_id_1 ;当完成文件的操作,要调用 HDF_SD_END 来结束文件操作 HDF_SD_END, SDinterface_id ------------------------------------------------------------------------------------- IDL> file = 'D:\McDelfino\dell-dev\IDL\A.L2_LAC' IDL> hdfid = HDF_SD_START(file, /RDWR) IDL> ;处理过程 IDL> HDF_SD_END, hdfid |
|
03 | HDF_SD_NAMETOINDEX |
返回变量索引。(通过名称获取相应的索引值) |
SDinterface_id = HDF_SD_START('demo.hdf') ;返回 variable_2 数据集的索引值 index = HDF_SD_NAMETOINDEX(SDinterface_id, 'variable_2') ;访问数据集 SDdataset_id=HDF_SD_SELECT(SDinterface_id,index) ;结束访问 HDF_SD_ENDACCESS, SDdataset_id HDF_SD_END, SDinterface_id ------------------------------------------------------------------------------------- IDL> file = 'D:\McDelfino\dell-dev\IDL\A.L2_LAC' IDL> hdfid = HDF_SD_START(file, /RDWR) IDL> ;读取数据中的lat数据 IDL> ;通过latitude来获取相应的索引值 IDL> index = HDF_SD_NAMETOINDEX(hdfid, 'latitude') IDL> ;通过索引值获取ID值 IDL> varid = HDF_SD_SELECT(hdfid, index) IDL> ;通过ID值获取数组值 IDL> HDF_SD_GETDATA, varid, latdata IDL> HELP, latdata LATDATA DOUBLE = Array[1354, 2040] |
||
04 | HDF_SD_SELECT |
根据变量索引值返回变量的标识符 VAR ID。 |
|||
05 | HDF_SD_GETDATA |
读取变量数据。 |
IDL> ;在下面的例子中,从 0 列、100 行开始读取 100×1 的变量子集,读取时在列的维度上元素一个隔一个地读取(左右) IDL> hdfid = HDF_SD_START('EarthProbe5_31_99.hdf') IDL> index = HDF_SD_NAMETOINDEX(hdfid, 'TOTAL_OZONE') IDL> varid = HDF_SD_SELECT(hdfid, index) IDL> HDF_SD_GETDATA, varid, data, START=[0, 100], COUNT=[100, 1], STRIDE=[2, 1] IDL> HELP, data DATA INT = Array[100] IDL> data[0:3] 257 0 0 258 IDL> HDF_SD_ENDACCESS, varid IDL> HDF_SD_END, hdfid IDL> TVSCL, data |
||
06 | HDF_SD_ENDACCESS |
结束一个变量的通道。 |
IDL> ;访问变量数据后,需要结束 IDL> hdfid = HDF_SD_START('EarthProbe5_31_99.hdf') IDL> index = HDF_SD_NAMETOINDEX(hdfid, 'OZONE') IDL> varid = HDF_SD_SELECT(hdfid, index) IDL> ;处理过程 IDL> HDF_SD_ENDACCESS, varid IDL> HDF_SD_END, hdfid |
||
07 | HDF_SD_ATTRFIND |
返回属性索引。 |
SDinterface_id = HDF_SD_START('demo.hdf') ;找到 "TITLE",一个全局属性 gindex = HDF_SD_ATTRFIND(SDinterface_id, 'TITLE') ;读取属性信息 HDF_SD_ATTRINFO, SDinterface_id, gindex, NAME=name, TYPE=type, COUNT=count ;打印变量的信息 HELP, type, count, name ;获取第一个数据集的 ID SDdataset_id = HDF_SD_SELECT(SDinterface_id, 1) ;找到数据集中的 "LOCATION" 属性 dindex = HDF_SD_ATTRFIND(SDdataset_id, 'LOCATION') ;读取属性信息 HDF_SD_ATTRINFO, SDdataset_id, dindex, NAME=name, TYPE=type, COUNT=count ------------------------------------------------------------------------------------- IDL> ;读取属性数据 IDL> hdfid = HDF_SD_START('Manassas.hdf') IDL> index = HDF_SD_NAMETOINDEX(hdfid, 'CEL0: ELEVATION') IDL> varid = HDF_SD_SELECT(hdfid, index) IDL> attindex = HDF_SD_ATTRFIND(varid, 'valid_range') IDL> HDF_SD_ATTRINFO, varid, attindex, data=attvalue IDL> attvalue 17134 17394 IDL> HDF_SD_ATTRINFO, varid, attindex, COUNT=count , DATA=data, HDF_TYPE=HDF_type , NAME=name , TYPE=type IDL> count 2 IDL> data 17134 17394 IDL> hdf_type DFNT_INT16 IDL> name valid_range IDL> type INT |
||
08 | HDF_SD_ATTRINFO |
读取属性数据。 |
|||
09 | HDF_SD_FILEINFO |
返回文件信息。 |
IDL> ;获取变量信息 IDL> hdfid = HDF_SD_START('Manassas.hdf') IDL> HDF_SD_FILEINFO, hdfid, nvars, ngatts IDL> nvars 1 IDL> ngatts 6 IDL> hdfid = HDF_SD_START('EarthProbe5_31_99.hdf') IDL> HDF_SD_FILEINFO, hdfid, nvars, ngatts IDL> nvars 4 IDL> ngatts 0 IDL> varid = HDF_SD_SELECT(hdfid, 0) IDL> HDF_SD_GETINFO, varid, NAME=name, NDIMS=ndims, TYPE=type, DIMS=dims IDL> name TOTAL_OZONE IDL> ndims 2 IDL> type INT IDL> dims 288 180 IDL> HDF_SD_GETINFO, varid, NAME=name, NDIMS=ndims, TYPE=type, DIMS=dims, UNIT=unit, FORMAT=format IDL> unit MATM_CM IDL> format I3 |
||
10 | HDF_SD_GETINFO |
返回变量信息。 |
|||
11 | HDF_SD_CREATE |
创建一个变量。 |
;新建HDF文件,并添加变量值 ;新建HDF的文件路径 file='D:\IDL\sst13.hdf' ;以create的形式打开文件 hdfid=HDF_SD_START(file, /create) ;新建latitude变量,在HDF上显示1354列,2040行,默认是浮点型数组 sds_id=HDF_SD_CREATE(hdfid, 'latitude', [1354, 2040], /float) ;由于从HDF中读取的数据与实际数据存在一个中心对称的关系,因此通过两个reverse实现 ;latdata就是从其他HDF中读取的数组,将数组的结果添加到变量latitude中去 HDF_SD_ADDDATA, sds_id, REVERSE(REVERSE(latdata), 2) HDF_SD_ENDACCESS, sds_id HDF_SD_END, hdfid ------------------------------------------------------------------------------------- start = [40, 20] count = [70, 100] stride = [2, 3] image = DIST(230, 380) ;以 SD 模式创建一个新的 HDF 文件 SDinterface_id = HDF_SD_START('image.hdf', /CREATE) ;定义一个新的 SD 数据集 SDdataset_id = HDF_SD_CREATE(SDinterface_id, 'image', [230, 380], /BYTE) ;把 image 数据写入到数据集中 HDF_SD_ADDDATA, SDdataset_id, image ;获取整个 image 数据 HDF_SD_GETDATA, SDdataset_id, full ;获取部分 image 数据 HDF_SD_GETDATA, SDdataset_id, small, COUNT=count, START=start, STRIDE=stride HDF_SD_ENDACCESS, SDdataset_id HDF_SD_END, SDinterface_id |
||
12 | HDF_SD_ADDDATA |
写入变量数据。(修改变量的值) |
|||
13 | HDF_SD_DIMGETID |
创建一个维度。 |
SDinterface_id = HDF_SD_START('myhdf.hdf', /RDWR) ;创建一个三维数组的变量 SDdataset_id = HDF_SD_CREATE(SDinterface_id, 'var1', [10,20,0], /LONG) ;选择第一个维度 dim_id=HDF_SD_DIMGETID(SDdataset_id,0) ; Set the data strings and scale for the first dimension: HDF_SD_DIMSET, dim_id, NAME='d1', LABEL='l1', FORMAT='f1', UNIT='u1', SCALE=FINDGEN(10) HDF_SD_ENDACCESS, SDdataset_id HDF_SD_END, SDinterface_id ; Reopen the file: SDinterface_id = HDF_SD_START('myhdf.hdf') ; Select the first dimension: dim_id = HDF_SD_DIMGETID(SDdataset_id,0) ; Retrieve the information: HDF_SD_DIMGET, dim_id, NAME=d1, LABEL=l1, FORMAT=f1, UNIT=u1, SCALE=sc, COUNT=cnt, NATTR=natt, TYPE=type ; Print information about the returned variables: HELP, d1, l1, f1, u1, sc, cnt, natt, type ; Close the SD interface: HDF_SD_ENDACCESS,SDdataset_id HDF_SD_END, SDinterface_id |
||
14 | HDF_SD_DIMSET |
设置维度信息。 |
|||
15 | HDF_SD_DIMGET |
返回一个 SD 数据集维度的信息。 |
|||
16 | HDF_SD_ATTRSET |
写入属性数据。(将某个变量的某个属性值进行修改) |
SDinterface_id = HDF_SD_START('demo.hdf', /RDWR) ;创建一个全局属性 HDF_SD_ATTRSET, SDinterface_id, 'TITLE', 'MY TITLE GLOBAL', 16 ;创建另一个全局属性 HDF_SD_ATTRSET, SDinterface_id, 'RANGE', [-99.88,55544.2], /DOUBLE ;创建一个变量(数据集) SDdataset_id = HDF_SD_CREATE(SDinterface_id, 'var1', [10,20], /FLOAT) ;增加一个变量属性 HDF_SD_ATTRSET, SDdataset_id, 'TITLE', 'MY TITLE SDinterface_id', 15 ;找到刚刚创建的 RANGE 属性 index=HDF_SD_ATTRFIND(SDinterface_id, 'RANGE') ;从 RANGE 中获取数据 HDF_SD_ATTRINFO, SDinterface_id, index, NAME=atn, COUNT=atc, TYPE=att, DATA=d HELP, atn, atc, att PRINT, d, FORMAT='(F8.2,x,F8.2)' HDF_SD_ENDACCESS, SDdataset_id HDF_SD_END, SDinterface_id |
||
17 | HDF_SD_SETINFO |
设置变量信息。 |
|
||
|
posted on 2016-08-27 08:07 McDelfino 阅读(2137) 评论(0) 编辑 收藏 举报