ENVI 5.1二次开发之——批量输出HDF5数据集
分享
从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
在阅读本文之前,可以先来学习下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 个评论
相关问题
- 作为Desktop用户对数据的获取比较乏力,可能缺了哪些知识?
- 有谁知道哪里可以免费获取各省市地图数据呢,包括详细的shape文件数据
- 安装完arcgis10.3后,为何没有Envi tools这个工具箱?
- 有栅格数据a(大数据),小数据b,怎么从a中扣掉b,得到a数据剩下的部分?栅格能裁剪取反吗?
- 在windows server2008 R2 64位中安装了portal 10.5 设置好托管arcgis server站点,并用data store为托管数据库,发布数据出错
- cityengine怎么导入arcgis的shp数据,对shp数据有什么要求
- ENVI中Image to Map中X/Y Pixel Size的参数如何设置?
- ArcGIS数据库数据逐图幅裁剪
- ArcGIS model builder 输出文件名处理
- 求ArcGISMXD批量导出图片工具?
- ArcGis打开图层后显示unknown units,想要define一个投影坐标系,但数据大小似乎不一致