需求决定了动力,此时近凌晨一点,忙里偷闲,终于忙完了今天的“这点儿”事儿。参考帮助文档,从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:\temp\A2014119053500.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:\temp\hdf_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;

效果显示:

IDLHDF5读取与转换的更多相关文章

  1. mybatis&plus系列------Mysql的JSON字段的读取和转换

    mybatis&plus系列------Mysql的JSON字段的读取和转换 一. 背景 在平常的开发中,我们可能会有这样的需求: 业务数据在存储的时候,并不是以mysql中的varchar丶 ...

  2. 将一个读取流转换成bitmap对象

     将一个读取流转换成bitmap对象:         BitmapFactory:可以将文件,读取流,字节数组转换成一个Bitmap对象.         Bitmap bitmap = Bitma ...

  3. Java读取Excel转换成JSON字符串进而转换成Java对象

    Jar包

  4. phantomjs读取文件转换数组

    //要读取的文件路径,支持TXT和CSV var openFilepath="lieBiao.txt"; phantom.outputEncoding="GB2312&q ...

  5. node读取文件转换json文件

    { ".323":"text/h323" , ".3gp":"video/3gpp" , ".aab" ...

  6. activiti5/6 系列之--Activiti 读取并转换BPMN2文件

    统一的BPMN标准,对工作流的流程定义采用BPMN统一格式.BPMN流程文件可以使用eclipse bpmn2插件开发比如eclipse bpmn2 modeler或者idea activiti插件. ...

  7. java 读取文件转换成字符串

    public String readFromFile(File src) { try { BufferedReader bufferedReader = new BufferedReader(new ...

  8. SharePoint 2013 Word 转换PDF服务介绍及示例

    前言:在SharePoint使用过程中,经常会发现将文档进行格式转换的需求,之前,看到SharePoint 2013有将PPT转换PDF文档的服务,后来,才发现SharePoint 2010开始,就有 ...

  9. Java读取Level-1行情dbf文件极致优化(3)

    最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1 ...

随机推荐

  1. matlab中元胞数组(cell)转换为矩阵

    matlab中元胞数组(cell)转换为矩阵. cell转换为矩阵函数为:cell2mat(c),其中c为待转换的元胞数组: 转化之后的矩阵可能不满足我们对矩阵维数的要求,那么也许还需要下面两个函数: ...

  2. 多线程操作中为什么使用while而不是if来做判断状态是否就绪

    在多线程操作中,我们常常会遇到需要先判断信号量状态是否就绪,然后执行后续操作的场景.这里对状态的判断使用的是while而不是单线程下常用的if. 以下示例展示了一个简单的生产者-消费者模型:当队列满的 ...

  3. 10.在Global全局文件中的Application_BeginRequest示例

    只要有人访问本网站,都要执行全局文件的Application_BeginRequest事件.因此我们可以防盗链. 示例要求:凡不是网站本机登录的都给客户端提示,用图片显示. 分析:由于网页在加载时不是 ...

  4. poj2886

    反素数范围不大,可以直接打表得然后就是模拟移动的过程我们可以用线段树优化,具体明天再说吧 ..] ,,,,,,,,,,,,,,                                  ,,, ...

  5. poj3519

    凡是差分约束系统的题目都是转化为d[j]-d[i]<=w[i,j]的形式然后我们建立边i-->j 边权为w[i,j]对于这道题,要求d[n]-d[1]尽可能的大设d[i]为相对差,d[1] ...

  6. HDOJ/HDU 1039 Easier Done Than Said?(字符串处理~)

    Problem Description Password security is a tricky thing. Users prefer simple passwords that are easy ...

  7. 卡特兰数(Catalan Number) 算法、数论 组合~

    Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡特兰数的前几个数 前20项为( ...

  8. ADB server didn't ACK的问题

    今天出现eclipse用手机调试时,一直起不来,出现ADB server didn't ACK,提示restart adb或者重启eclipse,按照原来的,查看了任务管理器中,没发现已经启动的adb ...

  9. android 随手记 倒计时

    class CountDownUtils extends CountDownTimer { public CountDownUtils(long millisInFuture, long countD ...

  10. 【Lucene3.6.2入门系列】第15节_SolrJ高亮

    package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import java.util.Map; i ...