zoukankan      html  css  js  c++  java
  • IDLHDF5读取与转换

    需求决定了动力,此时近凌晨一点,忙里偷闲,终于忙完了今天的“这点儿”事儿。参考帮助文档,从hdf的读写,捉摸hdf5的读写,总算弄明白了。稍作总结,以备候查。

    hdf5作为hdf数据的补充与升级,目前被新型的传感器所采用(VIIRS,风云三号等),但是如果没有hdf5的sav扩展,低于5.1版本的envi是无法打开的(扩展可以到网上搜)方便起见,花一点儿时间捉摸了下hdf5的数据读取,提取部分内容,写为hdf文件,以方便查看。

    Hdf5数据重要的是几个概念:文件(File),组(Group),数据集(Dataset)。常用读的数据过程是:文件读取,组的读取和数据集的读取。




    对应使用的函数是h5f_,h5g_,h5d_这三种。

    常用的函数是:

    h5_list可以列出一个文件中的所有的数据集,然后可以通过这些数据集,直接利用相应的read来获取数据。

    H5F_IS_HDF5判断是不是h5格式的数据;H5F_OPEN打开一个文件,返回文件的id;H5G_GET_NMEMBERS可以根据组别的名字获取组的成员个数;H5G_OPEN是根据组别的名字打开一个组,得到组的id;H5G_GET_MEMBER_NAME根据元素在文件中的索引位置(从0开始)获取数据集,返回的是数据集的name;H5D_OPEN根据数据集的name打开数据集,返回数据集的id;H5D_READ是根据数据集的id获取该数据集的数据内容。然后是对应的close函数。记得,打开的数据要注意关闭。

    例子:读取hdf5的数据(seadas产生的rrc数据),提取出bands组别内的所有数据集,写入到一个hdf文件中,便于其他程序访问。

    PRO HDF5

      ;

      COMPILE_OPT idl2

      ENVI,/RESTORE_BASE_SAVE_FILES

      ENVI_BATCH_INIT

      ;

      hdf = 'F: empA2014119053500.L2_LAC_OC_reprojected.h5'

      is_h5 = H5F_IS_HDF5(hdf)

      IF is_h5 EQ 0 THEN RETURN

      ;h5_list,hdf

      hdf_id = H5F_OPEN(hdf)

      group= '/bands'

      elements_num = H5G_GET_NMEMBERS(hdf_id,group)

      band_g_id = H5G_OPEN(hdf_id,group)

      ;

      outpath = 'F: emphdf_test.hdf'

      if file_test(outpath) then file_delete,outpath

      sd_id=HDF_SD_START(outpath,/CREATE)

      ;进度条

      str=['Outpath='+outpath,'Reading and writing']

      ENVI_REPORT_INIT, str, title="Processing...",base=base ,/INTERRUPT

      ENVI_REPORT_INC, base, elements_num

      FOR index = 0L, elements_num-1 DO BEGIN

        ;更新进度条

        ENVI_REPORT_STAT,base, index, elements_num

        ;

        item_Name = H5G_GET_MEMBER_NAME(hdf_id,group,index)

        item_id = H5D_OPEN(band_g_id,item_Name)

        ;item_type_code  = H5D_GET_TYPE(item_id)

        ;item_type = H5T_IDLTYPE(item_type_code)

        item_data = H5D_READ(item_id)

        ;print,item_Name,typename(item_data)

        ;help,item_data

        WRITE_HDF,sd_id,item_Name,item_data,typename(item_data)

        h5d_close,item_id

      ENDFOR

      ;close

      h5g_close,band_g_id

      h5f_close,hdf_id

      HDF_SD_END,sd_id

      envi_report_init,base=base,/finish

      void = dialog_message('Processing completed!',/info)

      ;  print, members

      ;envi_batch_exit

    END

    writehdf的pro:

    PRO WRITE_HDF,sd_id,data_set_name,data,datatype

      ;add dataset into hdf file

      ;sd_id: hdf identifer;data_set_name: the name you will add

      ;datatype:the data type

      sds_id = 1

      dims = SIZE(data,/dimensions)

      ;  datatype = '/'+datatype

      CASE (datatype) OF

        'LONG': BEGIN

          sds_id=HDF_SD_CREATE(sd_id,data_set_name,dims[*,*],/long)

        END

        'FLOAT':BEGIN

        sds_id=HDF_SD_CREATE(sd_id,data_set_name,dims[*,*],/float)

      END

      ELSE: BEGIN

        sds_id=HDF_SD_CREATE(sd_id,data_set_name,dims[*,*],/DFNT_UINT32)

      END

    ENDCASE

    HDF_SD_ADDDATA, sds_id, REFORM(data[*,*])

    HDF_SD_SETINFO,sds_id,Label = data_set_name

    HDF_SD_ENDACCESS,sds_id

    ;

    END;

    效果显示:





  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/ahnucao/p/4938770.html
Copyright © 2011-2022 走看看