2023年11月30日发(作者:)

ArcObject⼊门教程

arcobject说明

第⼀章了解ArcObjects

欢迎加⼊AOArcObjects的缩写)的世界!本节将把您引进AO的天地,并回答⼀些相关的问题,如:AO是什么,为什么AO

使得开发功能更加强⼤,如何学习和获取相关的资源信息。

1.1AO是什么?

AOESRI公司ArcGIS? 家族中应⽤程序ArcMap?, ArcCatalog? ArcScene?的开发平台,它是基于Microsoft? COM技术所

构建的⼀系列COM组件集。应该澄清的是到⽬前为⽌,AO还不是⼀个独⽴的应⽤产品, 是依附在你的ArcGIS DeskTop产品中

的软件开发包。也就是说,你购买了ArcGIS Desktop的任何⼀个产品,不管是ArcView还是ArcInfo,你都有了这套强⼤的AO

组件集,利⽤AO提供的组件对象来进⾏应⽤开发。

1.2AO的功能

通过AO你可完成以下甚⾄更多的GIS功能:

空间数据的显⽰、查询检索、编辑和分析;

创建各种专题图和统计报表;

⾼级的制图和输出功能;

空间数据管理和维护;

…………………………

等等。其实是ArcMapArcCatalogArcScene这三个应⽤程序都是由AO搭建起来的,因此从理论上讲这些应⽤程序能完成

的任务,通过AO同样可以完成(但重新搭建⼀个ArcMap式的应⽤程序先不考虑其代价,就可靠性和稳定性⽽⾔就值得怀疑,

在以后的内容⾥我会谈到这个问题)。我们现在绝⼤部分时候要做的---就是要利⽤ESRI提供的这些AO组件来进⾏积⽊式的组

装任务。 AO已经提供了许多底层的基本功能,⽽你的任务是按照应⽤需求将这些底层功能组装集合成⼀个更强⼤的COM

象。我们现在知道A O是基于微软的COM技术来构建的,因此它的开放性和扩展性很强⼤。这⼉的开放性是指在开发环境的选

择上可以有VBAVBV C++DEPHI等多种⽀持COM标准的开发⼯具,⽽扩展性是指AO组件没有提供的功能,如需要定

义⼀种新的数据格式,你就可以利⽤COM技术来写⾃⼰的COM组件,对AO组件库进⾏扩展补充。在ESRI的⽂挡中曾经看过

类似AO开发功能是没有限制的,这取决于你的想象⼒这样的话,是不是觉得有些很狂妄。喔,不要理解错啊,AO的确⾮

常强⼤,看看ArcMap给我们展现出来的功能就知道了。由于采⽤了COM技术,因此你不但可以在AO的基础上构造⾃⼰的

COM组件,⽽且可以⾃⼰来完成⼀个COM组件来对AO进⾏补充。⾄于为什么AO会基于COM技术,就我个⼈⽽⾔,⽬前和以

GIS的发展会和主流

IT技术融合的越来越紧密,毕竟任何⼀个软件产品最终是要拿来⽤的,所以除了提供专业的GIS功能外,从易⽤性和扩展性来

说也是极其重要的,⽽COM技术提供了⼀个解决之道。是不是有些罗嗦,强调其重要性的理由⽆⾮是在开始我

们对AO的开发前先需要您打针兴奋剂,虽然功能强⼤、使⽤⽅便的应⽤程序从来不是简单的⼏⾏代码和控件的拖来拖去就可

以搞定的,还需要您不断地学习和掌握更多的新的东西,但对于⼀个开发⼈员⽽⾔这些投⼊是值得的,对于尝试利⽤AO做开

发的⼈员也是如此。那我们还不开始吗?

1.3需要的技术基础

如何进⼊AO软件的领域开发?对于⾼级的AO程序设计⼈员我想必须跨越四⼤技术障碍:

1.⾯向对象技术思想;

2COM技术;

3AO各组件对象的层次组织和相互关系;

4.⽀持COM的各种开发⼯具及其环境(如VBVCDEPHI等)

真正属于ESRI⾃⼰的东西⽆⾮就是这套AO组件库。对于初次进⼊AO开发领域的⼈员来说,我个⼈觉得(⾄于COM还有其它

暂时可以先放⼀边,照猫画虎完成许多任务还是没有问题的了)可以先从ArcGIS Desktop的应⽤开始,对AO 的层次及相关概

念有⼀个了解(如MapLayerViewLabel、⽀持的数据格式等),否则等看到AO的⽰例时可能会⼀下⼦云⾥雾⾥,两厢

印证我觉得最有可能豁然贯通吧。

1.4AO开发⼯具包

AO开发⼯具包的安装可以选择在安装ArcGIS Desktop时,也可以任何时候使⽤安装光盘下的ArcGISArcObjects Developer

Kit⽬录下的⽂件进⾏安装。下⾯是AO开发包安装完成后的⽬录结构:

Arcobjects Developer Kit

Help --- 包含开发帮助⽂件:,

Kits --- 附加的开发者素材诸如投影引擎头⽂件,类别ID⽂件和ESRI ⽰例命令的源代码(在最新的8.2版本中,该代码位置有

所变化)

Object Model Diagrams --- 包括所有的PDF格式对象模型图

Samples --- 包含所有⽰例⼯程⽂件的源代码

Utilities --- 包含ESRI 对象浏览器等⼯具

1.5AO开发资源

1.《ArcObjects Developer Help ----- 这是AO开发的⾸选资源,个⼈觉得⼀定程度上甚⾄可以和微软的MSDN相媲美。不

管是AO的基础COMAO的对象层次图都提供了说明,此外还提供了⼤量的开发⽰例。

2.《ArcObjects Online ----- 提供了最新的AO组件库⽂档,其中有⼀个关于AO的技术论坛相信会让⼤家有很多意外的收

获;

3.《Exploring ArcObjects -----⼀本很不错的AO技术⽂档,对AO的开发进⾏了很好的组织,⽽且有⼤量的⽰例,可以随时

复制利⽤;

4.《Building a Geodatabase -----应⽤都是围绕数据来展开的,这本书主要是⽤来设计和创建Geodatabase的,但理解和

掌握Geodatabas e的层次和建

摸⽅法,对AO的开发是很好的补充。

5.《Microsoft MSDN----即使你的AO开发⼯具不是微软的,也建议安装⼀套完整的MSDN,想多了解和应⽤COM进⾏设计

开发,MSD N是个宝藏。

第⼆章 AO的基础-----COM

组件化程序设计思想在今天应⽤已经⾮常普及,那么关于COM都有哪些东西呢?在本节中我会介绍什么是

CLASSOBJECTINTERFACECOM等相关概念。

2.1CLASS AND OBJECT(类和对象)

要介绍COM,就不能不提到⾯向对象思想,那么让我们先来看看什么是对象吧?在⽇常⽣活中,你我都是⼀个个对象,有姓

名,有⾝⾼、体重等外在的特征,也有各⾃所具备的⼯作技能,也需要彼此间进⾏语⾔交流,同样在开发应⽤和GIS中也有对

象的概念存在。

你在窗体上使⽤了⼀个控件,这个控件本⾝有⼤⼩、位置、颜⾊、名称等⼀系列称之为属性(Properties)的外在表⽰,⽽且

也会有CLICK等称之为事件(Events)的通信动作存在。在AO的世界⾥,每个东西都是⼀个对象,有象MapForm Layer

这些我们可以看到的对象,也有在表中产⽣查询结果集时的游标(Cursor-这类不可见的对象。那么对象是如何产⽣的呢?

哦,它是由类(CLASS)实例化产⽣的,许多AO类对我们来说很熟悉(象

Point,Line,Polygon,Lay er,Table,如果你对GIS还不是很陌⽣的话)。不⽤太多的废话,就先实际进⼊AO来展⽰下什么是类和

对象吧。

Map Class

Properties Methods

MapScale (1:3,800,000) AddLayer (+)

MapUnits (6234233.32,5234234.56) ClearSelection

(很遗憾在这⾥我不能⽤图形来表达上述概念,突然觉得有些滑稽在写⼀个GIS的话题)。

如果你⽤过ArcMap应⽤程序并且还有印象的话,你会发现这个MapScale其实就是应⽤程序中那个⽂本框的内容,⽽Add

Layer这个⽅法呢好象就是那个⽤来增加图层的“+”的⾏为。

2.2COM是什么?

(关于COM实在有太多的东西,以下的内容对AO的初始开发者⽽⾔,权当是⼀个了解吧,现在⼤可不必去深究)。

终于开始COM了,⼀个很沉重也很值得玩味的东西,我想许多AO的开发者对此都会有不同的感受。COMMicrosoftC

omponent Object Model缩写,它不仅定义了组件程序之间进⾏交互的标准,⽽且也提供了组件程序运⾏所需要的环境(COM

本⾝要实现⼀个称为C OM(COM library)API,它提供诸如客户对组件的查询,以及组件的注册/反注册等⼀系列服务,⼀

般来说,COM库由操作系统加以实现,我们不必关⼼其实现的细节,象⼤家经常看到的ActiveX

DirectX,OLEDB都是基于COM技术的),主要应⽤于Microsoft Windows操作系统平台上。COM通常的发布形式是:以win32

动态链接库(DLL)或可执⾏⽂件(EXE)的形式发布。

2.3COM的⽬标和特性

建⽴在⼆进制代码级上的可重⽤性(通过包容和聚合);

语⾔⽆关性,只要其能⽣成符合COM规范即可;

对使⽤COM对象的客户程序⽽⾔的进程透明性;

2.4对象、类和接⼝

对象是COM的基本要素之⼀,和C++中的对象不同的是其封装特性是真正意义上的封装,对于对象使⽤者(通常称为客户)

⽽⾔是不可见的,此外,COM对象的可重⽤性表现在COM对象的包容和聚合,⼀个对象可以完全使⽤另⼀个对象的所有功

能,⽽C++对象的可重⽤性表现在c++类的继承性。

接⼝是指组件对象的接⼝,它是包含了⼀组函数的数据结构,通过这组数据结构,客户代码可以调⽤组件对象的功能,组件对

象间的访问都是通过接⼝来进⾏的。接⼝设计必须满⾜:

1.必须直接或间接地从IUNKNOWN接⼝继承(该接⼝在AO中是省缺的);2.接⼝必须有唯⼀的标识符号;接⼝不变性,

⼀旦分配和公布了IID,接⼝定义的任何因素都不能改变。

COM开发意味着使⽤接⼝,也可以称为基于接⼝的设计模型。对象间的所有通信都是通过它们的接⼝来进⾏的,COM接⼝

是抽象的,意味着相关的接⼝没有实现,和接⼝相关的代码来⾃于⼀个类实现。如何实现接⼝对于不同对象是不同的,因此对

象只是继承接⼝的类型,⽽不是它的实现,这称为类型继承。功能⽤接⼝被抽象地构造,并且⽤类去真正实现。在COM中类

和接⼝通常被当作做什么怎么做,接⼝定义⼀个对象能做什么,类定义它怎么去做。

COM类提供了⼀个或多个接⼝相关的代码,因此功能实体封装在类中。⼏个类可以有同样的接⼝,但是它们的实现可能是极

不相同的。通过实现这些接⼝,COM 实现了⾯向对象的多态性,COM不⽀持多重继承概念,然⽽,这不是⼀个缺点因为⼀个

类可以实现多个接⼝。

2.5COM的其它组成

COM对象的接⼝可以是双接⼝,双接⼝不同于普通接⼝(Custom Interface)之处在于双接⼝是从Automation基本接⼝

Idispatch继承的,⽽普通接⼝是从Iunknow n接⼝直接继承来的,缺省的接⼝模型是双接⼝模型是双接⼝。

2.⼊接⼝和出接⼝(Inbound interface,Outbound interface)

COM调⽤既可以是单向的(即客户程序创建组件对象,然后客户程序调⽤对象所提供的功能,在适当时候再把对象释放

掉),通常称为⼊接⼝。如果⼀个COM 对象⽀持⼀个或多个主动与客户程序进⾏通信的接⼝,则这种接⼝称为出接⼝,

是因为这些接⼝并不由对象实现,⽽是由客户程序实现。类型库(Type Library) ⼀个类型库被作为⼀个接⼝定义语⾔(IDL)⽂

件的⼆进制版本,是⼀系列COM 对象和接⼝的集合,并被编译进⼀个形如OLBD LLOCX这样的⼆进制⽂件中。为了⽀持

⼀个不依赖于开发语⾔⼯具的组件集,关于ArcObjects库所有相关的数据都被打包进的类型库,它就包括了⼀个

所有coclasses的⼆进制描述,接⼝,⽅法和服务器类型。

Microsoft提供了多个COM接⼝⽤于类型库,这两个接⼝是ITypeInfo ItypeLib。利⽤标准的COM接⼝,不同的开发⼯具和编

译器能够获得由⼀个特定库⽀持的coclasses和接⼝有关信息。

4.双向COM⽀持是指有可能既在⼀种语⾔中使⽤COM对象,⼜可使⽤这种语⾔编写COM对象;

5.进程内COM、本地COM和远程COM

COM是⼀个客户/服务器体系,服务器(或对象)提供功能,并且客户程序使⽤这些功能。如果COM程序和客户程序在同⼀

进程地址空间内,则称之为进程内COM,这通常是以DLL形式实现,⽽本地COM是指同⼀计算机上不同进程中的EXE,远程

COM则是指不同计算机中的DLLEXE。有不耐烦或现在回过头看这章⽽且存有疑问的⼈吗?讲了那么多COM AND COM

那么我在DEPHIVB下⽤AO写⼀个DLL,这个DLL到底算什么呢?好,就让我来⽤C/S的概念来做⼀个解释。如果你是⾃⼰

写的应⽤程序框架,那么你的应⽤程序就是客户端,⽽调⽤的DLL 其实就是服务器了;如果你在ArcMap中,那么Ar cMap

⽤程序其实就充当了客户端的⾓⾊发出请求,这个请求通过COM机制传递给COM服务器那个你写的DLL来完成相应的功

能,⽽这个服务器外部和内部就是由ESRI AO的接⼝及类来完成的。

第三章 AO对象的使⽤

在第⼆章中我们谈到了许多关于COM的概念,象类,对象,接⼝,⽅法等,那么⼀个实际的AO开发中是如何体现这些COM

概念的呢 ---既然AO是基于COM的。在本节中,我将使⽤VB代码来说明如何使⽤AO的对象,并对如何阅读OMD Object

Model Diagram)进⾏介绍。

3.1AO对象的使⽤

让我们直接⽤AO相关的代码来开始这段旅程吧,如果你觉得的是的话。:)Dim pMap as IMap

Set pMap = New Map

/doc/

=”地图名称为-Tour”

…………………….

…………………….

ayers

//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

3.2OMD的作⽤

OMD(对象模型图)是基于OMTObject Modeling Technique)的表⽰⽅法,先来看看OMD能帮我们做些什么?

1.该类⽀持哪些接⼝;

2.完成任务需要哪些对象;

3.如何使⽤该类的对象;

4.是否可以直接实例化类;

5.接⼝有哪些⽅法和属性;

6.是否有其它类也⽀持该接⼝;

7.对象间的关系

3.3OMD符号解释

OMD中有三类class,分别是抽象类(AbstractClass)、组件类(CoClass)和普通类(Class)。抽象类的主要⽬的是为它

的⼦类定义公共接⼝,⼀个抽象类将把它的部分或全部实现延迟到⼦类中,因此,⼀个抽象类不能被实例化。⼀个组件类对象

可以被直接创建,普通类对象虽然不能直接创建,但它可以可以作为其它类的⼀个属性或者从其它类的实例化来创建。AO

DatasetGeometry classes是抽象类的⽰例,⼀个Geometry类型对象不能被创建,但是⼀个Polyline可以被创建。这个

Polyl ine对象实际上在类的基础上实现了Geometry中定义的接⼝,因此在基类对象中被定义的接⼝可以从coclass来访问。

OMD中的关系类型主要有类型继承(Type inheritance)、创建(Instantiation)、组成(Composition)以及关联

Associati ons)等。类型继承我们在COM⼀章过提到过,实际上就是继承完全继承了超类的接⼝,这点可以利⽤AO对象浏

览器⼯具清楚的看到,⽽组成关系指的是对象间的主次关系,也就是说主体的⽣命存在与否决定着次体的存在与否。

3.4AO的组织划分

整个AOOMD看起来密密⿇⿇,让⼈有些头晕眼花的感觉。还好,ESRI对整个AO进⾏了结构的组织分割,按照不同的应⽤

领域可以找到相应的PDF格式的OMD。从AO开发帮助中我们可以发现划分为以下的⼏个⼦系统:

1 3D Analyst Extension ---⽤于3D可视化和表⾯建模的组件对象;

2 Application Framework ---让开发者在ArcMapArcCatalong中通过程序来定制⽤户界⾯;

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--- ⽤于完成空间参考的设置;

15StreetMap USA Extension---这个和国内的⽤户关系不⼤。

诚然,在AO的开发中对象的层次和相互关系是极其重要的,稍有撼缺的是OMD 中的对象层次组织看起来有些纷乱,个⼈觉得

Exp loring ArcObjects》⾥的对象模型图更适合⼊门使⽤-----它将⼀些常⽤和重要的对象抽取出来并以上下层次结构来表

⽰。

第四章 AO开发

絮语闲聊,权当消遣- 最近抽时间整理⼀些以前写的程序,也开始了解MOESRI MapObject)的应⽤,有些感受⼀起吐出。

GIS应⽤中最⼤的⼯作就是数据的采集整理了,虽然你可以采⽤MOMAPX 等⼀些地图控件(我曾经还看到过⼀个南⾮⼈

DEPHI写的地图控件,也是很有些特点的),如果你够超⼈,甚⾄可以⾃⼰去做⼀个地图控件,来完成⼀个实⽤性也很个

性化的系统出来。可是它终究只是⼀个应⽤系统⽽已。你应该知道我要讲什么的了吧。所有的应⽤都是基于⼀定的数据

结构,你可以在⾃⼰的应⽤开发中定义数据模型,但是数据的来源呢。不是CAD,就是COVERAGESHAPE,(标准嘛)

你可以针对⼀两种数据格式进⾏转换,只是现实中的数据类型是多样的,总不能都去写吧,况且你的数据格式能否得到认可

呢。再想想看你要做多少⼯作---那是⼀个GIS平台才能完成的事情。这就是许多情形下我们为什么没法完全⽤底层或地图控件

去写⼀个完整GIS系统主要的原因吧。

扯远了。。。在本章中,我会实现⼀个特定功能的DLL,⽤来说明AO开发的⼏种模式,AO⼯具包的使⽤,如何应⽤写好的组

件。在 ArcObjects Developer Help 中有许多完整和详尽的⽰例代码,这⼉主要想就⽅法做⼀个简要的说明。

4.1选择⼀个开发模式

AO可选的的开发⽅式可以分为两种,⼀种是在ArcMap应⽤框架基础上进⾏定制开发,另⼀种是脱离ArcMap应⽤框架去开发

独⽴的应⽤程序。通常情况下,我们都是在ArcMap框架下进⾏定制开发。开发环境可以选择ArcMap本⾝⾃带的VBA,也可以

选择VBVCDEPHIAO 8.2以上的版本开始⽀持C#)。

4.2选择⼀个开发⼯具

作为⾸选的是VB语⾔,这样不管是在VBA,还是编写COM组件,你都有最充⾜的资源可以使⽤(AO开发⽂档中最多的

SAMPLE就是VB代码了)。第⼆种是VC (我更愿意将VC做为⼀个强有⼒的后备⼯具),第三种在我看来应该是⼀种⽆奈之

举了,即⽤DE PHI(有⼀堆⼈该贬我了:)⼀直对DEPHI是仰慕有加⼼仪已久的,只是在AO中有关DEPHI的例⼦太少了,

这对快速应⽤开发来说是致命的)。

4.3最简单的“Helloworld”程序

讨论开发⼯具多少有点离题,现在让我们来转回到⼀个出名的⼩应⽤程序—“Hello,world”,许多语⾔都是以此做为第⼀个应⽤

的,我也就不例外了。

打开ArcMap应⽤程序,选择TOOLS菜单下的MACROS⼦菜单,打开其中的VBA

环境。选择Project⼯程下的ArcMap Object ,双击打开其中的ThisDocument

对象,在右边的编辑环境中选择对象列表中的MxDocument对象,在任务列表中选择OpenDocument,然后键⼊以下的代码:

//Private Function MxDocument_OpenDocument() As Boolean

Dim pmap As IMap

Set pmap = New Map

/doc/

= "Hello,world"

MsgBox /doc/

//End Function

然后按CTRL+S保存后退出ArcMap。当你再次打开你所保存的⼯程⽂档时看到了什么?呵呵呵,不知道ESRI的设计⼈员看到

这样的⼀个SAMPLE会不会晕掉。有⼈说了,你这⼀堆VB代码对我来说我搞不懂啊,我熟悉的是VC,总不能让我先去学VB

再来做AO开发吧。OK,没关系,下⾯我就以这个“Helloworld”来写⼀个组件并在ArcMap中来使⽤。

1.启动VC,使⽤ATL COM AppWizard创建⼀个DLL⼯程;

2.在INSERT菜单下选择NEW ATL OBJECT来增加⼀个ATL COM对象,

3.给这个COM对象就起个“world”的名字吧,选择Custom接⼝类型(⾄于为什么不选择DUAL,你可以琢磨下)

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.4AO程序实现的⼀般过程

不管是⽤VB还是VC或是其它,要做的第⼀步就是在集成环境因⼊AO对象库(),剩下的⼯作在接⼝中实现你要

做的事情。关于如何进⼊VB VC开发的完整代码及说明,请参阅ArcObject Developer Help

第五章 AO⾼级通⽤组件

可能是有感于独⽴AO应⽤程序开发群的迅速扩⼤,ESRI在其最新的ArcGIS8.2

版本中不但继续提供对MapContro l控件的开发⽀持,⽽且新增了⼀个PageLayoutControl控件,这对于有制图应⽤的开发者

来说⽆疑带来了福⾳。许多时候可能会对组件和控件有些糊涂,其实Active X并不能代表整个COM,它只是COM对象的封装

技术,由于COM对象使⽤的复杂性,因此才会创建框架(如Active X控件)来简化它。所以这两个控件也可称为AO⾼级通⽤

组件,它由AO 基础组件构造⽽成,⾯向通⽤功能,简化了⽤户开发过程,组件之间的协同控制消息都被封装起来。这级组件

经过封装后,使⼆次开发更为简单。如⼀个简单的AO应⽤系统,若⽤基础AO组件对象开发,需要编写不少的代码,⽽利⽤⾼

级通⽤组件,只需⼏句代码就够了。

5.1MapControl控件

MapControl控件提供了类似ArcMap中的数据视图(Data View)的窗⼝,通过它你可完成以下甚⾄更多功能:

* 显⽰图层地图。

* 放⼤,缩⼩,漫游。

* ⽣成图形元素,如点,线,圆,多边形。

* 说明注记

* 识别地图上被选中的元素,进⾏空间或属性查询。

* 标注地图元素。

总之在ArcMap中能能够完成的⼤部分任务,通过MapControl控件也可以完成。通过设置MapControl General, Layers, Map

性,你甚⾄不需要写⼀⾏代码可以获得⼀些GIS功能。关于MapControl控件有许多完整的应⽤⽰例,存放在ArcObjects

Developer KitSamplesControls⽬录下。

5.2PageLayout控件

PageLayout控件提供了类似ArcMap中的版⾯视图的窗⼝,它有以下的属性、⽅法和事件:

* 管理控件的外观设置

* 管理控件的显⽰属性

* 管理页⾯属性

* 在控件中增加和查找元素

* 加载地图⽂档到控件

* 可以直接从资源管理器和ArcCatalog中拖放数据到控件中

* 打印页⾯设计.

⾄于它的功能嘛,ArcMapLayout 视图能完成的⼯作,使⽤PageLayoutControl 同样可以完成,象增加和设置图例、打印输

出等许多功能。关于Page Layout

控件有许多完整的应⽤⽰例,也存放在ArcObjects Developer

KitSamplesControls⽬录下。

5.3MapControlMapObject的关系

确切地讲,MapControlMapObject控件没有直接的联系。⾸先,MapControl 控件是AO的⼀部分,⾄少到⽬前为⽌它还不是

⼀个独⽴的产品,⽽MapObject ESRI的⼀个独⽴的低端应⽤产品。第⼆,MapControlM apObject功能要强⼤许多和完善

许多,MapObject产品的定位就是提供⼀些基本的地图功能,⾼级的功能这得完全靠开发者⾃⼰去实现,⽽依托强⼤的AO

件库MapControl 可以实现许多⾼级的GIS分析及应⽤。

Tagsarcobject,ps⼊门教程,photoshop⼊门教程