跳转至

IDL 8.4 - 切片面包,请让一让

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/idl-84-sliced-bread-step-aside

20179 为本文评分:

4.2

IDL 8.4 - 切片面包,请让一让

Jim Pendleton 2014年10月23日,星期四

在我看来,有几个IDL版本对我职业生涯中高效灵活开发应用程序的能力产生了最深远的影响,这包括我在定制解决方案组超过18年的工作经历,以及更早作为各种研究项目的科学数据分析师的时期。

  • 版本1: "你的意思是我不再需要花费数小时编写Tektronix PLOT-10 FORTRAN程序来查看我的数据了?" 之后我剩余的本科时光飞速流逝。
  • 版本3.6:跨平台小部件支持和面向GUI的开发环境。
  • 版本5.0:对象图形和面向对象语言语法。
  • 版本6.4:这是主要由前任IDL产品架构师Ali Bahrami负责的最后几个版本之一,为我们所依赖的TCP/IP客户端和服务器应用程序提供了大量的基础设施。

IDL 8.4有可能对我编写代码的方式产生类似程度的积极影响。特别是内置的变量属性静态方法的加入,至少可以减少我通过SIZESTRTRIMN_ELEMENTS等函数在IDL中执行常用功能所需的代码量。

借鉴Python等其他编程语言作为模式,IDL_Variable类型被扩展,当解释器在运行时遇到特定语法时,会表现出类似对象的行为。

一些静态方法和属性充当了访问现有功能的更简洁的方式。其中一些方法相对于它们的过程式对应项还提供了改进的性能

其他方法则代表了全新的功能,这些功能在之前的版本中需要多条IDL语句才能实现。不要忽视这些扩展了功能的、种类繁多的新静态方法。例如,字符串变量上新增了一个非常实用的静态替换方法,".Replace"

虽然没有明确指出,但您也可以添加自己的静态方法。

例如,为了通过HTTP传输而对IDL变量的内容进行序列化,比如在ENVI Services Engine任务请求参数中,我们可能会压缩数据并将其转换为Base-64编码。

FUNCTION IDL_Variable::jp_Serialize, s COMPILE_OPT STATIC RETURN, IDL_Base64(ZLib_Compress(s)) END

IDL> b = BINDGEN(5,5) IDL> r = b.jp_Serialize() IDL> r eJxiYGRiZmFlY+fg5OLm4eXjFxAUEhYRFROXAAAAAP//AwAKQQEt

为了在接收端重建变量,客户端将需要ASCII流以及数据类型代码和维度。后两项可以通过变量属性 ".Typecode" 和 ".Dim" 来获取。

IDL> b.typecode, b.dim 1 5 5

反序列化的静态方法则简单是逆操作。

FUNCTION IDL_Variable::jp_Deserialize, s, TYPE=type, DIMENSIONS=dims COMPILE_OPT STATIC RETURN, ZLIB_Uncompress(IDL_Base64(s), TYPE=type, DIMENSIONS=dims) END

IDL> r.jp_Deserialize(TYPE=1,DIMENSIONS=[5,5]) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

为了未来的兼容性,为您的IDL_Variable类扩展提供一个命名空间非常重要,这个命名空间要尽量避免与IDL工程团队将来可能进行的扩展发生冲突。在这个例子中,我使用了"jp_"前缀。

考虑到IDL_Variable类不能扩展对象或结构体,您会考虑如何为这些数据类型实现序列化/反序列化机制呢?对于命名结构和对象,完全可以通过代理静态类方法和临时SAVE文件来实现。这留给读者作为练习,或者作为未来博客文章的主题!

使用ENVI + IDL创建自定义三维可视化 空间/光谱浏览与端元