IDL 8.6 新特性:IDLTasks
原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/new-in-idl-86-idltasks
4262 文章评分:
未评分
IDL 8.6 新特性:IDLTasks
匿名 2017年1月12日,星期四
ENVITasks 已经存在好几年了,但对于那些只有 IDL 而没有 ENVI 的用户来说,它们并无帮助。在 IDL 8.6 中,我们很高兴地宣布,ENVITask 的概念已经延伸到纯 IDL 环境中工作,无需 ENVI。许多功能是相同的,但存在一些细微差别,我将在本文中指出。
首先也是最明显的区别是如何构建一个 IDLTask。你不需要启动 ENVI 然后调用 ENVITask() 函数,你可以在任何时候调用 IDLTask() 函数。如帮助文档所指出的,你可以传入一个标量字符串,它可以是所需任务的名称或其文件名,也可以传入一个表示任务定义的 Hash 对象(这相当于对任务文件调用 JSON_Parse() 得到的结果)。如果你传入的字符串不是一个文件名(相对或绝对),那么它将被视为任务名。然后,该函数将查看 !PATH 并在所列出的每个文件夹中搜索所有 .task 文件。它会将其找到的所有 .task 文件编入目录,但如果存在多个具有相同基础名称的文件夹,则只识别第一个(就像 IDL 处理在 !PATH 中找到的具有相同基础名称的多个 .pro 或 .sav 文件一样)。.task 文件列表会过滤为那些具有正确 IDLTask 架构的文件,目前仅为 "idltask_1.0"。这样我们就不会意外地获取 ENVITask 文件并引起混淆。如果找到与请求的任务名具有相同基础名称的 .task 文件,它将被用作任务定义。如果没有找到完全匹配的文件,但存在部分匹配项,则会返回有用的错误消息,告知你部分匹配的名称,以便你更正代码。需要指出的是,当前工作目录(可以通过使用 CURRENT 关键字调用 CD 来获取)会在 !PATH 中的任何文件夹之前被搜索,这可能会影响 IDLTask() 的行为。
IDL 8.6 中用于 IDLTasks 的 "idltask_1.0" 任务架构与 ENVI 5.4 中 ENVITasks 使用的 "envitask_3.0" 架构非常相似。值得注意的例外是,参数的 TYPE 属性将不理解 ENVI 类类型,如 ENVIRaster。但是,IDLTasks 支持 IDL 中所有可用的基本数据类型——字符串、布尔值和数字,以及 List、Hash、OrderedHash 和 Dictionary。
另一个区别是你在 GSF 上与 IDLTasks 交互的方式,而不是 ENVITasks。IDLTasks 的服务端点将是 http://hostname:port/ese/services/IDL,而 ENVITasks 使用 http://hostname:port/ese/services/ENVI。不同的端点用于区分应使用 IDLTask() 函数与 ENVITask() 函数来加载请求的请求。
便捷的 GSF 部署是你最初想要构建 IDLTasks 的主要原因之一。如果你有习惯直接调用的 IDL 函数或过程,你可能想知道为什么要把它们封装在 IDLTask 中。作为曾经的一名 C++ 开发人员,我欣赏 C++ 所要求的类型安全性,因此我也欣赏 IDLTasks 提供的参数验证。在开发自定义 IDLTask 时,你需要花一些时间思考代码的输入和输出是什么,但一旦完成,你就不必担心编写大量输入验证代码,IDLTask 框架会为你处理这些。IDLTasks 也像 ENVITasks 一样是自文档化的,所以如果有人给你一个 .task 文件和一个 .sav 文件,你可以加载任务,然后了解所有参数名称、它们的类型、基数,甚至希望还有描述。所有这些信息使得将你的算法部署在 GSF 上以在云中运行成为可能,并通过 REST 端点具备完全相同的自省能力。或者,你可以使用某种文件夹监视功能来设置批处理,以生成 IDLTaskEngine 实例,自动对系统中出现的每个文件运行你的代码。