• 【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 文件的 SD ID。如果没有设置关键字,则以只读形式打开。
    以 HDF_SD_START 打开的文件,最终需要用 HDF_SD_END 进行关闭。
    ◈ SDS:Scientific Datasets,科学数据集系列
    ◈ SD ID:科学数据集的 ID 值

    ----------------------------------------------------------------------------------

    Result = HDF_SD_START( Filename [, /READ | , /RDWR] [, /CREATE] )
    ----------------------------------------------------------------------------------
    Filename:欲打开或创建的文件路径
    ◈ READ:只读模式,默认模式
    RDWR:读写模式
    CREATE:创建一个新的 SD 文件

     
    ;打开一个新的 HDF 文件
    SDinterface_id = HDF_SD_START('test.hdf', /CREATE)
    ;当结束文件的时候需要调用 HDF_SD_END
    HDF_SD_END, SDinterface_id
    -------------------------------------------------------------------------------------
    IDL> file = 'D:McDelfinodell-devIDLA.L2_LAC'
    IDL> hdfid = HDF_SD_START(file, /RDWR)
    IDL> hdfid
          393216
    

     

     02 HDF_SD_END

     

     

    关闭一个 SDS 模式的 HDF 文件。
    与 HDF_SD_START 对应使用。
    ----------------------------------------------------------------------------------
    HDF_SD_END, SDinterface_id
    ----------------------------------------------------------------------------------
    SDinterface_id由 HDF_SD_START 返回的 SD ID 值(hdfid)

     
    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:McDelfinodell-devIDLA.L2_LAC'
    IDL> hdfid = HDF_SD_START(file, /RDWR)
    IDL> ;处理过程
    IDL> HDF_SD_END, hdfid
    
     03 HDF_SD_NAMETOINDEX  

    返回变量索引。(通过名称获取相应的索引值)
    返回的索引值利用 HDF_SD_SELECT 来进行变量(SD 数据集)的操作。
    ----------------------------------------------------------------------------------
    Result = HDF_SD_NAMETOINDEX(SDinterface_id, SDS_Name)
    ----------------------------------------------------------------------------------
    SDinterface_id:由 HDF_SD_START 返回的 SD ID 值(hdfid)
    SDS_Name:指定 SD 数据集中某个字符串名称

      
    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:McDelfinodell-devIDLA.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。
    ----------------------------------------------------------------------------------
    Result = HDF_SD_SELECT(SDinterface_id, Number)
    ----------------------------------------------------------------------------------
    SDinterface_id:由 HDF_SD_START 返回的 SD ID 值(hdfid)
    Number:变量的索引值。

     05 HDF_SD_GETDATA  

    读取变量数据。
    根据变量标识符(数据集ID)来读取,数据存储在 Data 变量中
    ----------------------------------------------------------------------------------
    HDF_SD_GETDATA, SDdataset_id, Data [, COUNT=vector] [, /NOREVERSE] [, START=vector] [, STRIDE=vector]
    ----------------------------------------------------------------------------------
    SDdataset_idHDF_SD_SELECT、HDF_SD_CREATE  返回的 SD ID 值(varid)
    COUNT
    =vector:每维中读取元素的数目,默认是从 start 位置到每维的最后一个元素
    START=vector:每维中读取的第一个元素,默认从零开始[0, 0, ..., 0]
    STRIDE=vector
    中提取的间隔,默认为 [0, 0, ..., 0],意味着每个元素都被选中
    NOREVERSE:默认从 HDF 数据读到 IDL 中,要将列转换成行,设置此关键字将不转置
    ----------------------------------------------------------------------------------

    注意:如果 START、COUNT 或 STRIDE 导致变量超出了范围,则 IDL 在读取时将舍去超出的部分,并给出错误信息。

     
    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  

    结束一个变量的通道。
    ----------------------------------------------------------------------------------
    HDF_SD_ENDACCESS, SDinterface_id
    ----------------------------------------------------------------------------------
    SDinterface_id:HDF_SD_SELECT、HDF_SD_CREATE  返回的 SD ID 值(varid)

     
    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  

    返回属性索引。
    如果没有定位到属性,则返回值为 -1
    ◈ 使用 hdfid 读取全局属性
    ◈ 如果是属于某一变量的属性,则需要通过 varid 来读取
    ----------------------------------------------------------------------------------
    Result = HDF_SD_ATTRFIND(SD_id, Name)
    ----------------------------------------------------------------------------------
    SD_id:由 HDF_SD_START、HDF_SD_SELECT、HDF_SD_CREATE 得到的 SD ID 值,可以是 hdfid 或者 varid
    Name:属性的名称。

      
    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  

    读取属性数据。
    使用 hdfid 读取全局属性
    如果是属于某一变量的属性,则需要通过 varid 来读取
    ----------------------------------------------------------------------------------
    HDF_SD_ATTRINFO, SD_id, Attr_Index [, COUNT=variable] [, DATA=variable] [, HDF_TYPE=variable] [, NAME=variable] [, TYPE=variable]
    ----------------------------------------------------------------------------------
    SD_id:由 HDF_SD_START、HDF_SD_SELECT、HDF_SD_CREATE 得到的 SD ID 值,可以是 hdfid 或者 varid
    Attr_Index:属性的索引值,可通过 HDF_SD_ATTRFIND 函数获取
    COUNT=variable:返回属性所包含的值的数量
    DATA=variable:返回属性数据
    HDF_TYPE=variable:返回属性的 HDF type
    NAME=variable:返回属性的名称
    TYPE=variable:返回数据的类型

    09 HDF_SD_FILEINFO  

    返回文件信息。
    包括变量的总数和全局属性的总数
    ----------------------------------------------------------------------------------
    HDF_SD_FILEINFO, SDinterface_id, Datasets, Attributes
    ----------------------------------------------------------------------------------
    SDinterface_id:由 HDF_SD_START 返回的 SD ID 值(hdfid)
    Datasets:变量的总数
    Attributes:全局属性的总数

      
    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  

    返回变量信息。
    ----------------------------------------------------------------------------------
    HDF_SD_GETINFO, SDdataset_id [, CALDATA=variable] [, COORDSYS=variable] [, DIMS=variable] [, FILL=variable] [, FORMAT=variable] [, HDF_TYPE=variable] [, LABEL=variable] [, NAME=variable] [, NATTS=variable] [, NDIMS=variable] [, /NOREVERSE] [, RANGE=variable] [, TYPE=variable] [, UNIT=variable]
    ----------------------------------------------------------------------------------
    SDdataset_idHDF_SD_SELECT、HDF_SD_CREATE  返回的 SD ID 值(varid)
    NATTS=variable:变量中包含的属性数目
    NDIMS=variable:维度的数目
    NAME=variable:变量的名称
    DIMS=variable:具体的维度信息
    TYPE=variable:数据类型

    11 HDF_SD_CREATE  

    创建一个变量。
    ----------------------------------------------------------------------------------
    Result = HDF_SD_CREATE( SDinterface_id, Name, Dims [, /BYTE] [, /DFNT_CHAR8] [, /DFNT_FLOAT32] [, /DFNT_FLOAT64] [, /DFNT_INT8] [, /DFNT_INT16] [, /DFNT_INT32] [, /DFNT_UINT8] [, /DFNT_UINT16] [, /DFNT_UINT32] [, /DOUBLE] [, /FLOAT] [, HDF_TYPE=type] [, /INT] [, /LONG] [, /SHORT] [, /STRING] )
    ----------------------------------------------------------------------------------
    SDinterface_id:由 HDF_SD_START 返回的 SD ID 值
    Name:变量名称
    Dims:数据维度,数组
    INT:数据为整型
    FLOAT:数据为浮点型

    ----------------------------------------------------------------------------------
    参考:idl下Hdf5格式文件的读取并转换为hdf
    参考:Adding a product to l1a - l2 processing sequence

     
    ;新建HDF文件,并添加变量值
    ;新建HDF的文件路径
    file='D:IDLsst13.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  

    写入变量数据。(修改变量的值)
    ----------------------------------------------------------------------------------
    HDF_SD_ADDDATA, SDdataset_id, Data [, COUNT=vector] [, /NOREVERSE] [, START=vector] [, STRIDE=vector]
    ----------------------------------------------------------------------------------
    SDinterface_idHDF_SD_SELECT、HDF_SD_CREATE  返回的 SD ID 值(varid)
    COUNT=vector:每维中读取元素的数目,默认是从 start 位置到每维的最后一个元素
    START=vector:每维中写入的第一个元素,默认从零开始[0, 0, ..., 0]
    STRIDE=vector维中写入的间隔,默认为 [0, 0, ..., 0],意味着每个元素都被选
    NOREVERSE:默认从 IDL 数据写到 HDF 中,要将列转换成行,设置此关键字将不转置

    13 HDF_SD_DIMGETID  

    创建一个维度。
    返回值为维度标识符。
    ----------------------------------------------------------------------------------
    Result = HDF_SD_DIMGETID(SDdataset_id, Dimension_Number)
    ----------------------------------------------------------------------------------
    SDdataset_id:HDF_SD_SELECT、HDF_SD_CREATE  返回的 SD ID 值(varid)
    Dimension_Number
    :哪一维度

      
    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  

    设置维度信息。
    ----------------------------------------------------------------------------------

    HDF_SD_DIMSET, Dim_ID [, /BW_INCOMP] [, FORMAT=string] [, LABEL=string] [, NAME=string] [, SCALE=vector] [, UNIT=string]
    ----------------------------------------------------------------------------------
    SDdataset_id:HDF_SD_SELECT、HDF_SD_CREATE  返回的 SD ID 值(varid)

     15 HDF_SD_DIMGET  

    返回一个 SD 数据集维度的信息。
    ----------------------------------------------------------------------------------
    HDF_SD_DIMGET, Dim_ID [, /COUNT] [, COMPATIBILITY=variable] [, /FORMAT] [, /LABEL] [, /NAME] [, /NATTR] [, /SCALE] [, /TYPE] [, /UNIT]
    ----------------------------------------------------------------------------------
    Dim_ID一个由 HDF_SD _DIMGETID 返回的维度 ID 值
    COUNT:返回维度的大小

    16 HDF_SD_ATTRSET  

    写入属性数据。(将某个变量的某个属性值进行修改)
    ----------------------------------------------------------------------------------

    HDF_SD_ATTRSET, SD_id, Attr_Name, Values [, Count] [, /BYTE] [, /DFNT_CHAR] [, /DFNT_FLOAT32] [, /DFNT_FLOAT64] [, /DFNT_INT8] [, /DFNT_INT16] [, /DFNT_INT32] [, /DFNT_UINT8] [, /DFNT_UINT16] [, /DFNT_UINT32] [, /DOUBLE] [, /FLOAT] [, /INT] [, /LONG] [, /SHORT] [, /STRING]
    ----------------------------------------------------------------------------------
    SD_id:由 HDF_SD_START、HDF_SD_SELECT、HDF_SD_CREATE 得到的 SD ID 值,可以是 hdfid 或者 varid
    Attr_Name:欲写入的属性名称
    Values:欲写入的属性值

     
    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  

    设置变量信息。
    ----------------------------------------------------------------------------------
    HDF_SD_SETINFO, SDdataset_id [, CALDATA=structure] [, COORDSYS=string] [, FILL=value] [, FORMAT=string] [, LABEL=string] [, RANGE=[max, min]] [, UNIT=string]
    ----------------------------------------------------------------------------------
    SDdataset_id:HDF_SD_SELECT、HDF_SD_CREATE  返回的 SD ID 值(varid)

     

     

       

     

       
  • 相关阅读:
    无限分类 引用传值
    jQeury 自动、手动左右切换
    $_POST 为空时 真正的值
    php isset 备忘
    php empty 备忘
    无限分级函数 简单 引用绑值
    无限分级 层次输出 demo
    利用新版ShareSDK进行手动分享(自定义分享界面)
    eclipse 快捷方式大全
    ViewPager onPageChangeListener总结
  • 原文地址:https://www.cnblogs.com/alex-bn-lee/p/5812231.html
Copyright © 2020-2023  润新知