【ENVItask(一)】批量计算TVDI的方法及IDL代码给出了基于EnviAPPStore中的TVDI工具task的批量计算TVDI的IDL代码,本文介绍对于ENVItask的学习过程和代码思路
〇、Task批量工具
APPStore里提供了 Task批量工具不过本工具不符合“只有一个输入栅格”的要求
另外还有 生成Task调用代码的工具,不过我这里运行有bug,这两个工具推荐给想使用Task做批量处理的朋友
一、Task代码
1.代码第28行的task名取决于task文件中的name,与文件名无关
"name":"TVDITask_Hanzt",
"baseClass":"ENVITaskFromProcedure",
"routine":"TVDITask",
"displayName":"TVDI VTCI",
"version":"5.3",
"description":"This is an example of a custom task that performs band math on two rasters.",
因此这里是TVDITask_Hanzt
2.task各参数属性,注意required为必填,optional为选填,一般有default值
3.task输出方式,注意direction属性,output为输出
4.第34行的Task.output_Raster_URI是常用的通过更改输出文件位置获得结果栅格的方法,但是该工具的task中并没有output_Raster_URI这个参数,但依然能够正常使用,对比其他ENVI原生task,都在task文件带有改参数以修改路径。需注意该参数仍然是input属性不是output
二、无效封装
第一次运行时在第13行采用了
e=envi(/headless)
,结果报错
% 此 task 封装的是无效程序 "TVDITask_Hanzt"
% Execution halted at: TVDIBATCH
特别感谢http://t.csdnimg.cn/VJYVN的最后行,解释了这种报错的原因是未编译运行ui和task文件
但是我这里用的是APPStore 的封装好安装sav的工具,没有.pro源码
虽然原作者Hanzt大大确实提供了源码:https://www.cnblogs.com/enviidl/p/16318630.html
猜想可能是没有设置正确当前目录之类的问题?这个问题也没有在网上查到过先例
所以不如直接不用headless,直接e=envi()
结束,这样每次会自动打开ENVI窗口,料也无妨。
三、无效栅格
如果把输出文件的拓展名定为.tif,这会报错“无效的栅格格式”
参考示例代码都是直接设定为.dat,而工具本身再输出时可以默认不用拓展名(改成.tif也会报错但正常输出栅格),因此这里直接改为.dat(第21行)
四、运行问题
这是一个很蛋疼但是没有办法的bug
正常运行,弹出ENVI窗口,进度条以及TVDI工具计算完第一个栅格后的窗口如下

手动关掉TVDI窗口后,可以进行下一个栅格的计算
经历多次尝试和与自带Task对比后,我得出结论:
1.这个过程在代码中始终处于Task.Execute内部,无法通过在下一行添加关闭窗口代码来干预
2.其他task之所以不会出现这种问题,与headless无关(事实上headless只影响ENVI窗口,这个TVDI窗口一样会弹出),是因为它们不会在计算结束后弹出窗口
3.由于有该工具源码,或许可以通过魔改来解决弹窗,亦或者同时获得连带的txt和png文件,但是本人能力有限,只能用最简单的方法
4.一个一个手动点关闭,相较于利用ENVItask+IDL以前连输入栅格都要手动添加的方法,这种已经非常省时省力了。
5.感谢Hanzt大大!!开源万岁!!