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;

    效果显示:





  • 相关阅读:
    PL/SQL编程基本概念
    oracle基本笔记整理及案例分析2
    oracle基本笔记整理及案例分析2
    oracle基本笔记整理及案例分析2
    oracle基本笔记整理及案例分析1
    oracle基本笔记整理及案例分析1
    oracle基本笔记整理及案例分析1
    oracle笔记整理2
    oracle笔记整理2
    oracle笔记整理2
  • 原文地址:https://www.cnblogs.com/ahnucao/p/4938770.html
Copyright © 2011-2022 走看看