第十二章 RS-GIS混合编程 本章讨论三个问题: 第一个是IDL编程环境下,调用ENVI,借助IDL的图像处理函数和ENVI的图像处理函数实现遥感图像处理; 第二个是以外部开发语言,如C#、VB.net等为开发平台,调用IDL和ENVI的图像处理函数实现图像处理(包括使用IDLDrawWidget控件的有界面编程和使用COM_IDL_CONNECT控件的无界面编程); 第三个是以外部开发语言,如C#、VB.net等为开发平台,调用IDL和ArcgisEngine实现RS-GIS混合编程。
第十二章 RS-GIS混合编程 12.1 IDL调用ENVI编程 IDL调用ENVI编程,需解决图像读写、图像处理、事件传递、图像显示的问题。其中,IDL调用ENVI函数后,可很好的解决图像读写和图像处理问题。由于编程过程中做事件传递,需要使用Widget控件,而图像输出可采IDL的直接图形法(用tv、tvscl命令)或对象图形法(IDLgrImage对象)。因此,需要解决Widget控件与直接图形法、Widget控件与对象图形法间的值传递问题。
第十二章 RS-GIS混合编程 12.1.1 基于ENVI-IDL的直接图形法编程 基于ENVI-IDL的直接图形法编程中,使用widget_base、widget_button、widget_text、widget_label、widget_droplist、widget_table、widget_draw等控件创建界面;IDL调用ENVI函数后,实现图像读写和图像处理。图像输出时,把widget_draw组件看成直接图形法下的window窗口,使用wset命令确定图像输出目标为widget_draw组件,使用tv或tvscl命令输出图像。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 12.1.2基于ENVI-IDL的对象图形法编程 基于ENVI-IDL的对象图形法编程中,使用widget_base、widget_button、widget_text、widget_label、widget_droplist、widget_table、widget_draw等控件创建界面;IDL调用ENVI函数后,实现图像读写和图像处理。图像输出时,创建IDLgrImage、IDLgrModel、IDLgrView对象(不创建IDLgrWindow对象)。把widget_draw组件看成对象图形法下的IDLgrWindow对象;将IDLgrView对象添加到widget_draw组件,最后绘图到widget_draw控件。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 程序编写中,假设创建的widget_draw名为wdraw,图像数组名字为data。使用对象图形法,将图像输出到widget_draw的关键语句为(前后语句略): ENVI>image=obj_new('idlgrimage',data) ENVI>model=obj_new('idlgrmodel') ENVI>view=obj_new('idlgrview') ENVI>wdraw=widget_draw() ENVI>model->add,image ENVI>view->add,model ENVI>widget_control,wdraw,get_value=draw1 ENVI>draw1.draw,view
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 12.2其它语言通过IDLDrawWidget访问ENVI-IDL
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 12.2.1 VB6访问IDL VB6在64位操作系统下安装时,忽略提示的错误信息就可成功安装。VB通过调用idldraw3.ocx控件访问IDL。启动VB6进入主界面后,在工具栏空白处点击右键,选择【添加部件】项,打开部件对话框。下拉选择【IDLDrawX3 ActiveX Control Module】项,就调用了\idl8x\bin\bin.x86\idldrawx3.ocx。图12.6是VB6企业版调用IDLDrawWidget控件界面。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 VB6调用IDL示例 【例12.4】以VB6.0企业版为开发平台,调用idldraw3.ocx控件,读入tiff格式DEM数据,使用IDL的surface命令实现三维地形表面绘制。 分析:VB6.0调用idldraw3.ocx控件实现和IDL的连接,读入tiff格式数据需使用ENVI函数;三维地形表面绘制使用IDL的surface命令。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 12.2.2 VB.net访问IDL 打开VS2010,顺序选择【新建项目】-【VisualBasic】-【Windows窗体应用程序】,创建WindowsApplication应用程序(默认名字WindowsApplication1)。在工具栏上选择【组件】,右键选择【添加项】,在【选择工具箱】界面点击【COM组件】,添加对IDLDrawWidget控件的引用。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 【例12.5】在Form1上添加IDLDrawWidget控件,在Form1的Load事件里编写代码,使用DEM绘制等高线。要求在图像上显示地图坐标。 示例程序是本章的vb.net\WindowsApplication1\WindowsApplication1.sln,程序运行结果如图12.9所示。IDLDrawWidget控件名为AxIDLDrawWidget1。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 12.2.3 C#访问IDL 打开VS2010,选择【新建项目】-【Visual C#】-【Windows窗体应用程序】,创建WindowsApplication应用程序。在工具栏上选择【组件】,右键选择【添加项】,在【选择工具箱】界面点击【COM组件】,添加对IDLDrawWidget控件的引用。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 1、C#执行IDL语句 C#调用IDLDrawWidget控件执行IDL语句时,常用的是IDLDrawWidget控件的ExecuteStr方法(其它外部语言也一样)。使用时,在ExecuteStr(“”)的“”里书写IDL语句,但这种书写方法效率不高。 2、C#调用IDL直接图形法的pro文件 先在IDL下使用直接图形法书写pro文件。IDL语句输出图像时,不使用“Window”语句创建输出界面,而是直接输出。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 3、C#调用IDL对象图形法的pro文件 先在IDL下使用对象图形法书写pro过程文件。输入参数为C#中IDLDrawWidget控件DrawID,不创建IDLgrWindow对象(使用IDLDrawWidget控件代替IDLgrWindow对象)。图12.12是C#调用IDL对象图形法的pro文件流程图。调用pro文件时,先添加IDLDrawWidget控件;然后编译pro文件;最后使用调用IDL过程名的形式调用pro文件,输入参数为IDLDrawWidget控件DrawID。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 【例12.6】使用C#实现对IDL直接图形法和对象图形法pro文件的调用。 IDL文件:chapter12\direct_graphic.pro, chapter12\object_graphic.pro。 C#文件:chapter12\C#\WindowsFormsApplication1\WindowsFormsApplication1.sln。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 12.3其它语言通过COM_IDL_CONNECT访问ENVI-IDL IDL的com_idl_connect组件能够提供其它语言对ENVI-IDL的无界面访问。表12.6是com_idl_connect组件的方法
第十二章 RS-GIS混合编程 12.3.1 C#通过COM_IDL_CONNECT访问ENVI-IDL 启动VS2010,选择项目类型为【Visual C#】,选择模板为Windows窗体应用程序”。进入主界面后,指定项目名称为“Windows Application”,存储路径用默认值。进入主界面后,在【解决方案资源管理器】界面的“Windows Application”项上点击右键,选择【添加引用】项。进入【COM】选项卡(图12.15),选择“Com_IDL_ConnectLib 1.0 Type Library”
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
12.3.2 VB.net通过COM_IDL_CONNECT访问ENVI-IDL VB.net连接com_idl_connect访问ENVI-IDL时,构建界面,添加引用的操作和C#下操作一样,但是对象创建时的代码有差别。语句为: Imports COM_IDL_connectLib Dim COMIDL1 As COM_IDL_connectLib.COM_IDL_connect = _ New COM_IDL_connectLib.COM_IDL_connect COMIDL1.CreateObject(0, 0, 0) COMIDL1.ExecuteString("envi,/restore_base_save_files") COMIDL1.ExecuteString("envi_batch_init") COMIDL1.ExecuteString("device,decomposed=1") COMIDL1.ExecuteString("WINDOW,0,TITLE='VB.NET使用COM调用ENVI-IDL'")
第十二章 RS-GIS混合编程 12.4 ENVI-IDL与Arcgis Engine混编 Arcgis Engine是ESRI为开发嵌入式GIS和独立运行的GIS桌面端应用程序而推出的二次开发组件库。安装Visual Studio 2010和Arcgis10 Desktop后,继续安装Arcobjects SDK For .Net Framework10和Arcgis Engine 10 Runtime,最后配置License。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程 12.4.2 VB.net调用ArcgisEngine与ENVI-IDL 为方便用户使用,VS2010为用户创建了调用ArcgisEngine的默认界面。在VB.net调用ArcgisEngine构建基本界面的基础上,还需添加对ENVI-IDL的引用。根据程序设计的需要,可添加有界面的widget_draw组件或无界面的com_idl_connect组件实现对ENVI-IDL的调用。
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程
第十二章 RS-GIS混合编程