ENVI 5.1二次开发之——批量输出HDF5数据集

0
分享 2016-06-04
从ENVI 5.0版本开始,ENVI新增的二次开发API已全面采用面向对象模式。用户在学习和使用时更加方便。可查看ENVI帮助获取详细信息。
在阅读本文之前,可以先来学习下ENVI 5.1中新增的HDF5文件读取工具的使用说明,博文地址为:http://blog.sina.com.cn/s/blog_764b1e9d0101c7xl.html,可以重点关注下模板的使用。

广告之后,马上回来… ….

在某些情况下,我们可能需要输出一系列HDF5文件中同一个或几个数据集,这个时候就可以使用模板(TEMPLATE)方便实现。
以NPP VIIRS数据为例,在ENVI 5.1中选择File – Open As – Generic Formats – HDF5,弹出如下对话框。
注:如果直接打开NPP VIIRS数据,会使用专用方式打开,因为ENVI 5.1是原生支持NPP VIIRS数据的,本文只是举例说明而已。

图:ENVI 5.1打开NPP VIIRS数据
现在我们要做的工作是批量将N个HDF5文件中的数据集Radiance和Reflectance分别导出为ENVI标准格式。步骤如下:
1) 首先在上图面板中将Radiance和Reflectance加载到右侧Raster 1和2中,如图所示;
2) 选择Templates – Generate Template,输入XML文件名 Filename和 Template Name,点击OK保存即可(需要记录xml文件路径,下面会使用)。


图:Template输出参数设置
3) 下面可以通过ENVI 5.1提供的API来实现批量输出栅格,代码如下。步骤为:
– 选择输入路劲,搜索*.h5文件;
– 选择Template文件(.xml文件);
– 选择输出路径,开始运行批处理。
PRO Using_HDF5_Template
COMPILE_OPT idl2
;启动ENVI 5.1
e = ENVI()
;选择搜索路径
inPath = ENVI_PICKFILE(/DIRECTORY, $
title = 'Select the Iutput File Path')
IF inPath EQ '' THEN RETURN
;搜索NPP VIIRS文件
Files = FILE_SEARCH(inPath, '*.H5')
IF Files[0] EQ '' THEN RETURN
;选择Template文件,即XML文件(ENVI_HDF5_Template.xml)
xmlFile = ENVI_PICKFILE(title = 'Select XML File', $
FILTER = '*.xml')
IF xmlFile EQ '' THEN RETURN
;选择输出路径
outPath = ENVI_PICKFILE(/DIRECTORY, $
title = 'Select the Output File Path')
;初始化进度条
str = ['Input Path: ' + inPath,$
'Output Path: ' + outPath]
ENVI_REPORT_INIT, str, title="Processing...", $
base=base ,/INTERRUPT
ENVI_REPORT_INC, base, N_ELEMENTS(Files)
;开始批处理
FOR i=0,N_ELEMENTS(Files)-1 DO BEGIN
Raster = e.OpenRaster(Files, $
TEMPLATE = xmlFile, ERROR = err)
IF err NE '' THEN CONTINUE
;获取H5文件名
fileName = FILE_BASENAME(Files[i], '.H5')
;输出Radiance和Reflectance
Raster[0].[i]EXPORT
, outPath+PATH_SEP()+ $
fileName+'_Radinace.dat', 'envi'
Raster[1].EXPORT, outPath+PATH_SEP()+ $
fileName+'_Reflectance.dat', 'envi'
;进度条状态更新
ENVI_REPORT_STAT,base, i, N_ELEMENTS(Files), CANCEL=cancelvar
;判断是否点击取消
IF cancelVar EQ 1 THEN BEGIN
tmp = DIALOG_MESSAGE('点击了取消'+STRTRIM(i,2)+'%',/info)
ENVI_REPORT_INIT, base=base, /finish
BREAK
ENDIF
ENDFOR
;进度条完成
ENVI_REPORT_INIT, base=base, /finish
;关闭ENVI中打开的NPP VIIRS数据
DataColl = e.DATA
DataItems = DataColl.Get()
FOREACH Item, DataItems DO Item.CLOSE
END



图:原始HDF5数据


图:批处理结果
注:本文只演示Template的用法,除此之外,可以使用e.OpenRaster(Dataset_name=*)来指定要打开的数据集,可以完成类似工作。另外,可以使用IDL提供的H5_*函数库进行HDF5文件的操作,同样可以完成类似工作。
文章来源:http://blog.sina.com.cn/s/blog_764b1e9d0101c95s.html

0 个评论

要回复文章请先登录注册