一.What is ArcObjects
1.AO是什么?
AO 是ESRI公司ArcGIS家族中应用程序ArcMap, ArcCatalog和 ArcScene的开发平台,它是基于Microsoft COM技术所构建的一系列COM组件集。应该澄清的是到目前为止,AO还不是一个独立的应用产品, 是依附在你的ArcGIS DeskTop产品中的软件开发包。也就是说,你购买了ArcGIS Desktop的任何一个产品,不管是ArcView还是ArcInfo,你都有了这套强大的AO组件集,利用AO提供的组件对象来进行应用开发。
2.AO的功能
通过AO你可完成以下甚至更多的GIS功能:
空间数据的显示、查询检索、编辑和分析;
创建各种专题图和统计报表;
高级的制图和输出功能;
空间数据管理和维护;
…………
其实是ArcMap、ArcCatalog和ArcScene这三个应用程序都是由AO搭建起来的,因此从理论上讲这些应用程序能完成的任务,通过 AO同样可以完成(但重新搭建一个ArcMap式的应用程序先不考虑其代价,就可靠性和稳定性而言就值得怀疑,在以后的内容里我会谈到这个问题)。我们现在绝大部分时候要做的---就是要利用ESRI提供的这些AO组件来进行积木式的组装任务。 AO已经提供了许多底层的基本功能,而你的任务是按照应用需求将这些底层功能组装集合成一个更强大的COM对象。我们现在知道AO是基于微软的COM技术来构建的,因此它的开放性和扩展性很强大。这儿的开放性是指在开发环境的选择上可以有VBA、VB、VC++、DEPHI等多种支持COM标准的开发工具,而扩展性是指AO组件没有提供的功能,如需要定义一种新的数据格式,你就可以利用COM技术来写自己的COM组件,对AO组件库进行扩展补充。在 ESRI的文挡中曾经看过类似‘用AO开发功能是没有限制的,这取决于你的想象力。AO的确非常强大,看看ArcMap给我们展现出来的功能就知道了。由于采用了COM技术,因此你不但可以在AO的基础上构造自己的COM组件,而且可以自己来完成一个 COM组件来对AO进行补充。至于为什么AO会基于COM技术,就趋势而言,目前和以后GIS的发展会和主流IT技术融合的越来越紧密,毕竟任何一个软件产品最终是要拿来用的,所以除了提供专业的GIS功能外,从易用性和扩展性来说也是极其重要的,而COM技术提供了一个解决之道。是不是有些罗嗦,强调其重要性的理由无非是在开始我们对AO的开发前先需要您打针兴奋剂,虽然功能强大、使用方便的应用程序从来不是简单的几行代码和控件的拖来拖去就可以搞定的,还需要您不断地学习和掌握更多的新的东西,但对于一个开发人员而言这些投入是值得的,对于尝试利用AO做开发的人员也是如此。那我们还不开始吗?
3.需要的技术基础
如何进入AO软件的领域开发?对于高级的AO程序设计人员我想必须跨越四大技术障碍:
1).面向对象技术思想;
2).COM技术;
3).AO各组件对象的层次组织和相互关系;
4).支持COM的各种开发工具及其环境(如VB、VC、DEPHI等)
真正属于ESRI自己的东西无非就是这套AO组件库。对于初次进入AO开发领域的人员来说,我个人觉得(至于COM还有其它暂时可以先放一边,照猫画虎完成许多任务还是没有问题的了)可以先从ArcGIS Desktop的应用开始,对AO的层次及相关概念有一个了解(如Map、Layer、View、Label、支持的数据格式等),否则等看到AO的示例时可能会一下子云里雾里,两厢印证我觉得最有可能豁然贯通吧。
4.AO开发工具包
AO开发工具包的安装可以选择在安装ArcGIS Desktop时,也可以任何时候使用安装光盘下的/ArcGIS/ArcObjects Developer Kit目录下的Setup.exe文件进行安装。下面是AO开发包安装完成后的目录结构:
Arcobjects Developer Kit
Help --- 包含开发帮助文件:AODev.chm, ArcObjects.chm等
Kits --- 附加的开发者素材诸如投影引擎头文件,类别ID文件和ESRI 示例命令的源代码 (在最新的8.2版本中,该代码位置有所变化)
Object Model Diagrams --- 包括所有的PDF格式对象模型图
Samples --- 包含所有示例工程文件的源代码
Utilities --- 包含ESRI 对象浏览器等工具
5.AO开发资源
1).《ArcObjects Developer Help》 ----- 这是AO开发的首选资源,个人觉得一定程度上甚至可以和微软的MSDN相媲美。不管是AO的基础COM、AO的对象层次图都提供了说明,此外还提供了大量的开发示例。
2).《ArcObjects Online》 ----- 提供了最新的AO组件库文档,其中有一个关于AO的技术论坛相信会让大家有很多意外的收获;
3).《Exploring ArcObjects》 -----一本很不错的AO技术文档,对AO的开发进行了很好的组织,而且有大量的示例,可以随时复制利用;
4).《Building a Geodatabase》 -----应用都是围绕数据来展开的,这本书主要是用来设计和创建Geodatabase的,但理解和掌握Geodatabase的层次和建摸方法,对AO的开发是很好的补充。
5).《Microsoft MSDN》----即使你的AO开发工具不是微软的,也建议安装一套完整的MSDN,想多了解和应用COM进行设计开发,MSDN是个宝藏。
二.AO的基础-----COM
组件化程序设计思想在今天应用已经非常普及,那么关于COM都有哪些东西呢? 在本节中我会介绍什么是CLASS,OBJECT,INTERFACE等COM等相关概念。
1.CLASS AND OBJECT(类和对象)
要介绍COM,就不能不提到面向对象思想,那么让我们先来看看什么是对象吧?在日常生活中,你我都是一个个对象,有姓名,有身高、体重等外在的特征,也有各自所具备的工作技能,也需要彼此间进行语言交流,同样在开发应用和GIS中也有对象的概念存在。
你在窗体上使用了一个控件,这个控件本身有大小、位置、颜色、名称等一系列称之为属性(Properties)的外在表示,而且也会有CLICK等称之为事件(Events)的通信动作存在。在AO的世界里,每个东西都是一个对象,有象Map、Form、Layer这些我们可以看到的对象,也有在表中产生查询结果集时的游标(Cursor)-这类不可见的对象。那么对象是如何产生的呢?哦,它是由类(CLASS)实例化产生的,许多AO类对我们来说很熟悉(象Point,Line,Polygon,Layer,Table,如果你对GIS还不是很陌生的话)。不用太多的废话,就先实际进入AO来展示下什么是类和对象吧。
Map Class
Properties Methods
MapScale (1:3,800,000) AddLayer (+)
MapUnits (6234233.32,5234234.56) ClearSelection
(很遗憾在这里我不能用图形来表达上述概念,突然觉得有些滑稽—在写一个GIS的话题)。
如果你用过ArcMap应用程序并且还有印象的话,你会发现这个MapScale其实就是应用程序中那个文本框的内容,而AddLayer这个方法呢好象就是那个用来增加图层的“+”的行为。
2.COM是什么?
(关于COM实在有太多的东西,以下的内容对AO的初始开发者而言,权当是一个了解吧,现在大可不必去深究)。
终于开始COM了,一个很沉重也很值得玩味的东西,我想许多AO的开发者对此都会有不同的感受。COM是Microsoft的Component Object Model缩写,它不仅定义了组件程序之间进行交互的标准,而且也提供了组件程序运行所需要的环境(COM本身要实现一个称为COM库(COM library)的API,它提供诸如客户对组件的查询,以及组件的注册/反注册等一系列服务,一般来说,COM库由操作系统加以实现,我们不必关心其实现的细节,象大家经常看到的ActiveX,DirectX,OLEDB都是基于COM技术的),主要应用于Microsoft Windows操作系统平台上。COM通常的发布形式是:以win32动态链接库(DLL)或可执行文件(EXE)的形式发布。
3.COM的目标和特性
建立在二进制代码级上的可重用性(通过包容和聚合);
语言无关性,只要其能生成符合COM规范即可;
对使用COM对象的客户程序而言的进程透明性;
4.对象、类和接口
对象是COM的基本要素之一,和C++中的对象不同的是其封装特性是真正意义上的封装,对于对象使用者(通常称为客户)而言是不可见的,此外,COM对象的可重用性表现在COM对象的包容和聚合,一个对象可以完全使用另一个对象的所有功能,而C++对象的可重用性表现在c++类的继承性。
接口是指组件对象的接口,它是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能,组件对象间的访问都是通过接口来进行的。接口设计必须满足:
1). 必须直接或间接地从IUNKNOWN接口继承(该接口在AO中是省缺的);
2). 接口必须有唯一的标识符号;接口不变性,一旦分配和公布了IID,接口定义的任何因素都不能改变。
用COM 开发意味着使用接口,也可以称为基于接口的设计模型。对象间的所有通信都是通过它们的接口来进行的,COM接口是抽象的,意味着相关的接口没有实现,和接口相关的代码来自于一个类实现。如何实现接口对于不同对象是不同的,因此对象只是继承接口的类型,而不是它的实现,这称为类型继承。功能用接口被抽象地构造,并且用类去真正实现。在COM中类和接口通常被当作‘做什么’和‘怎么做’,接口定义一个对象能做什么,类定义它怎么去做。
COM类提供了一个或多个接口相关的代码,因此功能实体封装在类中。几个类可以有同样的接口,但是它们的实现可能是极不相同的。通过实现这些接口,COM实现了面向对象的多态性,COM不支持多重继承概念,然而,这不是一个缺点因为一个类可以实现多个接口。
三. AO对象的使用
在第二章中我们谈到了许多关于COM的概念,象类,对象,接口,方法等,那么一个实际的AO开发中是如何体现这些COM概念的呢---既然AO是基于COM 的。在本节中,我将使用VB代码来说明如何使用AO的对象,并对如何阅读OMD(Object Model Diagram)进行介绍。
1.AO对象的使用
让我们直接用AO相关的代码来开始这段旅程吧,如果你觉得的是的话。:)
Dim pMap as IMap
Set pMap = New Map
PMap.name =”地图名称为-Tour”
…………………….
…………………….
Pmap.ClearLayers
Pmap.Clear //ERROR
如何运行这段代码是下一章的内容,先看看为什么代码会这么写吧,里面奥妙不少。
Dim pMap as Imap
我们知道在COM中对对象的访问是通过接口来完成,因此不能象许多可视化控件那样,可以直接通过其名称来调用属性或执行其方法。那么这句其实就是定义了一个接口变量(题外注释:其实准确地讲应该是一个指向接口的指针变量才对,好在VB把这一切都给演示了)。有了这个接口变量还不行,因为接口是定义在对象上的,那么下来的步骤应该是产生一个对象,而对象又是从那里来的呢---类。
于是就有了这样的代码Set pMap = New Map。
在这句中不单纯只是实例化出一个Map对象,并且将上句的pMap接口变量做为了该对象的缺省接口。OK,现在我们就可以通过这个接口来对地图名进行修改,或者调用ClearLayer方法来删除掉该地图中的所有图层了。再看看增加最后一句的执行情况—会出错,至于为什么,原因很简单,不同的接口中的方法或属性只能通过其接口来访问,而Clear方法属于Map类的另外一个接口IactiveView所有。可以通过查询接口(Query Interface)来’切换‘到IactiveView上。代码如下
Dim mView as IactiveView
set mview=pmap
mview.clear
2.OMD的作用
OMD(对象模型图)是基于OMT(Object Modeling Technique)的表示方法,先来看看OMD能帮我们做些什么?
1). 该类支持哪些接口;
2). 完成任务需要哪些对象;
3). 如何使用该类的对象;
4). 是否可以直接实例化类;
5). 接口有哪些方法和属性;
6). 是否有其它类也支持该接口;
7). 对象间的关系
3.OMD符号解释
在OMD 中有三类class,分别是抽象类(AbstractClass)、组件类(CoClass)和普通类(Class)。抽象类的主要目的是为它的子类定义公共接口,一个抽象类将把它的部分或全部实现延迟到子类中,因此,一个抽象类不能被实例化。一个组件类对象可以被直接创建,普通类对象虽然不能直接创建,但它可以可以作为其它类的一个属性或者从其它类的实例化来创建。AO中的Dataset或Geometry classes是抽象类的示例,一个Geometry类型对象不能被创建,但是一个Polyline可以被创建。这个Polyline对象实际上在类的基础上实现了Geometry中定义的接口,因此在基类对象中被定义的接口可以从coclass来访问。
在OMD中的关系类型主要有类型继承(Type inheritance)、创建(Instantiation)、组成(Composition)以及关联(Associations)等。类型继承我们在COM一章过提到过,实际上就是继承完全继承了超类的接口,这点可以利用AO对象浏览器工具清楚的看到,而组成关系指的是对象间的主次关系,也就是说主体的生命存在与否决定着次体的存在与否。
4.AO的组织划分
整个AO的OMD看起来密密麻麻,让人有些头晕眼花的感觉。还好,ESRI对整个AO进行了结构的组织分割,按照不同的应用领域可以找到相应的PDF格式的OMD。从AO开发帮助中我们可以发现划分为以下的几个子系统:
1). 3D Analyst Extension ---用于3D可视化和表面建模的组件对象;
2). Application Framework ---让开发者在ArcMap和ArcCatalong中通过程序来定制用户界面;
3). ArcCatalog --- 能够让开发者扩展数据对象模型并集成定制对象和视图到ArcCatalog应用框架中;.
4). ArcMap --- 提供了ArcMap应用程序的核心功能,用于操作和显示地图文档;
5). ArcMap Editor--- 包括了对象编辑器扩展组件对象,要做编辑开发来这吧;
6). Display --- GIS的一个重要应用就是数据表现,对国内的许多最终用户更是热衷于此,利用这里包含的对象可以完成诸如地图符号显示、图形编辑反馈轨迹、坐标转换和屏幕控制等功能;
7). Geocoding --- 主要用于创建和管理地理编码服务等;
8). Geodatabase--- AO开发中一个不可或缺,毕竟GIS的应用都是围绕数据展开的,所以有关的GIS数据创建、加载、管理和存储等都是通过这里的对象进行的;
9). Geometry--- 不管是要素还是图形,涉及到空间信息的获取和应用来这儿找吧;
10). IMS ---提供了连接到ArcIMS服务器并访问ArcIMS图象和要素服务的功能;
11). NetWork--- 提供了网络创建、管理和完成分析操作等功能,打算定制和开发特定网络应用可以利用NetWork对象;
12). OutPut ---有入就有出,如果想把制作好的地图输出怎么办,通过这里提供的对象来完成吧;
13). Raster --- 用于访问和管理栅格数据的的AO对象;
14). Spatial Reference--- 用于完成空间参考的设置;
15).StreetMap USA Extension---这个和国内的用户关系不大。
诚然,在AO的开发中对象的层次和相互关系是极其重要的,稍有撼缺的是OMD中的对象层次组织看起来有些纷乱,个人觉得《Exploring ArcObjects》里的对象模型图更适合入门使用-----它将一些常用和重要的对象抽取出来并以上下层次结构来表示。
四. AO开发
絮语闲聊,权当消遣- 最近抽时间整理一些以前写的程序,也开始了解MO(ESRI MapObject)的应用,有些感受一起吐出。在GIS应用中最大的工作就是数据的采集整理了,虽然你可以采用MO、MAPX等一些地图控件,如果你够超人,甚至可以自己去做一个地图控件,来完成一个实用性也很个性化的系统出来。可是它终究只是一个应用系统而已。???你应该知道我要讲什么的了吧。所有的应用都是基于一定的数据结构,你可以在自己的应用开发中定义数据模型,但是数据的来源呢。不是CAD,就是 COVERAGE,SHAPE,你可以针对一两种数据格式进行转换,只是现实中的数据类型是多样的,总不能都去写吧,况且你的数据格式能否得到认可呢。再想想看你要做多少工作---那是一个GIS平台才能完成的事情。这就是许多情形下我们为什么没法完全用底层或地图控件去写一个完整GIS系统主要的原因吧。
在本章中,会实现一个特定功能的DLL,用来说明AO开发的几种模式,AO工具包的使用,如何应用写好的组件。在ArcObjects Developer Help中有许多完整和详尽的示例代码,这儿主要想就方法做一个简要的说明。
1.选择一个开发模式
AO 可选的的开发方式可以分为两种,一种是在ArcMap应用框架基础上进行定制开发,另一种是脱离ArcMap应用框架去开发独立的应用程序。通常情况下,我们都是在ArcMap框架下进行定制开发。开发环境可以选择ArcMap本身自带的VBA,也可以选择VB、VC、DEPHI(AO 8.2以上的版本开始支持C#)。
2.选择一个开发工具
作为首选的是VB语言,这样不管是在VBA,还是编写COM组件,你都有最充足的资源可以使用(AO开发文档中最多的SAMPLE就是VB代码了)。第二种是VC(我更愿意将VC做为一个强有力的后备工具),第三种是DEPHI。
3.最简单的“Hello,world”程序
讨论开发工具多少有点离题,现在让我们来转回到一个出名的小应用程序—“Hello,world”,许多语言都是以此做为第一个应用的,我也就不例外了。
打开ArcMap应用程序,选择TOOLS菜单下的MACROS子菜单,打开其中的VBA环境。选择Project工程下的ArcMap Object ,双击打开其中的ThisDocument对象,在右边的编辑环境中选择对象列表中的MxDocument对象,在任务列表中选择 OpenDocumen,然后键入以下的代码:
//Private Function MxDocument_OpenDocument() As Boolean
Dim pmap As IMap
Set pmap = New Map
pmap.Name = "Hello,world"
MsgBox pmap.Name
//End Function
然后按CTRL+S保存后退出ArcMap。
VC开发AO,以 “Hello,world”来写一个组件并在ArcMap中来使用。
1). 启动VC,使用ATL COM AppWizard创建一个DLL工程;
2). 在INSERT菜单下选择NEW ATL OBJECT来增加一个ATL COM对象,
3). 给这个COM对象就起个“world”的名字吧,选择Custom接口类型
4). 在工作空间上选择Cworld类,并右键选择Implement Interface,在类型库中引入ESRI OBJECT Library,选择你要实现的接口(这儿我们选择Icommand)
5). 增加一个全局变量(IApplicationPtr m_ipApp;)来引用到一个应用程序。注意到没有,这儿的接口变量定义和VB的有什么不同,除了本身的语法。就是接口多了‘Ptr’。因此,在VC中如何使用AO的对象你现在应该猜到一些了吧。
6). 下面的工作就是实现接口了。看看Iworld接口中都有哪些东西,哦,这个OnClick()应该是我们想要做些事情的地方了。
// STDMETHODIMP CZoomIn::OnClick(){
IDocumentPtr ipDoc;
m_ipApp->get_Document(&ipDoc);
IMxDocumentPtr ipMxDoc(ipDoc);
IMapPtr ipmap;
ipMxDoc->get_FocusMap(&ipmap)
ipmap->put_Name(_bstr_t("Hello,world"));
…………
::MessageBox(NULL,_T("Hello World!"),_T("Wellcom AO"), MB_OK);
return S_OK;
}
7).编译连接工程;
8).在 ArcMap中注册后就可以将该按钮直接拖放到ArcMap中来使用了。(当你点击时,会弹出当前地图被修改后的名称----“Hello,world”。
4.AO程序实现的一般过程
不管是用VB还是VC或是其它,要做的第一步就是在集成环境因入AO对象库(Esricore.olb),剩下的工作在接口中实现你要做的事情。关于如何进入VB和VC开发的完整代码及说明,请参阅ArcObject Developer Help。
五.AO高级通用组件
可能是有感于独立AO应用程序开发群的迅速扩大,ESRI在其最新的ArcGIS8.2版本中不但继续提供对MapControl控件的开发支持,而且新增了一个PageLayoutControl控件,这对于有制图应用的开发者来说无疑带来了福音。许多时候可能会对组件和控件有些糊涂,其实Active X并不能代表整个COM,它只是COM对象的封装技术,由于COM对象使用的复杂性,因此才会创建框架(如Active X控件)来简化它。所以这两个控件也可称为AO高级通用组件,它由AO基础组件构造而成,面向通用功能,简化了用户开发过程,组件之间的协同控制消息都被封装起来。这级组件经过封装后,使二次开发更为简单。如一个简单的AO应用系统,若用基础AO组件对象开发,需要编写不少的代码,而利用高级通用组件,只需几句代码就够了。
1.MapControl控件
MapControl控件提供了类似ArcMap中的数据视图(Data View)的窗口,通过它你可完成以下甚至更多功能:
&O1548;显示图层地图。
&O1548;放大,缩小,漫游。
&O1548;生成图形元素,如点,线,圆,多边形。
&O1548;说明注记
&O1548;识别地图上被选中的元素,进行空间或属性查询。
&O1548;标注地图元素。
总之在ArcMap中能能够完成的大部分任务,通过MapControl控件也可以完成。通过设置MapControl General, Layers, Map 属性,你甚至不需要写一行代码可以获得一些GIS功能。关于MapControl控件有许多完整的应用示例,存放在//ArcObjects Developer Kit/Samples/Controls目录下。
2.PageLayout控件
PageLayout控件提供了类似ArcMap中的版面视图的窗口,它有以下的属性、方法和事件:
&S226; 管理控件的外观设置
&S226; 管理控件的显示属性
&S226; 管理页面属性
&S226; 在控件中增加和查找元素
&S226; 加载地图文档到控件
&S226; 可以直接从资源管理器和ArcCatalog中拖放数据到控件中
&S226; 打印页面设计.
至于它的功能嘛,ArcMap的Layout 视图能完成的工作,使用PageLayoutControl同样可以完成,象增加和设置图例、打印输出等许多功能。关于PageLayout控件有许多完整的应用示例,也存放在//ArcObjects Developer Kit/Samples/Controls目录下。
3.MapControl和MapObject的关系
确切地讲,MapControl和MapObject控件没有直接的联系。首先,MapControl控件是AO的一部分,至少到目前为止它还不是一个独立的产品,而MapObject是ESRI的一个独立的低端应用产品。第二,MapControl比MapObject功能要强大许多和完善许多, MapObject产品的定位就是提供一些基本的地图功能,高级的功能这得完全靠开发者自己去实现,而依托强大的AO组件库MapControl可以实现许多高级的GIS分析及应用。
-----------------------------------------
转帖来自http://www.cnblogs.com/kaixin110/archive/2008/05/29/1210159.html