ENVI 5.0 SP2 全新的二次开发模式

ENVI 5.0发布时,便加入了许多全新的二次开发接口。ENVI 5.0 SP2的发布,同样带来了新的功能函数接口。下面对ENVI 5.0版本中新增的二次开发技术进行一个总结。

启动ENVI

IDL中启动ENVI批处理模式,在之前版本的代码如下:

ENVI, /RESTORE_BASE_SAVE_FILES

ENVI_BATCH_INIT

启动ENVI Classic,与之前相同,直接在IDL控制台输入ENVI即可。

 

ENVI 5.0新增了启动ENVI批处理模式的方法,格式如下:

Result = ENVI([/CURRENT] [, ERROR=variable] [, /HEADLESS] [, LAYOUT=array] [, LOG_FILE=string] [, UVALUE=variable])

最常用的为:

e = ENVI()        ;启动ENVI 5界面

e = ENVI(/headless) ;headless关键字表示只调用ENVI函数,不打开ENVI界面

程序控制

使用e = ENVI()启动ENVI之后,e返回为一个对象,信息如下:

ENVI> help, e

             ENVI <165828>

ENVI> print, e

ENVI <165828>

  LANGUAGE                 = 'zho'

  LAYOUT                   = 1,          1

  LOG_FILE                 = ''

  ROOT_DIR                 = 'C:\Program Files\Exelis\envi50\'

  UI                       = <ObjHeapVar165829(ENVIUI)>

  UVALUE                   = !NULL

  VERSION                  = '5.0.2'

  WIDGET_ID                = 3

 

可以看到e中包含了许多信息,包括语言、视图布局、日志文件、安装目录、UI对象、UVALUE、版本和Widget_ID

得到e对象之后,便可以利用e的许多方法进行对ENVI的控制,比如新建图层、新建视图、控制视图布局、添加扩展、打开栅格矢量文件等等。方法及功能介绍如下表所示:

方法

功能介绍

ENVI.AddCustomReader

File > Open As > Custom添加打开自定义格式数据的过程,ENVI 5.0 SP2新增

ENVI.AddExtension

Toolbox添加扩展工具,ENVI 5.0 SP2新增可添加菜单功能

ENVI.Close

关闭ENVI

ENVI.CreateRaster

创建ENVIRaster对象,栅格文件对象

ENVI.CreateRasterMetadata

创建ENVIRasterMetadata对象,栅格描述数据

ENVI.CreateRasterSpatialRef

创建ENVIRasterSpatialRef对象,即空间参考对象

ENVI.CreateView

创建新的视图(View

ENVI.ExportRaster

输出栅格文件,可另存为DTEDENVINITFTIFF格式等。

ENVI.GetOpenData

获取已经打开的数据,返回栅格或矢量对象数组。

ENVI.GetPreference

获取ENVI设置参数,如输入输出路径等。

ENVI.GetTemporaryFilename

自动获取一个临时文件名,位于临时目录。

ENVI.GetView

获取当前视图,返回值为ENVIView对象。

ENVI.HideExtensionFiles

启动ENVI时隐藏某个扩展补丁

ENVI.LogMessage

将自定义消息保存到日志文件LOG_FILE内。

ENVI.OpenRaster

打开栅格数据,支持大多数格式。

ENVI.OpenVector

打开矢量数据。

ENVI.Refresh

可以禁用或启用ENVI刷新功能。

ENVI.ReportError

弹出错误提示对话框。

ENVI.Show

使ENVI处于当前激活窗口。

数据控制

同时,ENVI 5提供了很多与数据相关的对象参考,具体如下表所示。

对象或方法

功能介绍

ENVICoordSys

对象:可通过ENVIVectorCOORD_SYS属性获取此对象。

ENVIFIDToRaster

方法:将ENVI中的文件IDFID)转换为ENVIRaster对象。

ENVIRaster

对象:ENVI栅格对象,包含一些栅格数据操作方法。

ENVIRasterIterator

对象:ENVI分块处理对象。

ENVIRasterMetadata

对象:ENVI栅格元数据对象。

ENVIRasterSpatialRefPseudo

对象:空间参考对象,可使用CreateRasterSpatialRef创建。

ENVIRasterSpatialRefRPC

对象:空间参考对象,可使用CreateRasterSpatialRef创建。

ENVIRasterSpatialRefStandard

对象:空间参考对象,可使用CreateRasterSpatialRef创建。

ENVIRasterToFID

方法:将ENVIRaster转换为FID

ENVITime

对象:ENVI时间对象。

ENVIVector

对象:ENVI矢量数据对象。

显示控制

ENVI 5全新的用户界面,带来了新的操作习惯。增加了图层管理功能,可以在一个视图中叠加显示多个图层,同时提供了几种透视窗口,可以进行卷帘、闪烁等操作。

同样,ENVI 5提供了与这些功能相对应的API,可实现对ENVI的图层进行操作、创建透视窗口、弹出选择文件对话框等功能。如下表所示:

对象

功能介绍

ENVIPortal

ENVI透视窗口对象

ENVIRasterLayer

ENVI栅格图层对象,可对图层进行移动等操作。

ENVIUI

ENVI用户界面对象,可弹出文件选择对话框和地图坐标系统界面等。

ENVIVectorLayer

ENVI矢量图层对象,可对图层进行移动等操作。

ENVIView

ENVI视图对象,可对视图进行平移、旋转、缩放等操作。

扩展工具

IDL8.2中,提供了新建ENVI扩展向导,在IDL中点击“文件”-ENVI扩展”即可弹出如下对话框,填写相关信息,点击完成,则自动新建工程和源码文件。

 


图:新建ENVI扩展

自动生成的代码如下:

新建ENVI扩展示例

下面用一个示例介绍如何为ENVI Toolbox添加扩展工具,以及为ENVI添加新的菜单(ENVI 5.0 SP2新增功能)。代码如下:

PRO TEST_EXTENSION_EXTENSIONS_INIT

 COMPILE_OPT IDL2

  ; Get the current application

  e = ENVI(/CURRENT)

 

  ;ENVI原始菜单Display-View Swipe下面加入一个新的菜单Plot,并且有分隔符

 e.ADDEXTENSION, 'Plot', 'TEST_EXTENSION', /menu, $

   PATH = 'Display', after = 'View Swipe', uvalue = 'plot', /sep

   

  ;Plot后边加入一个新的菜单Surface

 e.ADDEXTENSION, 'Surface', 'TEST_EXTENSION', /menu, $

   PATH = 'Display', after = 'Plot', uvalue = 'surface'

   

  ;Display中加入一个Graphics菜单,再Graphics菜单下再加入PlotSurface

 e.ADDEXTENSION, 'Plot', 'TEST_EXTENSION', /menu, $

   PATH = 'Display/Graphics', uvalue = 'plot'

 e.ADDEXTENSION, 'Surface', 'TEST_EXTENSION', /menu, $

   PATH = 'Display/Graphics', uvalue = 'surface'       

   

  ;ToolboxExtensions下加入Graphics文件夹,在文件夹下加入PlotSurface工具

 e.ADDEXTENSION, 'Plot', 'TEST_EXTENSION', $

   PATH = 'Graphics', uvalue = 'plot'

 e.ADDEXTENSION, 'Surface', 'TEST_EXTENSION', $

   PATH = 'Graphics', uvalue = 'surface'

 

END

 

PRO TEST_EXTENSION, event 

  ; Set compile options

 COMPILE_OPT IDL2 

  ; General error handler

 CATCH, err

 IF (err NE 0) THEN BEGIN

   CATCH, /CANCEL

   IF OBJ_VALID(e) THEN $

     e.REPORTERROR, 'ERROR: ' + !error_state.MSG

   MESSAGE, /RESET

   RETURN

 ENDIF

 

  ;Get ENVI session

  e = ENVI(/CURRENT) 

  ;******************************************

  ; Insert your ENVI Extension code here...

  ;****************************************** 

  ;获取UVALUE

 WIDGET_CONTROL, event.ID, get_uvalue = uvalue

 

  ;通过判断UVALUE进行不同的操作

 CASE uvalue OF

   'plot': p = PLOT(/test)

   'surface': s = SURFACE(/test)

 ENDCASE 

END

 

创建sav文件方法有两种:

1.     IDL资源管理器中,右键点击TEST_EXTENSION工程文件夹,点击构建工程即可。

2.     编译pro源码文件,然后使用SAVE命令创建sav文件。

 

IDL> .compile -v 'D:\IDLWorkspace82\My_Extension\test_extension.pro'

% Compiled module: TEST_EXTENSION_EXTENSIONS_INIT.

% Compiled module: TEST_EXTENSION.

IDL> save, filename = 'D:\TEMP\TEST_EXTENSION.sav', /routines

 

然后将sav文件拷贝到ENVI安装目录下的Extensions文件夹内,重启ENVI即可。

可以看到创建的Display下面的新菜单,以及包含的二级菜单,和Toolbox下的新工具,如图所示:

图:新增加的菜单和工具

posted @ 2022-09-05 11:52  ENVI-IDL技术殿堂  阅读(426)  评论(0编辑  收藏  举报