【ENVItask(二)】IDL批量计算TVDI的代码构建思路及bug

【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工具计算完第一个栅格后的窗口如下
在这里插入图片描述到这里就不再继续运行了,输出文件夹可以看到第一个栅格,但是此时 控制台的ENVI>仍然是斜体,表示正在运行中
手动关掉TVDI窗口后,可以进行下一个栅格的计算

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值