摘 要: COM技术是新一代的组件式
GIS 发展的主流。在分析了COM与组件式
GIS 的关键技术及ArcObjects 的
体系结构的基础上,结合一个通用
GIS 系统的开发实例,阐述了应用ArcObjects 开发独立于ArcInfo 而独立运行的
GIS 系统的开发方式和实现过程。
关键词: COM;
GIS; 组件式
GIS; ArcObjects
中图法分类号: TP311. 11 文献标识码: A 文章编号: 100123695(2004) 0320130203
Key Technique of Developing System Applying ArcObjects
ZHAO Wan2feng , LIU Nan , LIU Ren2yi , WANGJie
( Zhejiang Province Laboratory of Geographic Information System , Zhejiang University , Hangzhou Zhejiang 310028 , China)
Abstract : COM technique is the mainstream of modern component
GIS development. Basing on analyzing the key technique of COM,
component
GIS and the structure of ArcObjects ,and describing an universal
GIS software design ,this paper discussed the method of ap2
plying ArcObjects to develop separate
GIS software.
Key words : COM;
GIS; Component
GIS; ArcObjects
1 前言
地理信息系统(Geographic Information System ,
GIS) 历经近四
十年的发展,已逐渐建立起其完整的技术系统和理论体系,应
用领域不断扩大,已形成一个多层次、多尺度的应用格局,成为
了信息产业的重要组成部分[1 ] 。在技术进步和应用需求的双
重驱动下,
GIS 软件技术体系得到迅速发展。从最早的
GIS 模
块逐步发展为集成式
GIS、模块化
GIS、核心式
GIS 和组件式
GIS等[2 ] 。其应用开发主要有三种方式: (1) 自主设计空间数
据结构和数据库,利用VC ++ ,VB 等编程语言开发
GIS 软件;
(2) 引进先进的
GIS 软件(如Arc/ Info) ,利用其提供的二次开发
工具,结合自己的应用目标开发; (3) 利用支持面向对象技术的
高级语言和
GIS 厂商提供的组件来开发面向最终用户的
GIS 应用系统。
随着计算机技术和全球信息网络技术的飞速发展,组件式
软件技术已经成为当今软件技术的潮流之一,对
GIS 软件也产
生了巨大的影响,组件式
GIS 应运而生。ESRI 公司最新推出
的基于COM技术的对象库ArcObjects 为
GIS 开发商提供了前
所未有的灵活性。本文主要探讨基于COM 技术的ArcObjects
进行
GIS 系统开发,并介绍基于该技术开发的一个精简通用
GIS 系统。
2 COM与ComGIS 关键技术
211 组件与面向对象的组件模型———COM
组件是具有以下特点的程序块: (1) 具有一定结构和功能;
(2) 遵循一定的接口标准; (3) 单独或与其他组件一起共同完成
特定的功能; (4) 内部实现完全封装。
组件软件开发可以分成两个层次,即标准组件的开发和利
用标准组件进行系统组件开发。组件接口标准是组件协同工
作的基础,也是组件软件开发的基础。目前有两个公认的工业
标准:微软的COM 和OMG对象管理组织的CORBA。CORBA
模型主要应用于UNIX操作系统平台上,而COM则主要应用于
Windows 操作系统平台上,因而有更广泛的应用。
COM(Component Object Model ,组件对象模型) 是Microsoft 公
司提出的一种网络标准,可用于软件组件间跨越多个进程、机
器、硬件和操作系统进行互操作[3] 。组件之间的接口是组件软
件的关键,因为接口是双方进行通信的基础。COM 接口有两
个含义: (1) 它是一组可以调用的函数; (2) 接口是组件及其客
户程序之间的协议。当使用COM对象开发时,开发人员不能
直接使用COM对象,而是通过接口访问对象获得。一个组件
程序可以包含多个COM对象,并且每个COM对象可以实现多
个接口,其关系如图1 所示。

此主题相关图片如下:

212 COM技术与
GIS 的结合———ComGIS
组件式
GIS 是软件组件技术在
GIS 软件开发中的应用,是
指基于组件对象平台,以一组具有某种标准通信接口的、允许
跨语言应用的组件提供的
GIS。
目前国内外著名的
GIS 厂商都相继地推出了他们的
GIS 组件,如Intergraph 公司的Geomedia ,MapInfo 公司的MapX,ESRI
公司的MapObjects 和最新推出的ArcObjects 等。这为基于
GIS 软件的系统开发带来了根本性的变革,即由过去的在
GIS 平台
提供的二次开发环境下进行开发转变为在通用的软件开发环
境下进行开发,这些
GIS 组件具有
GIS 软件的基本功能,如多
种格式数据的读取、分层显示、编辑、图形的缩放、漫游、多种方
式的查询、制图等。它们遵循了COM标准,可以与可视化编程
环境中的非
GIS 组件一起协调工作,共同完成
GIS 的功能。
传统
GIS 开发模式存在着开发负担重、集成困难以及二次
开发语言复杂、难以普及等缺陷。同传统的
GIS 比较,组件式
GIS 具有如下几个优点: (1) 无缝集成。组件式
GIS 构造应用系
统只实现
GIS 自身的功能,其他功能则由其他组件实现;组件
之间的联系则由可视化的通用开发语言如VB ,VC 实现。通过
组件之间的消息传递,组件间互相调用、协同工作,从而实现了
系统组件之间的高效、无缝集成。(2) 跨语言使用。组件式
GIS 不需专门的二次开发语言,只需实现
GIS 的基本功能函数,
按照COM标准开发就能被通用语言使用。(3) 易于推广。组
件式技术已成为工业标准,用户可以像使用其他ActiveX控件
一样使用
GIS 组件,使非专业用户也能够开发和集成
GIS 应用
系统,推动了
GIS 的大众化进程。
3 ArcObject s 开发技术
311 基于COM技术的ArcInfo 8
ArcInfo 8 不仅继承了ArcInfo 已有的核心模块,还包含了三
个新的应用程序:ArcCatalog ,ArcMap 和ArcToolbox ;并全面采用
COM技术,提出了一系列基于COM的新概念,如面向组件对象
的
GIS 等,从而使
GIS 与现代的软件技术及其他计算机技术的
发展趋势相一致,为
GIS 与IT 主流计算机应用打下了坚实的
基础。
312 ArcObjects 的对象和属性
ArcObjects 是ArcInfo 桌面软件的开发平台。ArcObjects 由1
800 多个组件、几百个具有良好文档说明的接口和数千个方法
(Method) 所组成。ArcObjects 组件展现了在ArcInfo 中可以利用
的全部功能。
ArcObjects 组件库的每一个组件中定义有不同的类,类下
面定义了不同接口,接口中包含不同的属性和方法。类之间有
类型继承(Type Inheritance) 关系,接口之间有互相调用(Query2
Interface) 及相互继承( Interface Inheritance) 关系。
(1) 类
ArcObjects 中的类有三种: Abstract Classes , Coclasses 和
Classes。Coclasses 可在开发环境中直接定义并实例化;Classes
不能直接实例化,只能从其他类接口的属性函数或其他方法的
输出参数中获得;而Abstract Classes 为抽象类,不能定义及实例
化,只是用来派生其他类。
(2) 类的类型继承
类型继承是指类之间的接口类型的继承,而不是继承其实
现,如图2 所示。Element 类有六个接口,GraphicElement 继承于
Element ,它有八个接口,包括自身的两个接口和类型继承于El2
ement 的六个接口。继承过来的接口只是名称相同,具体的实
现则不同。
(3) 接口
类下面包含不同接口,接口名前都有“I”字母。如Feature2
Class 类包含IFeatureClass , IDataset , ITable 等不同接口。不同的
Coclasses 可有同一个接口,如FeatureClass 类有IFeatureClass 接
口,而RelQueryTable 类也有IFeatureClass 接口。

此主题相关图片如下:

(4) 接口调用
两个接口之间是否可以相互调用要满足一个条件:它们要
同属于一个类,如类FeatureLayer 包含IFeatureLayer 接口和I2
Dataset 接口。如果已知IFeatureLayer 的指针,则通过以下语句
就可得到IDataset 的指针:
ipFeatureLayer2 > QueryInterface( uuidof ( IDataset) , ( void
3 3 ) &ipDataset ) ;
(5) 接口继承
如ImapFrame 接口和IMapSurroundFrame 接口继承于
IFrameElement 接口,则父类接口IFrameElement 所具有的方法和
属性对派生接口ImapFrame 和IMapSurroundFrame 都有效。
313 用ArcObjects 进行系统开发的方式
(1) 利用ArcGIS 桌面应用程序(如ArcMap) 内置的VBA 宏
进行客户化
这种客户化只是修改一下ArcMap 的界面或利用这些桌面
软件内置的开发环境VBA 进行客户化,主要用于让桌面软件
完成一些重复性的工作或添加一些扩展的功能。这种开发方
式的缺点是不能脱离桌面软件而独立运行。
(2) 在AO 组件基础上进一步包装自己的COM组件
新生成一个DLL ,EXE 或OCX工程,引用ArcObjects 库,定
义自己的接口和功能,底层功能的实现仍依赖于ArcObjects。
这种开发方式具有最大的灵活性,因为所写的组件既可挂到
ArcGIS 桌面应用中,也可用于独立的应用程序中,但这种开发
方式需要较高的组件开发技术。
(3) 开发独立的EXE 应用程序
这种开发方式的一般过程就是新建一个EXE 工程,将Ar2
cObjects 库引入,然后编写代码完成特定功能。这种开发方式
的优点在于:开发人员可以从某个组件库中取出所需的某个组
件快速组装到一起,以构造所需的应用程序,从而加快应用程
序的开发;能有一个全新的用户化界面,并且脱离ArcGIS 桌面
软件而独立运行。但这种方式难度较大。
4 实例研究
在以往的ArcInfo 二次开发研究中,往往利用内置的VBA
宏进行客户化,这种开发方式的优点是快速、简单,但不能脱离
桌面软件而独立运行。为了实现一个具备常用
GIS 功能并能
够脱离ArcGIS 而独立运行的应用程序,我们采用第3. 3 节中所
述的第(3) 种开发方式,即开发独立的应用程序,应用ArcOb2
jects 和Visual C ++ 6. 0 开发了一个精简通用
GIS 系统。
系统主要功能有:地理要素的交互式显示、查询和分析;空
间查询分析;图形编辑功能包括空间要素的新建、移动、修改、
拷贝,要素缓冲区、同层要素合并,要素相交生成新要素,要素
镜像、多边形切分、线段切分生成新要素,删除,线段断开、延
伸,生成注记等;单用户环境下支持短事务的对象编辑及其
Undo/ Redo 等。系统主界面如图3 所示。
411 类型库的引入
开发独立的应用程序时,我们可以用的类型库是esriCore.
olb ,该库几乎包含了除扩展模块外的所有功能。在VC ++ 中,
利用# import 伪指令引入类型库,编译器从类型库中读取信息
并创建包装类,程序通过包装类调用COM对象提供的方法和
属性。将Import 指令写在StdAfx. h 文件中,如下所示:
# import ″c : \ arcgis \ arcexe81 \ bin \ esriCore. olb″
raw interfaces only ,raw native types ,no namespace ,named guids
exclude (″OLE COLOR″,″OLE HANDLE″)
# import 指令利用了一个新的类: com ptr t ,也被称为
智能指针。智能指针自动执行COM的QueryInterface ,AddRef 和
Release 函数。
412 基本图形操作功能的实现
图形显示是通过MapControl 控件来实现,通过它可获得
esriCore. olb 提供的其他组件接口,从而实现各种功能。Map2
Control 控件也支持一些事件响应,如MouseDown ,MouseMove ,
MouseUp 等,利用这些事件,可以实现图形的放大、缩小、漫游
等基本功能。
放大的一般过程是在MouseMove 中用Track 事件跟踪:
m map. SetExtent (m map. TrackRectangle () ) ;
在MouseUp 中获取最后一点的鼠标位置,重画图层。
ipActiveView2 > get Extent (&ipEnvelope) ; / / 当前屏幕大小
ipEnvelope2 > Expand(0. 5 ,0. 5 ,TRUE) ;
ipActiveView2 > put Extent (ipEnvelope) ;
ipActiveView2 > Refresh() ;
413 信息查询的实现
查询功能中主要实现了属性到图形查询,图形到属性查
询,空间关系查询。例如从图形查询属性这个功能的实现,首
先要接收用户点击处的坐标,然后遍历当前视图上的所有层,
获取靠近点击处一定范围内的要素目标。不同要素层分别处
理,具体要素目标的设置用接口IProximityOperator ,该接口用来
计算两个图形要素之间的距离或者距离已知点最近的要素目
标。
IProximityOperatorPtr ipProximity(ipSearchGeometry) ;
然后获取所有的图层,对每一图层进行操作。设置查询过
滤器,如采用相交点条件进行查询。
ISpatialFilterPtr ipFilter ( uuidof (SpatialFilter) ) ;/ / 查询对象定义
ipFilter2 > put SpatialRel (esriSpatialRelIntersects) ;
/ / 设置查询方式
ipFilter2 > putref Geometry(ipSearchGeometry) ;
ipFilter2 > put GeometryField(name) ;
/ / 返回值为IFeatureCursorPtr
ipFeatClass2 > Search(ipFilter ,FALSE ,&ipCursor) ;
ipCursor2 > NextFeature (ResultFeature) ;
414 图层编辑及空间操作
在ArcObjects 体系中,与编辑功能相关的对象类主要是:
(1) Geometry 类。主要包括派生的Point 类、MultiPoint 类、
Line 类、Polyline 类、Polygon 类等。
(2) 集合类。主要包括PointCollection 类、GeometryCollection
类、SegmentCollection 类等。
(3) 空间操作符。主要包括ITopologicalOperator 接口、IRela2
tionalOperator 接口和IproximityOperator 接口。
合并的思路就是创建一个新的要素,用来存储合并后的多
边形;遍历所有被选择的图形, 进行合并。

此主题相关图片如下:

5 结束语
软件的组件化是面向对象技术与分布式计算技术发展的
需要和必然结果。采用组件式结构的
地理信息系统,与传统的
开发方式相比,可以降低开发难度,提高开发效率,增强系统的
灵活性和开放性。本文基于ArcObjects 和COM技术的精简通
用
GIS 系统的开发已经获得成功,并且可以方便地移植到各种
应用系统中。因此,可以得出结论,COM技术为传统
GIS 面临
的多种问题提供了全新的解决思路,已成为新一代的组件式
GIS 发展的主流。
参考文献:
[1 ] 宋关福,钟耳顺. 组件式
地理信息系统研究与开发[J ] . 中国图像
图形学报,1998 , (4) :3132317.
[2 ] 钟耳顺.
地理信息系统技术开发、应用与产品化[J ] . 中外科技信
息,1998 , (12) 1
[3 ] 余英,梁刚. Visual C ++ 实践与提高:COM和COM+ 篇[M] . 北京:
中国铁道出版社,2001. 95298.
[4 ] 赵华亮,赵晓虎,唐宏. 构件式
GIS 软件开发中的构件构架技术
[J ] . 中国矿业大学学报,2001 , (3) 1
[5 ] ArcObjects Developer ’s Guide[R] . ESRI Corp1 ,1999.
作者简介:
赵万锋(19782) ,男,硕士研究生,主要从事组件式
GIS、互联网
GIS 方面
的研究;刘南(19442) ,浙江省资源与环境信息系统重点实验室主任,教
授,博士生导师,主要研究领域为
GIS 理论及应用;刘仁义(19602) ,副教
授,博士,主要研究领域为面向对象的空间数据库理论、时空数据模型
及
GIS 应用系统技术开发;王洁(19752) ,女,硕士研究生,主要从事组件
式
GIS 方面的研究。