ENVI的二次开发介绍邓书斌邓书斌主要内容•1、菜单的定制与自定义坐标系、菜单的定制与自定义坐标系•2、波段运算与批处理、波段运算与批处理•3、、ENVI函数函数•4、、ENVI/IDL与与ArcGIS一体化集成方案一体化集成方案ENVI的菜单文件•ENVI的菜单文件保存在的菜单文件保存在HOME\ITT\IDLxx\products\envixx\menu文件夹下,有文件夹下,有三个文件:三个文件:display.men:显示窗口菜单文件:显示窗口菜单文件display_shortcut.men:显示窗口右键快捷菜单:显示窗口右键快捷菜单envi.men:主菜单文件:主菜单文件•每个菜单项有三部分组成:每个菜单项有三部分组成: LEVEL {BUTTON NAME} [{UVALUE} {EVENT HANDLER PROCEDURE}] [{separator}]–LEVEL是菜单按钮的级别,从是菜单按钮的级别,从0开始的整数表示,必选项开始的整数表示,必选项–{BUTTON NAME} 菜单名称,必选项菜单名称,必选项–{UVALUE}分定义了为菜单项所赋给的用户值用户值在同一用分定义了为菜单项所赋给的用户值。
用户值在同一用户函数处理多个菜单项时非常有用,可以区别那个菜单项被选中户函数处理多个菜单项时非常有用,可以区别那个菜单项被选中–{EVENT HANDLER PROCEDURE} 事件名称,可选项事件名称,可选项–{separator} 菜单菜单“横线横线”标示关键字标示关键字菜单定制练习•在用记事本打开在用记事本打开envi.men文件,在文件的最后添加以下语句:文件,在文件的最后添加以下语句:0 {MyFunctions} 1 {Basic File Info} {not used} {file_info}•启动启动ENVI+IDL环境•在在IDL环境下新建一个源文件,编写以下代码,环境下新建一个源文件,编写以下代码,PRO file_info, event ENVI_SELECT, title='choose a file', fid=in_fid IF (in_fid eq -1L) THEN return ENVI_FILE_QUERY, in_fid, ns=ns, nl=nl, nb=nb, fname=fname OpenR, unit, fname, /Get_LUN info = FSTAT(unit) Free_LUN, unit print, 'you selected ',fname print, 'number of samples = ',ns print, 'number of lines = ',nl print, 'number of bands = ',nb print, 'file size in bytes = ',info.size END –保存为保存为file_info.pro,保存在保存在save_add目录下。
目录下•重启重启ENVI+IDL环境,可以看到在环境,可以看到在ENVI最末端新增一个菜单最末端新增一个菜单MyFunctions,点击运行点击运行坐标系原理•地理坐标系是以经纬度为单位的地球坐标系统,地理坐标地理坐标系是以经纬度为单位的地球坐标系统,地理坐标系中有系中有2个重要部分,即地球椭球体(个重要部分,即地球椭球体(spheroid)和大地)和大地基准面(基准面(datum)–大地基准面指目前参考椭球与大地基准面指目前参考椭球与WGS84参考椭球间的相对位置关系参考椭球间的相对位置关系((3个平移,个平移,3个旋转,个旋转,1个缩放),可以用其中个缩放),可以用其中3个、个、4个或者个或者7个个参数来描述它们之间的关系,每个椭球体都对应一个或多个大地参数来描述它们之间的关系,每个椭球体都对应一个或多个大地基准面•投影坐标系是利用一定的数学法则把地球表面上的经纬线投影坐标系是利用一定的数学法则把地球表面上的经纬线网表示到平面上,属于平面坐标系数学法则指的是投影网表示到平面上,属于平面坐标系数学法则指的是投影类型,目前我国普遍采用的是高斯类型,目前我国普遍采用的是高斯——克吕格投影,在英克吕格投影,在英美国家称为横轴墨卡托投影(美国家称为横轴墨卡托投影(Transverse Mercator)。
北京54与西安80坐标系•都是投影直角坐标系都是投影直角坐标系•北京北京54坐标系、西安坐标系、西安80坐标系实际上指的是我国的两个大坐标系实际上指的是我国的两个大地基准面地基准面坐标名称投影类型椭球体基准面北京54Gauss Kruger(Transverse Mercator)Krasovsky北京54西安80Gauss Kruger(Transverse Mercator)IAG75西安80椭球体名称年代长半轴(米)短半轴(米)扁率WGS8419846378137.06356752.31:298.257克拉索夫斯基(Krasovsky)19406378245.06356863.01:298.3IAG-7519756378140.06356755.31:298.257ENVI中自定义坐标系•ENVI中的坐标定义文件存放在中的坐标定义文件存放在HOME\ ITT\IDLxx\products\envixx \map_proj 文件夹下,三个文件夹下,三个文件记录了坐标信息:文件记录了坐标信息:–ellipse.txt 椭球体参数文件椭球体参数文件–datum.txt 基准面参数文件基准面参数文件–map_proj.txt 坐标系参数文件坐标系参数文件•在在ENVI中自定义坐标系分三步:定义椭球体、基准面和中自定义坐标系分三步:定义椭球体、基准面和定义坐标参数定义坐标参数定义椭球体•语法为语法为 <椭球体名称椭球体名称>,<长半轴长半轴>,<短半轴短半轴>。
这里将这里将“Krasovsky,,6378245.0,,6356863.0”和和“IAG-75,,6378140.0,,6356755.3”加入加入ellipse.txt末端•注:注:ellipse.txt文件中已经有了克拉索夫斯基椭球,由于文件中已经有了克拉索夫斯基椭球,由于翻译原因,这里的英文名称是翻译原因,这里的英文名称是Krassovsky,为了让其他,为了让其他软件平台识别,这里新建一个软件平台识别,这里新建一个Krasovsky椭球体添加基准面与定义坐标系•语法为语法为<基准面名称基准面名称>,<椭球体名称椭球体名称>,<平移三参数平移三参数>这里将将“Beijing-54, Krasovsky, -12, -113, -41”和和“Xi'an-80,IAG-75,0,0,0”加入加入datum.txt 末端•注:有的时候为了与其他软件平台兼容,基准面的名称直注:有的时候为了与其他软件平台兼容,基准面的名称直接写成所用的椭球体名称接写成所用的椭球体名称•在在ENVI任何用到投影坐标的功能模块中都可以新建坐标任何用到投影坐标的功能模块中都可以新建坐标系系(在任何地图投影选择对话框中,点击在任何地图投影选择对话框中,点击“New”按钮。
按钮),,或者直接选择主菜单或者直接选择主菜单->Map->Customize Map Projection坐标系定义练习•利用自定义坐标系将一幅北京利用自定义坐标系将一幅北京54坐标系转化为西安坐标系转化为西安80坐标坐标系•试验的栅格数据情况为:一幅北京坐标系的栅格数据,投试验的栅格数据情况为:一幅北京坐标系的栅格数据,投影参数如下:影参数如下: 投影类型:投影类型:Transverse Mercator 椭球:椭球:Krasovsky 基准面:基准面:Krasovsky(自定义)(自定义) 中央经线:中央经线:117 东向偏移:东向偏移:500000m波段运算•波段运算工具用来定义输入的波段或文件,并调用用户编波段运算工具用来定义输入的波段或文件,并调用用户编写的函数,最后将结果输出到文件或是内存中写的函数,最后将结果输出到文件或是内存中•例如表达式:例如表达式:–(float(b1)+float(b2)+float(b3))/3.0基于IDL的波段运算•由于由于 ENVI 为你提供对为你提供对 IDL 性能的访问,你可以使用内置性能的访问,你可以使用内置的的 IDL 功能的能力、功能的能力、IDL 用户函数,或书写你自己的程序用户函数,或书写你自己的程序执行自定义的操作。
有两种方式使用执行自定义的操作有两种方式使用IDL用户函数:用户函数:–将编写好的将编写好的.pro或者或者.sav 文件放在文件放在 save_add 目录下,启动目录下,启动ENVI–当你保存的是当你保存的是 .pro 文件时候,必须启动文件时候,必须启动 ENVI + IDL模式模式, 单击主单击主菜单菜单->File-> Compile IDL Module; 如果你只有单独的如果你只有单独的ENVI,你,你必须提供必须提供,编译好的编译好的 sav文件一个简单的练习•下面的程序文本可以在一个文本编辑器中输入,并用文件下面的程序文本可以在一个文本编辑器中输入,并用文件名名 user_bm1.pro 来保存放到来保存放到save_add文件夹下:文件夹下:实例:实例:FUNCTION user_bm1,, b1,, b2RETURN,, b1+b2END•启动启动ENVI,单击主菜单,单击主菜单->File->Open Image File打开一打开一个多波段文件个多波段文件•单击主菜单单击主菜单-> Basic Tools->Band Math,在在Enter an expression field中键入中键入user_bm1(b1, b2)。
•单击单击OK,为,为b1和和b2选择对应的波段选择对应的波段批处理•批处理模式的批处理模式的ENVI和正常模式下没有什么区别,只是通和正常模式下没有什么区别,只是通过一系列特定的函数库来执行过一系列特定的函数库来执行ENVI的功能•ENVI 功能函数分散在大约功能函数分散在大约50个小的个小的IDL save文件中,这文件中,这些二进制的文件包括数据和编译后的程序这些些二进制的文件包括数据和编译后的程序这些save文件文件存放在存放在ENVI安装路径下的安装路径下的Save目录下ENVI核心核心save文文件包括件包括ENVI的基本功能函数,动态运行函数以及的基本功能函数,动态运行函数以及ENVI运运行所需的内部变量在典型的行所需的内部变量在典型的Windows PC上这些文件存上这些文件存放在:放在:C:\rsi\idlxx\products\envixx\save 目录下批处理例子•一个简单的一个简单的ENVI批处理程序批处理程序pro bt_init envi,/restore_base_save_files ;恢复恢复ENVI sav文件文件envi_batch_init,log_file='batch.log' ;开始批处理模式开始批处理模式;Batch processing would go here ; 编写批处理过程编写批处理过程envi_batch_exit ;结束批处理模式结束批处理模式end ENVI函数•ENVI提供了大量处理函数供程序员使用,这些函数封装提供了大量处理函数供程序员使用,这些函数封装了交互式了交互式ENVI程序所提供的绝大多数的功能。
每个处理程序所提供的绝大多数的功能每个处理程序都是程序都是IDL的程序或是函数,并可以被任何其它的的程序或是函数,并可以被任何其它的IDL程程序所调用可以通过序所调用可以通过ENVI的帮助的帮助Working with ENVI -> ENVI Reference Guide -> ENVI Routines查看这些函数查看这些函数的使用说明和例子的使用说明和例子开发独立于ENVI界面的系统•全国旱情遥感监测系统 ——中科院遥感所ENVI/IDL与ArcGIS一体化集成方案•数据互操作与共享数据互操作与共享•平台间无缝链接平台间无缝链接•系统一体化集成系统一体化集成ENVI/IDL与ArcGIS数据互操作与共享•ENVI完全支持完全支持Geodatabase读写读写–File Based Geodatabase–Personal Geodatabase–Enterprise((SDE))Geodatabase•ENVI支持支持E00和和ShapeFile文件格式文件格式•ArcGIS支持支持ENVI的文件格式的文件格式•ENVI支持支持ArcGIS的企业级服务的企业级服务ArcGIS(Including Desktop, Server, Image Server)ENVI/IDLGeoDatabaseENVI/IDL与ArcGIS DesktopENVI/IDL与其它语言集成开发•实现技术手段:实现技术手段:–Callable 技术技术–IDLDrawWidget ActiveX –对象输出助手对象输出助手Callable IDL技术 IDL可以作为动态链接库被外部程序调用,称之为可以作为动态链接库被外部程序调用,称之为Callable IDL技术。
技术 外部程序可以像外部程序可以像IDL环境一样使用相关的程序或函数环境一样使用相关的程序或函数VC调用ENVI/IDL实例在VC调用ENVI函数:1.首先在建立一个VC的MFC工程,然后\ITT\IDL70\external\include目录下拷贝idl_export.h头文件,并添加到VC工程中2.工程→设置→连接 中的对象/库模块 中 添加idl.lib 3.工具→选项→目录 中的Library files 添加安装路径\ITT\IDL70\BIN\BIN.X864.我的电脑右键属性 高级→环境变量 →系统变量 path中添加;安装路径\ITT\IDL70\BIN\BIN.X865.IDL_Win32Init(0,handle,NULL,0); IDL初始化6.IDL_ExecuteStr(“restore,‘satstretch.sav’”); 执行IDL命令行7.IDL_Cleanup(true);清除IDL IDLDrawWidget ActiveX 实例在C#调用ENVI/IDL函数:1.首先在建立一windows应用程序在工具箱上右键→选择项→COM组建选中IDLDrawWidget Control 3.02.拖动 控件到窗体上3.axIDLDrawWidget1.IdlPath 设定IDL库文件目录4.n = axIDLDrawWidget1.InitIDL((int)this.Handle); 初始化IDL控件5.axIDLDrawWidget1.ExecuteStr(“”);执行IDL命令对象输出助手•可以将IDL的数据可视化与分析的功能添加到其他应用软件中•能够很容易地将IDL对象输出到Java和COM环境•自动化处理和直接缩短接口开发时间将IDL对象输出为COM1.定义IDL类(__ define)2.我的电脑右键属性 高级→环境变量 →系统变量 path中添加; C:\Program Files\Microsoft Visual Studio 8\Common7\IDE3.在IDL命令行中输入IDLEXBR_ASSISTANT 回车打开对象输出助手4.File → New Project → COM选择要输出的* __ define.pro文件打开将文件加载进输出助手5.设置对象要输出的过程、函数及其参数6.File → Save project保存工程7.Build → Build object 编译输出对象8.生成*.dll 和*.tlb文件(或*.ocx和*.tlb)9.在运行中用regsvr32 对dll(ocx)注册ENVI/IDL与ArcGISEngine集成构建自己的GIS与RS一体化平台高级语言(高级语言(C#、、java))+ ArcGIS Engine+ ENVI/IDL1、快速搭建系统原型2、有效解决了大数据量、数据浏览、栅格矢量叠加、矢量编辑、渲染、专题制图以及空间分析。
3、强大的图像处理引擎4、大大减少了代码开发量、以及程序的开发周期5、您只需要关注于业务流。