•ComGIS基本概念•ComGIS特点•ComGIS开发方法•ComGIS开发实践—以ArcObjects/ArcEngine为例第十一章GIS组件开发第一节ComGIS的基本概念•什么是组件式GIS?组件式GIS,是将复杂的GIS功能按照对象、功能、应用等层次分解为可以互操作和自我管理的组件,这些组件由一种特定的平台或语言开发且能够在其它的平台或语言中重复使用。简单地说,组件式GIS就是采用了面向对象技术和组件式软件的GIS系统(包括基础平台和应用系统)[宋关福等,1999]。第一节ComGIS的基本概念•什么是组件式GIS?组件式GIS分为COM组件和CORBA组件两种,分别由Microsoft和OMG开发。COM是公共对象模型(CommonObjectModel)的英文缩写,微软官方称之为组件对象模型(ComponentObjectModel),它是OLE(ObjectLinking&Embedding)和ActiveX共同的基础。基于分布式环境下的COM被称作DCOM(DistributedCOM),它实现了COM对象与远程计算机上的另一个对象之间直接进行交互。第一节ComGIS的基本概念•什么是组件式GIS?CORBA是公共对象请求代理体系结构(CommonObjectRequestBrokerArchitecture)的英文缩写,是由对象管理工作组(OMG)开发的一个组件软件标准。OMG是由成千上百个公司组成的组织,他们致力于构建分布式对象计算的标准体系结构。CORBA基于对象管理体系结构,为厂商提供一个标准框架,使他们使用不同的语言、操作系统和硬件开发出来的应用系统,仍然具有可移植性和互操作性。第一节ComGIS的基本概念•什么是ComGIS?ComGIS是基于COM组件构建的组件式GIS。COM不是一种面向对象的语言,而是一种二进制标准,它建立的是一个软件模块与另一个软件模块之间的链接,当这种链接建立之后,模块之间就可以通过被称之为“接口”的机制来进行通信。COM标准增加了保障系统和组件完整的安全机制,扩展到分布式环境的DCOM则支持分布式计算、交互操作和有限的移植。第一节ComGIS的基本概念•什么是ComGIS?OLE是基于COM的可以使软件组件进行即插即用互操作的一种技术,其中使用了OCX控件。ActiveX是一套基于COM的可以使软件组件在网络环境中进行互操作而不管该组件是用何种语言创建的技术集。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序。此外,ActiveX一般具有界面。ActiveX控件是ActiveX技术中使用的一种可编程、可重用的基于COM的对象。第一节ComGIS的基本概念•什么是ComGIS?ComGIS的基本思想是把GIS的各大功能模块划分为几个组件,每个组件完成不同的功能。各个GIS组件之间,以及GIS组件与其它非GIS组件之间,都可以方便地通过可视化的软件开发工具集成起来,形成最终的GIS基础平台以及应用系统。组件如同一堆各式各样的积木,它们分别实现不同的功能(包括GIS和非GIS功能),根据需要把实现各种功能的“积木”搭建起来,就构成应用系统。第一节ComGIS的基本概念•为什么要使用ComGIS?传统GIS虽然在功能上已经比较成熟,但是它们多是属于独立封闭的系统。同时,由于GIS软件变得日益庞大,不仅用户难以掌握,而且费用昂贵,阻碍了GIS的普及和应用。ComGIS的出现为传统GIS面临的多种问题提供了全新的解决思路,已经成为当今软件技术的潮流之一[比尔.盖茨,1997],为了适应这种技术潮流,“GIS软件象其它软件一样,已经或正在发生着革命性的变化,即由过去厂家提供了全部系统或者具有二次开发功能的软件,过渡到提供组件由用户自己再开发的方向上来”[徐冠华,1997]。第二节ComGIS的特点小巧灵活、价格便宜。在组件模型下,各组件都集中地实现与自己最紧密相关的系统功能,组件化的GIS平台集中提供空间数据管理能力并且能以灵活的方式与数据库系统连接。在保证功能的前提下,系统表现得小巧灵活,而其价格仅是传统GIS开发工具的十分之一甚至更少。这样,用户便能以较好的性能价格比获得或开发GIS应用系统;第二节ComGIS的特点高效无缝的系统集成。由于组件生产建立在严格的标准之上,因此,ComGIS可以嵌入通用的开发环境(如VB、VC、Delphi、PowerBuilder、Notes、Foxpro、Access等)中实现GIS功能,专业模型则可以使用这些通用开发环境来实现,也可以插入其它的专业性模型分析控件,这与传统GIS专门性开发环境相比,是一种质的飞跃;专业模型ComGIS控件其他控件GIS应用集成系统VisualBasic等可视集成开发环境第二节ComGIS的特点强大的GIS功能。新的GIS组件都是基于32位系统平台的,采用InProc直接调用形式,所以无论是管理大数据的能力还是处理速度方面均不比传统GIS软件逊色。小小的GIS组件完全能提供拼接、裁剪、叠合、缓冲区等空间处理能力和丰富的空间查询与分析能力;第二节ComGIS的特点大众化。组件式技术已经成为业界标准,用户可以象使用其它ActiveX控件一样使用ComGIS组件,使非专业的普通用户也能够开发和集成GIS应用系统,推动了GIS大众化进程。ComGIS的出现使GIS不仅是专家们的专业分析工具,同时也成为普通用户对地理相关数据进行管理的的可视化工具。第二节ComGIS的特点开发简捷。ComGIS不需要额外的GIS二次开发语言,只需按照Microsoft的ActiveX控件标准开发接口实现GIS的基本功能函数,这不仅有利于减轻GIS软件开发者的负担,而且增强了GIS软件的可扩展性。GIS应用开发人员只需熟悉基于Windows平台的通用集成开发环境,以及组件式GIS各个控件的属性、方法和事件,就可以像管理数据库表一样熟练地管理地图等空间数据,完成应用系统的开发和集成,无须对开发人员进行特殊的培训。ComGIS与用户的交互传统GIS软件与用户或者二次开发者之间的交互一般通过菜单或工具条按钮、命令以及二次开发语言进行,ComGIS与用户和客户程序之间则主要通过属性、方法和事件交互。ComGIS控件(ActiveX服务器)集成开发环境(ActiveX容器)与其他COM组件方法事件属性第三节ComGIS开发方法•ComGIS开发平台的结构ComGIS开发平台通常可设计为基础组件、高级通用组件和行业性组件三级结构。基础组件处于平台最低层,是整个系统的基础,主要面向空间数据管理,提供基本的交互过程,并能以灵活的方式与数据库系统连接。第三节ComGIS开发方法•ComGIS开发平台的结构高级通用组件由基础组件(如显示工具组件、选择工具组件、编辑工具组件、属性浏览器组件等)构造而成,面向通用功能,简化用户开发过程,它们之间的协同控制消息都被封装起来,使二次开发更为简单(如一个编辑查询系统,若用基础平台开发,需要编写大量的代码,而利用高级通用组件,只需几句程序就够了)。第三节ComGIS开发方法•ComGIS开发平台的结构行业性组件抽象出行业应用的特定算法并固化到组件中,进一步加速开发过程。以GPS监控为例。对于GPS应用,除了需要地图显示、信息查询等一般的GIS功能外,还需要特定的应用功能(如动态目标显示、目标锁定、轨迹显示等)。这些GPS行业性应用功能组件被封装起来后,开发者的工作就可简化为设置显示目标的图例、轨迹显示的颜色、锁定的目标以及调用、接受数据的方法等。第三节ComGIS开发方法•ComGIS的实现形式目前,ComGIS主要有两种实现形式。一种形式是由可以实现制图与一般GIS功能的ActiveX控件集构成的ComGIS,这些控件既可以通过属性、事件、方法等接口与应用程序进行交互,也可以在可视化开发环境中集成构成应用系统。国内外具有代表性的有:ESRI公司出品的MapObject、MapInfo公司推出的MapX、武汉吉奥公司研发的GeoMap等。第三节ComGIS开发方法•ComGIS的实现形式另一种形式的ComGIS是基于MicrosoftCOM技术构建一系列COM组件集,用户可以利用这些组件开发各种GIS功能并在此基础上构建GIS应用系统。这种开发模式更为底层,开发也较为复杂,功能更为强大,以ESRI公司的ArcObjects(简称AO)组件或ArcEngine(简称AE)为典型。以上两种开发实现形式的软件都具有地图显示、图层控制、数据查询、地图符号化、专题地图等基本功能。第三节ComGIS开发方法•基于ActiveX控件的ComGIS开发方法以ActiveX控件形式设计ComGIS,需要根据功能划分为多个控件。划分控件需要根据不同的数据结构和系统模型进行具体分析,要考虑以下几个方面的问题:(1)控件间差别最大、控件内差别最小;(2)纯设计用模块与将随集成系统发布的模块分开(例如地图符号编辑、线型编辑器应与空间查询分析等模块分开);(3)相同显示窗口的模块尽可能设计在同一个控件里;(4)处理相同数据文件的模块尽可能设计在同一个控件里;(5)剔除空间查询分析控件中不必要的内容,减少Internet下载的数据量。第三节ComGIS开发方法•基于ActiveX控件的ComGIS开发方法考虑到以上因素,基于ActiveX控件的ComGIS可以划分为数据采集与编辑控件、图像处理控件、三维控件、数据转换控件、地图符号编辑/线性编辑控件、空间查询分析控件等。其中一些无须进行二次开发的模块不一定以组件方式提供,比如数据采集、数据转换、符号编辑/线型编辑等模块可以用独立运行程序方式提供,数据转换模块还可以编译成动态连接库。第三节ComGIS开发方法•基于ActiveX控件的ComGIS开发方法基于ActiveX控件的ComGIS开发还要注意几个方面的问题:(1)代码优化和算法高效。尽管COM技术的二进制通信效率很高,但与独立运行程序比较运行速度上仍有差距,采用高效的算法并精心优化代码可以使软件整体效率有较大改善;(2)数据结构紧凑、简练。在能够充分表达地理信息并能有效进行各种处理、分析的前提下,软件数据结构要尽可能紧凑,这不仅可以加快数据存取速度,同时也为适应Internet传递的需要;(3)数据引擎通用。除提供与各种GIS数据文件格式的数据转换程序外,ComGIS被设计为可以直接访问多种数据格式,可以提高数据共享方面的能力(例如Intergraph的GeoMedia可以直接访问ArcView、MGE等著名软件的数据格式)。第三节ComGIS开发方法•基于AO/AE的ComGIS开发方法在VB开发环境中,首先通过[References]将ESRIObjectLibrary(esriCore.olb库)引用进来。然后根据应用,选择或查找相关的AO/AE组件类及其接口和要使用的方法与属性,编写实现代码。如在MapControl控件中添加一个空的Feature图层,其操作为:DimpLayerAsIFeatureLayer//定义接口变量SetpLayer=NewFeatureLayer//实例化变量mapControl1.ActiveView.FocusMap.AddLayerpLayer//添加图层第三节ComGIS开发方法•基于AO/AE的ComGIS开发方法在VC++开发环境中,也需要引用AO/AE组件的核心库,在相应工程的.h头文件中添加如下语句:#import“C:\arcgis\arcexe92\bin\esriCore.olbraw_interfaces_only,raw_native_types,no_namespace,named_guids,exclude(OLE_COLOR,OLE_HANDLE),就可运用AO/AE提供的接口编程。但是,VC中的定义方式与VB中不同,VC采用智能指针来定义