1、ArcObjects开发,主要内容,一.ArcGIS体系结构 1.1ArcGIS数据格式 1.2ArcGIS体系构成 二.ArcObjects开发 2.1ArcObjects简介 2.2AO应用程序接口 2.3COM简介 2.4AO开发实例(以VC+6.0为例) 2.5AO开发方法探讨,一.ArcGIS体系结构,1.1ArcGIS数据 Arcgis的GIS数据主要有shapefile格式,coverage格式,geodatabase格式(数据模型)。 shapefile,coverage采用文件系统存储GIS数据。,Geodatabase是ArcInfo 8引入的一个全新的空间数据模型,是建立
2、在DBMS之上的统一的、智能化的空间数据库。所谓“统一”,在于Geodatabase之前所有的空间数据模型都不能在一个同一的模型框架下对GIS通常所处理和表达的地理空间要素,如:矢量、栅格、三维表面、网络、地址等,进行统一的描述。,所谓“智能化”,是指在Geodatabase模型中,地理空间要素的表达较之以往的模型更接近于我们对现实事物对象的认识和表述方式。Geodatabase中引入了地理空间要素的行为、规则和关系,当处理Geodatabase中的要素时,对其基本的行为和必须满足的规则,我们无需通过程序编码;对其特殊的行为和规则,则可以通过要素扩展进行客户化定义。这是其它任何空间数据模型都做
3、不到的。而ArcSDE正是用GeoDatabase的数据模型将海量的空间数据存储于商用的大型关系数据库中,GeoDatabase的体系结构(常用): (1)对象类(Object class) 在Geodatabase中,对象类是一种特殊的类,它没有空间特征,其实例为可关联某种特定行为的表记录(Row in table)。如:某块地的主人。在“地块”和“主人”之间,可以定义某种关系。,(2)要素类(Feature class) 同类空间要素的集合即为要素类。如:河流、道路、植被、用地、电缆等。要素类之间可以独立存在,也可具有某种关系。当不同的要素类之间存在关系时,我们将其组织到一个要素数据集(F
4、eature dataset)中。,(3) 要素数据集(Feature dataset)要素数据集由一组具有相同空间参考(Spatial Reference)的要素类组成。 (4)关系类(Relationship class) 定义两个不同的要素类或对象类之间的关联关系。例如:我们可以定义房主和房子之间的关系,房子和地块之间的关系等。,(5)Raster Datasets用于存放栅格数据。可以支持海量栅格数据,支持影像镶嵌,可通过建立“金字塔”索引,并在使用时指定可视范围提高检索和显示效率。 (6)TIN DatasetsTIN是ARC/INFO非常经典的数据模型,用不规则分布的采样点的采样值
5、(通常是高程值,也可以是任意其它类型的值)构成的不规则三角集合。用于表达地表形状或其它类型的空间连续分布特征。在ArcGIS 8.1版中,TIN存放在Coverage的workspace中。,Geodatabase的实现方式主要有两种: (1)Accesss数据库 (2)ArcSDE图层,Acess数据库:,SDE图层: (1)图层:ArcSDE将具有共同属性项的地理要素归为一个图层。例如,可以将不同图幅的等高线存放在一个线状要素层中,每个数据库记录对应一条等高线,这样有利于地理要素的存储与管理。逻辑上,一个图层包含描述空间和属性信息的表。空间数据存储在要素表中,一个包含空间列的表被称为业务表
6、(business table),业务表与要素表以及空间索引表的集合组成一个ArcSDE图层。,(2)业务表:在现有的数据库表中加入图形数据项(shape column)(即增加一个空间列),供软件管理和访问与其关联的空间数据,就构成了一张业务表。一张业务表包括一个空间列和多个属性表,空间列是联系要素表和空间索引表的键值。在业务表中对应于空间列的每一行的存储值被称为一个shape。在业务表的非空间数据列可以存储shape的属性。一个shape及其属性可以组成一个ArcSDE要素。要素可以有另外的属性,当通过一个SQL连接语句从ArcSDE图层中获取要素时,就可以访问这些属性。,(3)ArcSD
7、E的数据模式:ArcSDE采用连续的数据模型,也就是说它可将整个城市的宗地数据放到一个连续的层中。每一个宗地地块作为一个完整的多边形存放,它只需一次磁盘的访问即可快速提取出来。ArcSDE为数据库中各层的所有要素都建立了空间索引,实现途径是将层从逻辑上分成一个个小块,称为”cell”,层中的要素则分解到各cell中加以描述,并将此描述信息写到索引表中。落到每个cell上的要素,将在每个cell对应的索引记录中加以描述,没有数据的cell不包括在索引表中。,(4)ArcSDE的数据存储:缺省情况下,ArcSDE使用压缩的二进制格式来存储要素的集合图形,从而可以有效的提高存储和检索空间数据的效率。
8、一个压缩的二进制要素类有由三个数据表组成:业务表,要素表,空间索引表,它们之间通过空间列和FID利发生关系。,业务表: 存放属性数据,要素表:存放集合信息,空间索引表:存放GridFile,1.2ArcGIS体系构成,ArcGIS Desktop: An integrated, scalable suite of software for compiling, authoring,analyzing, mapping, and publishing geographic information and knowledge. ArcGIS Desktop starts with ArcReade
9、r and extends to include ArcView, ArcEditor, and ArcInfo, each component exposing more GIS capabilities. Additional desktop extensions expand GIS capabilities further.,arcgis desktop产品子模块:ArcMap,ArcCatalog,ArcGlobe,ArcScene,ArcToolBox。 ArcMap:主要是查看GIS数据,编辑GIS数据,地图输出等功能。在ArcMap添加GIS数据后可以保存为一个mxd后缀名的文
10、档,它记录的是当前文档打开的数据的“引用“,记录添加的数据存储的位置等,还保存每个图层的symbol,地图输出的布局,添加的Elements等信息,但是它不包含实际的空间信息。,ArcCatalog:类似于windows的资源管理器,可以进行GIS数据的创建,比如新建一个GEODATABASE,在GEODATABASE中新建图层等,还有很多其它的功能。 ArcToolBox:它没有自己的窗体界面,可以作为ArcMap或者ArcCatalog的一个浮动工具条而存在,但是它的功能是不容小视的。可以进行不同格式数据的装换,各式各样的空间分析。 关于桌面产品的详细说明可以参考安装桌面软件以后的desk
11、top help和pdf文档(using arcmap,using arccatalog etc)。 其它的3D扩展模块的功能可以参考帮助。,Embedded GIS: Use ArcGIS Engine to develop custom desktop GIS applications or embed GIS functionality in existing applications. These focused solutions can then be easily deployed throughout an organization.,ArcObjects开发 仔细看上图,有三
12、个红色的椭圆标注了三个开发形式的名称:The ArcGIS Desktop Developer Kit,The ArcGIS Engine Developer Kit,The ArcGIS Server Developer Kit。它们都是基于AO的组件集,可以把AO比作积木中的最小的元素,我们可以用它们构造一个房子(就是应用程序)。 AO组件比作原材料(水泥,木材,钢筋) 开发包比作半成品(做好的窗户,门,大块的砖) 应用程序比作房子 用户要盖一个房子就比较的方便了,不用自己做门窗等,只要把它们合理的组合起来就可以了。,这就涉及到组件的一个“粒度”大小的问题,比如AO组件是最原始的建筑材料,
13、那么你会提供什么粒度大小的东西给程序员进行二次开发呢?是做好的门窗,墙壁砖,还是一个个的小房子,只要进行合理的组合就是一套别墅?后者的粒度肯定是比前者大了!ESRI提供的应该是门窗大小粒度的,粒度越小,给开发者自由发挥的余地就越是大,但是开发难度就越大!,The ArcGIS Desktop Developer Kit:在desktop软件的基础上添加功能。好比用户不满意ESRI提供的房子,觉得不适合自己的口味,这样用户可以定制自己的功能,所有的功能都可以在以前房子的基础上完成。,The ArcGIS Engine Developer Kit和The ArcGIS Server Develop
14、er Kit:用户买不起房子或者是觉得买那个房子不划算,因为那个房子的很多设施用户不想购买,可以!那用户可以购买ESRI提供的建筑材料自己盖房子。,ArcGIS组件构成图,二.AO开发,2.1ArcObjects简介 所有ArcGIS产品都是由ArcObjects组成. ArcObjects都是C+对象. 通过不同的应用程序接口(API)来进行调用 本身就是COM组成.,2.2AO应用程序接口 ArcObjects的功能可以通过四个应用程序接口(APIs)来访问。选择使用哪个API并不是一个简单的问题,而要取决于许多因素,包括:要开发的ArcGIS产品、要开发的最终用户功能以及使用特定开发语言
15、的经验。ArcGIS Engine支持的四种API是:,COM任何COM生成语言(Visual Basic、Visual C+、Delphi等)都可以使用这个API。 .NET这个API支持Visual Basic.NET和C。 JavaSun公司的 Java2平台标准编辑器。(Desktop不支持)C+ 微软VC+6.0 、微软VC+.NET2003 、Sun Solaris Forte6 Update2、Linux GCC3.2支持此API。,四个APIs全都支持使用ArcObjects的功能,但是,并不是所有ArcObjects实现的接口都在所有平台上支持。有些情况下,接口使用的数据类型
16、与某种API不兼容。在这种情况下,提供了接口的其他实现以便开发者使用。 COM和.NET APIs 只在微软Windows平台上被支持,而Java和C+ APIs可以在ArcGIS Engine支持的所有平台上都支持。,2.3COM ArcObjects基于微软组件对象模型(COM)之上。ArcGIS应用程序的最终用户不必理解COM,但打算基于AO开发应用程序或使用AO扩展已有ArcGIS应用程序的开发者必须理解COM,即使打算用C+、Java、.Net APIs而不是用COM开发也要理解COM。需要理解的层次取决于定制和开发的深度。至少需要浏览组件对象模型和使用ArcObjects开发部分,
17、然后继续所选的特定API部分。,为了理解COM(以及所有基于COM的技术),认识到其不是一种面向对象语言而是一个协议或标准是非常重要的。COM不仅仅是一种技术,还是软件开发的一种方法论。COM定义了一种连接软件组件或模型的协议。通过使用这种协议,可以建立能在分布式系统中动态交互的可重用软件组件。,COM还定义了一种称作基于接口的编程模式。对象封装了能体现定义良好的接口后每个实例化对象特征的操作方法和数据。这增强了系统开发的结构化和安全性,因为一个对象的客户并不知道某个特定方法如何实现的任何细节。COM不规定应如何构建一个应用程序。语言、结构和实现细节都由使用COM的应用程序开发人员决定。,在A
18、rcGIS应用程序中,许多对象通过其接口提供了几千个属性和方法。当使用ESRI对象库时,可以假定所有这些属性和方法是完全实现了的,如果它们列在对象图中,就可以使用它们。 使用COM开发就意味着用接口开发,即所谓的基于接口的编程模式。对象间的所有通信都是通过其接口实现的。COM接口是抽象的,意味着没有与接口相关联的实现;与接口关联的代码都来自类的实现。接口规定了对选择用于实现接口的对象可以作什么请求。,左边的模型图解释了在实现接口时COM类中展现的多态行为。注意Human和Parrot类都实现了ITalk接口。ITalk接口定义了一些方法和属性,如StartTalking、StopTalking
19、、Language等,但显然这两个类的实现是不同的。,ArcObjects中开发者必须理解的类有三种类型:抽象类(abstract Classes)、组件对象类(coclasses)和类(classes)。抽象类不能创建对象,只是对其子类的实例化进行了规定(通过类型继承)。ArcObjects的Dataset或Geometry类就是抽象类的例子。不能创建Geometry类型的对象,但可以创建Polyline类型的对象。Polyline对象实现了在Geometry基类中定义的接口,因此在基于对象类中定义的任何接口都可以从组件对象类访问。,对象,类和接口 对象是COM的基本要素之一,和C+中的对象
20、不同的是其封装特性是真正意义上的封装,对于对象使用者(通常称为客户)而言是不 可见的,此外,COM对象的可重用性表现在COM对象的包容和聚合,一个对象可以完全使用另一个对象的所有功能,而C+对象的 可重用性表现在c+类的继承性。 接口是指组件对象的接口,它是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能,组件对象间的访问 都是通过接口来进行的。,1 接口不是类。接口不能实例化自身,因为其上没有实现。 2 接口不是对象。接口是一个相关功能组,是客户和对象之间通信的二进制标准。 3 接口具有很强的类型性。每个接口都有自己的接口标识符,因此消除了具有人们易读相同名字接口间
21、可能的冲突。 4 接口是不变的。接口从来没有版本。一旦接口被定义和公布就不能改变。,1500多个类(分成多个逻辑子集) 1600多个接口,对象模型图有什么用?,这个类支持哪些接口?要完成某项工作需要用到哪些对象?如何引用这个类的一个对象?,这个接口上有哪些方法和属性?这个接口有隐藏的方法和属性吗?有其它类支持这个接口吗?,2.4AO C+API应用实例。 (1)新建一个MFC项目。 (2)打开上一节所建项目。选择菜单Tools-Options-Directories页在Include files里添加两个路径(如果你的ArcGIS的安装目录在其它盘,需做相应改动:C:PROGRAM FILES
22、ARCGISCOM C:PROGRAM FILESARCGISBIN,(3)在项目的StdAfx.h中添加如下代码(AO引入库): #pragma warning(push) . #pragma warning(pop),(4)加入MapControl控件。MapControl控件提供了类似ArcMap中的数据视图(Data View)的窗口,通过它你可完成以下甚至更多功能: 显示图层地图。放大,缩小,漫游。生成图形元素,如点,线,圆,多边形。说明注记。识别地图上被选中的元素,进行空间或属性查询。标注地图元素。 总之在ArcMap中能能够完成的大部分任务,通过MapControl控件也可以完成
23、。通过设置MapControl General, Layers, Map 属性,你甚至不需要写一行代码可以获得一些GIS功能。关于MapControl控件有许多完整的应用示例,存放在ArcObjects Developer KitSamplesControls目录下。,(5)定义一个IMapControl3Ptr指针m_ipMapControl,将该指针指向刚才加入的MapControl控件,以获取控制权。获取Mapcontrol控件地址的关键语句:m_ipMapControl=GetDlgItem(IDC_MAPCONTROL1)-GetControlUnknown();,(6)利用AO加载
24、数据并显示。 数据类型可以是Coverage,SHAPE,以及Access数据库和SDE图层。以SDE图层为例讲述加载的详细过程。首先定义一个IWorkspacePtr指针,该指针用于连接到一个数据库并进行数据库的相关操作。连接代码如下:,/数据库连接CAOConnectToSDE myAO;/连接句柄CComBSTR server=CComBSTR(“universi-9769b9”);/服务器名CComBSTR instance=CComBSTR(“esri_sde”);/SDE实例CComBSTR database=CComBSTR(“ORCL”);/数据库实例CComBSTR user
25、=CComBSTR(“SDE”);/数据库用户名CComBSTR passwd=CComBSTR(“123456”);/密码CComBSTR version=CComBSTR(“SDE.DEFAULT”);/默认值mysdeworkspace.CreateInstance(CLSID_Workspace);/关键步骤,在C+API中,一般情况下申请一个指针后必须实例化,即为其分配内存。,if(myAO.CMyConnectToSDE(server,instance,user,passwd,database,version,IFeatureWorkspacePtr myfeatureworksp
26、ace;/定义要素工作空间,以打开要素集 IFeatureClassPtr myfeatureclass;/定义要素类指针并为其分配内存,以加载要打开的要素 IFeatureLayerPtr myfeaturelayer;/定义要素图层,以方便加载图层到MapControl进行显示 myfeatureclass.CreateInstance(CLSID_FeatureClass); myfeaturelayer.CreateInstance(CLSID_FeatureLayer); myfeatureworkspace=mysdeworkspace;/AO的核心部分,充分体现了COM的多态,H
27、RESULT rc;rc=myfeatureworkspace-OpenFeatureClass(LayerName,(7)基本图形操作接口 定义IActiveViewPtr指针,该指针负责对图形进行基本的操作。同样,需要将该指针指向MapControl控件。关键语句如下:HRESULT hr=m_ipMapControl-get_ActiveView(,地图放大操作函数:IEnvelopePtr ipEnvelope;/该接口用于判断放大的倍率hr = ipActiveView-get_Extent(,/判断是点击放大还是拉框放大XMin=YMin=XMax=YMax=0.0;if(S_OK
28、 !=ipEnvelope-get_XMin(,if(XMin!=XMax,ipActiveView-get_Extent(,缩小: IEnvelopePtr ipEnvelope;hr = ipActiveView-get_Extent(,/ 设置中心点为用户点击为主ipEnvelope-Expand(2, 2, true);ipActiveView-put_Extent(ipEnvelope);ipActiveView-Refresh(); 漫游:m_ipMapControl-Pan();,(8)空间缓冲区查询: 首先获取查询的图层。IFeatureLayerPtr pfeaturelay
29、er;pfeaturelayer=m_map.GetLayer(m_TableIndex); /打开要素类 IFeatureClassPtr m_featureclass; pfeaturelayer-get_FeatureClass(,/定义缓冲区 IPolygonPtr m_Circle; m_Circle.CreateInstance(CLSID_Polygon); IGeometryPtr m_Geometry; m_Geometry=m_map.TrackCircle(); IEnvelopePtr m_ispoint;m_Geometry-get_Envelope( ,定义空间过滤
30、器 ISpatialFilterPtr m_SpatialFilter; m_SpatialFilter.CreateInstance(CLSID_SpatialFilter);m_SpatialFilt-putref_Geometry(m_Geometry); m_SpatialFilter-put_GeometryField(name);,switch(m_GeometryType)case esriGeometryPoint:case esriGeometryMultipoint:m_SpatialFilter-put_SpatialRel(esriSpatialRelContains)
31、;break;case esriGeometryLine:case esriGeometryPolyline:case esriGeometryPath:m_SpatialFilter-put_SpatialRel(esriSpatialRelIntersects);break;default :m_SpatialFilter-put_SpatialRel(esriSpatialRelWithin);break; ,/进行查询 /定义游标 IFeatureCursorPtr m_FeatureCursor; m_FeatureCursor.CreateInstance(CLSID_Featur
32、eCursor);pfeaturelayer-Search(m_SpatialFilter,false,小结:数据的获取和创建,查询和选择集,2.5AO开发方法探讨: (1)AO的帮助系统: The ArcObjects Developer Help system is an essential resource for both beginning and experienced ArcObjects developer.It let you find detailed reference documentation about every coclass,class,interface,a
33、nd enumeration within ArcObjects as well as sample code,technical documents,and object model diagrams.,Object model Digrams 获取对象模型的帮助是成功使用ArcObjects的基础,对象模型图通过对象介绍了类图并展示了许多常用的方法。早期学习阶段查看打印的类图最有用。通过模型图,开发人员可以理解ArcObjects实现的对象模型的总体结构。当能够轻松地理解总体结构时,就可以更有效地使用随软件一块发布的PDF文件。,对象浏览器 除了类图的PDF文件外,许多依赖于开发平台的对象浏览器可以用来查看类型库信息。使用对象浏览器可以查看所引用的任何类型库的类型信息。类和接口的信息可以在Visual Basic、Visual C+或对象图格式中显示。对象浏览器可以用来查看组件对象类和类,但是不能用来查看抽象类。,组件帮助 所有接口和组件对象类都记录在组件帮助文件中。当更好地掌握了对象模型时,最终这些帮助是最经常要用到的。 (2) Exploring ArcObjects -一本很不错的AO技术文档,对AO的开发进行了很好的组织,而且有大量的示例,可以随时复制利用;,