ENVI 5.2 SP1 中的用户自定义 ENVITasks
原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/user-defined-envitasks-in-envi-52-sp1
10990 给这篇文章评分:
5.0
ENVI 5.2 SP1 中的用户自定义 ENVITasks
匿名 星期四,2015年4月2日
ENVI 5.2 SP1 刚刚发布,所以我再写一篇博客,谈谈我们为 ENVITask API 新增的功能。我们增加了 24 个新任务,使总数达到 82 个,但最令人兴奋的功能是,我们的客户现在拥有了创建自己 ENVITasks 的工具。我们将 ENVI 的分析能力作为任务公开方面取得了良好进展,但你们的人数远多于我们,有数不尽的想法和算法,如果我们不让你们轻松定义自己的任务,我们绝不可能满足你们所有的需求。因此,我们引入了新的 ENVITaskFromProcedure 类,它允许你将几乎任何 IDL 过程包装成一个 ENVITask。
在我详细介绍如何使用 ENVITaskFromProcedure 之前,请允许我说服你,为什么你应该花费最小的精力为你的给定过程创建一个任务。
首要原因是,一旦你的 ENVITask 在桌面 ENVI 中运行,将其文件复制到 ENVI Services Engine 服务器上并让你的任务在云端运行就变得微不足道了。ESE 服务器不关心一个 ENVITask 是 ENVI 安装的一部分还是由你创建的定制任务,它都能正常工作。
ENVITask 的另一个有价值的功能是它提供的自动参数验证。你不需要检查过程的每个输入参数的类型和基数,你可以在任务模板中定义这些,ENVITaskParameter 类会为你处理所有这些工作。这对你包装的现有代码可能帮助不大,但当你编写新算法并打算将它们包装成 ENVITasks 时,你会惊讶地发现你的代码会变得多么简洁明了。ENVITask 框架允许你将 IDL 视为一种强类型语言,这让你能够专注于算法实现细节,而无需担心输入错误时的健壮性。
正如我在上一篇关于 ENVITask 的博文中提到的,在 ENVI 5.2 中,我们为 ENVITasks 引入了动态 UI。所以你不需要为每个算法编写自定义的小部件代码,只需调用 ENVIUI::SelectTaskParameters() 函数,就能弹出一个对话框来输入你任务的所有输入参数。
希望我至少激起了你对 ENVITaskFromProcedure 的兴趣,下一个显而易见的问题是:“我的过程需要遵循哪些规则才能被包装成一个任务?”。有几条规则,但它们负担并不太重,而且有简单的方法来创建包装过程以修正任何违规之处。以下是这些规则以及相应的包装解决方法:
-
只允许使用关键字参数,不允许位置参数。 关键字参数能在输入值和意图之间建立更明确的映射。如果我们编写的 Gram-Schmidt 全色锐化任务只有一个输入参数,它是一个包含 2 个 ENVIRaster 对象的数组,那么你需要阅读文档才能弄清楚顺序是 [ Pan, MSI ] 还是 [ MSI, Pan ]。通过使用两个独立的标量参数,分别命名为 INPUT_LOW_RESOLUTION_RASTER 和 INPUT_HIGH_RESOLUTION_RASTER,任务就具有了自说明性,并且很难混淆哪个输入是哪个。
如果你有一个包含位置参数并且想将其包装成任务的过程,你只需要创建一个只包含关键字参数的新过程,然后为每个位置参数创建一个关键字。这个包装过程随后会调用原始过程,按照位置参数的适当顺序传入这些关键字。
-
算法必须是一个过程,而不是一个函数。 函数的返回值类似于位置参数,你可以将其视为索引为 -1 的参数。我们无法知道这个值的类型,或者你想给它起什么名字,所以我们不做尝试。这个问题的解决方法与位置参数的情况相同:创建一个包装过程来调用函数,并将函数的返回值存储在一个输出关键字中。
-
过程必须使用 ENVI5 API 对象,如 ENVIRaster,而不是 ENVI Classic 的 FIDs。 在我们发布 ENVI 5.0 之前,ENVI 已经存在了相当长一段时间,我相信有很多使用其 FID、DIMS、POS API 编写的例程。这些代码不必重写,很容易创建一个包装过程,将 ENVIRaster 输入转换为这些关键字所需的值: fid = ENVIRasterToFid(inRaster) dims = [ -1, 0, inRaster.nColums-1, 0, inRaster.nRows-1 ] pos = Lindgen(inRaster.nBands)
大致就是这些,如果你的过程遵守这些规则,或者被一个遵守这些规则的过程所包装,那么你就可以把它包装成一个 ENVITask。正如自定义任务的帮助文档所描述的那样,你需要创建你的 .task 模板文件,确保"baseClass"属性设置为"ENVITaskFromProcedure",并且"routine"属性设置为你的过程名称。一个很好的起点是我们在 ENVI 5.2 SP1 版本中包含的 BandMathExample。在 Windows 上,你可以在 "C:\Program Files\Exelis\ENVI52\examples\tasks\bandmathexample" 文件夹中找到它。这个例子包含了被包装的过程、.task 模板文件、一些用于为 ENVI 工具箱创建用户扩展的 PRO 代码,以及一个用于测试任务的 PRO 文件。