您的位置:首页 > 其它

【IDL】编写自定义Task需要注意的问题

2017-08-16 01:22 393 查看
测试代码如下,一个很简单的例子

PRO testTask,INPUT_RASTER = Raster,INPUT_NUMBER = Number,$
OUTPUT_RASTER = outRaster,OUTPUT_URI = outputURI
;=========程序====
COMPILE_IDL ,IDL2
e =envi(/CURRENT)
IF ~KETWORD_SET(INPUT_NUMBER) THEN Number = 2
data_raster = e.opendata(Raster)
outdata = data_raster * Number
outRaser = ENVIRASTER(outdata,URI=outputURI)
outRaster.SAVE
END


1.注意参数名称

IDL参数传递的比较奇葩,在自定义Task里是将左边接受到的值传给右边,相当于多了一层缓冲,所以有些参数是可选的,如INPUT_NUMBER参数。有些程序喜欢将参数写成a = a ,b=b,c=c这种左右都一样的,其实两边含义大有区别,左边的代表的为参数名,右边为被赋值的变量,所以为了程序的可读性最好名字不要起一样的

2.关于OUTPUT_RASTER参数

OUTPUT_RASTER参数是与OUTPUT_URI参数相辅相成的,前者是栅格对象,后者是输出文件路径,如果在参数列表中有多个ENVIURI类型的参数,那么OUTPUT_RASTER参数就会出错

3.调用自定义Task

PRO runtestTask_UI
COMPILE_OPT IDL2
e=ENVI(/CURRENT)
;执行自定义Task
Task=ENVITASK('testTask')
;动态UI填写参数
dynamicUI =e.UI.SelectTaskParameters(Task)
IF dynamicUI NE 'OK' THEN RETURN
;执行
Task.execute
;Data Manager中打开分类数据
DataColl = e.DATA
DataColl.Add,Task.OUTPUT_RASTER
;载入图层
view = e.GetView()
layer = view.CreateLayer(calssRaster)
view.Zoom, /FULL_EXTENT
END


调用自定义Task,动态UI构建界面,DataColl.Add,Task.OUTPUT_RASTER调用我们刚刚写的.OUTPUT_RASTER参数,当然这里也可以改写,让自定义Task有多个URI,假设前面的自定义Task中没有.OUTPUT_RASTER参数,代码如下:

outRaster = e.openRaster(Task.OUTPUT_URI)
DataColl = e.DATA
DataColl.Add,outRaster


实际效果是一样的,但理解起来不太容易。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: