1、ArcEngine开发入门,ArcGIS Engine开发包,ArcGIS Engine开发包包括了支持开发任务所需要的所有的开发资源 Components Engine libraries ArcGIS controlsAPIs COM, .NET, Java, and C+ Tools ArcGIS Developer Kit Documentation Developer utilities,ArcGIS Engine库,ArcGIS Engine库,System SystemUI GeoAnalystGeometry 3DAnalyst Display GlobeCore Server
2、 SpatialAnalyst Output GeoStatisticalAnalyst GeodatabasePublisher,GISClient ArcReaderControl GeoDatabaseDistributed DataSourcesFile DataSourcesOleDB DataSourcesRaster Cato Location NetWorkAnalysis Controls,主要Library介绍,System System库是ArcGIS框架中最底层的一个库,它包含了一些被其他库使用的一些组件。 SystemUI SystemUI库定义了一些在ArcGIS中
3、被用户界面组件使用的类型。象Icommand和Itool这样的接口就在这里定义。,主要Library介绍,Geometry 几何库包含了核心的几何对象,比如点,面,线等。在几何库中还定义和实现了空间参考的对象,包括投影坐标系和几何坐标系。 Display 显示库包含了支持在输出设备上显示图形的组件,屏幕显示,符号,颜色等都在这个库中定义。 Controls 控件库包含了应用程序开发中用到的控件,包括在控件中使用的命令和工具。,主要Library介绍,Carto Carto库包含了为数据显示服务的对象。PageLayout和Map对象在这个库中,以及支持各种数据类型的图层,渲染。 这个库中也包括
4、了MxdServer和MapServer对象,它们通常被Server用来显示地图数据。 GeoDatabase GeoDatabase包含了所有相关数据组织的定义类型。要素,表,网络,TIN都在这个库中定义。其中一些类型的实现在各自的数据来源的库中。,Carto库MapElements,Render,DataSourcesFile DataSourcesFile库包含了为支持的矢量数据格式提供的工作空间工厂和工作空间. DataSourcesGDB DataSourcesGDB 库包含了为存储在RDBMS中的矢量和栅格数据提供的工作空间工厂和工作空间。 GeoDatabaseDistribut
5、ed GeoDatabaseDistributed 库包含了需要执行checkout/checkin 的离线GeoDatabase的对象。 DataSourcesOleDB DataSourcesOleDB 库为通过OleDB方式提供的数据提供空组空间。,DataSourcesRaster DataSourcesRaster 包含了为基于文件方式的栅格数据提供的工作空间工厂和工作空间。 GISClient GISClient库包含了作用于远程GIS服务的对象。这些远程服务可以有ArcGIS Server和ArcIMS提供。 Server库包含了连接ArcGIS Server的对象,以及管理这个
6、连接的对象。,GeoAnalyst GeoAnalyst库包含了核心的空间分析功能,这些功能是在spatialAnalyst和3DAnalyst扩展都会用到的功能。 3DAnalyst 3DAnalyst库包含了数据的3d分析对象,也包括显示3d数据,在这个库中有一个控件SceneControl可用。 GlobeCore GlobeCore库包含了globe数据分析的对象,也包含了显示globe数据,在这个库中有一个控件GlobeControl可用。 SpatialAnalyst SpatialAnalyst库包含了在栅格和矢量数据上执行空间分析的对象。,主要内容,ArcObjects通用 基
7、于COM接口编程基础 理解对象模型图(OMD) 地图和图层 数据访问和创建 几何对象和地理处理过程 使用子集和选择集 符号化 使用工具 数据管理 使用Layout元素针对ArcEngine 使用开发控件 扩展控件 其他东西,基于COM接口编程基础(1),小节内容,COM组件对象模型简介 如何使用COM类 接口Interfaces 多态Polymorphism 接口查询QueryInterface 测试一个对象的引用的常用方法 Is it nothing? What type of object is it?,COM简介,COM是创建类的一个标准 COM类可以在不同的工程中重用 不依赖于具体的开
8、发语言 所有的 ArcObjects 都是 COM 类 ArcObjects基于COM技术构建 对象连接与嵌入技术 (OLE) OLE DB技术 ActiveX 技术是 COM 技术的一种封装 DCOM 和 COM+,COM 类拥有接口,对象拥有一个或多个接口 接口是定义了一组方法和属性的逻辑关系 与对象的通信是通过接口来进行的,通信契约接口,接口的秘密 接口可以被看做一种定义了必要的方法和属性的类型。作为类型而存在,是类型(Class)一般行为的定义和契约。,启动,接口的作用 定义多个类型都需要的公共方法和属性。 作为一种不可实例化的类型存在。,在讨论COM接口时,COM规范(微软,1995
9、)着重强调以下四点: 接口不是类。接口不能实例化自身,因为其上没有实现。 接口不是对象。接口是一个相关功能组,是客户和对象之间通信的二进制标准。 接口具有很强的类型性。每个接口都有自己的接口标识符,因此消除了具有人们易读相同名字接口间可能的冲突。 接口是不变的。接口从来没有版本。一旦接口被定义和公布就不能改变。,COM接口,使用一个接口实例化一个COM类 Dim As 接口集合了属性和方法,Dim pGarbage As IDrive Set pGarbage = New GarbageTruckpGarbage.Fuel = “Full“ pGarbage.Accelerate,使用 Arc
10、Objects COM 类,更多的接口例子 ,一个组合音响的例子 一个对象可以播放收音机、磁带、CD 必须使用适当的接口 如果选择了播放磁带的接口,则不能收听收音机,Dim pBBox As ITape Set pBBox = New BoomBox pBBox.FM = True,IDrive燃料加速刹车,多态,许多不同的类可以支持相同的接口 拥有相同的所有的方法和属性 可以有不同的执行方式和拥有不同的属性值,多态,ArcObjects 多态,许多ArcGIS的类都表现出多态的特性 所有的子类都是集成了接口 ILayer: All layer types (raster, tin, feat
11、ure, etc.) IGxFile: All ArcCatalog file types (shapefile, map, table, etc.) IActiveView: Map (data view) and PageLayout (layout view) Several others ,使用接口的属性和方法,定义一个指向接口的遍历 实例化一个对象 调用方法和设置属性只能使用定义的接口的属性和方法,Create a new RaceCar with IDrive Dim pCar As IDrive Set pCar = New RaceCar pCar.Accelerate pCa
12、r.Fuel = “Full“pCar.PitStop,Create a new RaceCar with the IDrive interface Dim pCar As IDrive Set pCar = New RaceCar pCar.AccelerateSwitch interfaces Dim pRace As IRace Set pRace = pCar pRace.PitStop pCar.Accelerate *pCar and pRace point to the same object*,取得其他的接口,接口查询 (QI) 访问其它接口的属性和方法,Q I,RaceCar
13、,Accelerate,Brake,Fuel,PitStop,LapTime,IRace,IDrive,Dim pArea As IArea Dim pPt As IPoint Set pArea = pPolygon QI for IArea on pPolygon Set pPt = pArea.Center,测试一个对象的引用关系,Is an object Nothing?,What TypeOf object is it?,If TypeOf pLayer Is IFeatureLayer ThenMsgBox “You selected a Feature Layer. “ Else
14、MsgBox “This layer is not a Feature Layer.“ End If,If pLayer Is Nothing ThenMsgBox “You must select a layer.“Exit Sub End If,COM 类代码,接口 模块 定义方法和属性类模块 实现方法和属性客户端模块 实例化类 使用方法和属性,Client,Server,Interface,使用类库命名空间,许多类库中有相同的类名和接口名 可以明白地引用对象库在EsriCore库中创建一个新的点和线对象 Dim pPoint As esriCore.Ipoint Dim pLine As
15、 esriCore.Iline Set pPoint = New Point Set pLine = New Line,使用 ESRI Object 浏览器,列表类、接口、属性和方法 位置:ArcGISDeveloperKittoolsEOBrowser.exe,理解对象模型OMD图(2),小节内容,ArcObject 的对象模型图 (Object Model Diagrams OMD) 阅读一个对象的模型图 类的类型 类的相互关系 接口、属性、方法的图标 根据OMD图表编写程序,OMD图表可以帮助编写代码 显示每一个类的接口、方法和属性 显示类与类之间的相互关系 ArcGIS在几个图表中拥有
16、超过 1,500 个类 超过 1,600 个接口,ArcObject OMD对象模型图,在哪里可以找到ArcGIS OMD图表,Start Programs ArcGIS Developer Help 简单的、详细的类图 PDF files 电子书籍光盘中 软件安装的目录中,解析对象模型图,抽象类:不能用于创建对象,对子类例程进行了规定(通过类型继承)。 类:不能直接创建对象,但可以作为另一个类的属性或者通过另一个类的实例化来创建对象。 实例化类:可以直接创建对象。 关联关系:表示类之间的关系。关联的两端都定义了多样性。 组成关系:是一种“整体类”对象控制着“部分类”对象的生命期关系。 类型继
17、承关系:定义共享父类的属性和方法,同时又具有了自己独特的属性和方法的特定对象类。 实例化关系:表示某个类的对象具有创建另一个类的对象的方法。 N元关系:表示两个以上的类相互关联。在各个关联分支的交叉点上放置一个菱形。 多样性关系:是对能于另一个对象关联的对象数目的一种限制。关联和组成关系的两端都定义了多样性。,解析对象模型图,ArcObjects UML关系符号例子,继承 组成 用来创建 对应关系 1:N 联合,*,_,蛋,鸟,翅膀,羽毛,2,Abstract,Class,Class,Class,鸡,CoClass,巢,CoClass,*,类和他们相应的对象,ArcObjects 对象例子,M
18、xDocument,Map,Layer,*,*,FeatureLayer,Application,ArcEngine没有这个层次对象,不能创建或实例化 抽象类永远不能有实例 为子类定义了泛化(general) 子类集成了抽象类的接口抽象类的OMD 符号: 2维阴影矩形,抽象类(没有阴影),类 (Class),不能直接创建的类 不能使用New关键字来创建 从其它对象处获得实例实例化类的OMD符号: 3维没有阴影的矩形,生 成,Dim pNewRow As IRow Set pNewRow = pTable.CreateRow IRow row = table.CreateRow();,可以创建:
19、使用 New关键字 Dim pMap As IMap Set pMap = New MapIMap pmap = new MapClass(); 实例化: 从其它对象获得 Dim pMap As IMap Set pMap = pMxDocument.FocusMappMap = m_MapDocument.get_Map(i); 可创建类的OMD符号:3维阴影矩形,可创建的类 (CoClass),属性和方法的符号,属性 哑铃形状的图标方法,属性传值: 大部分 ArcObjects的属性 属性保存了一个对象的值或者一个拷贝 不需要使用Set关键字属性传引用: 一些 ArcObjects的属性
20、属性保存了一个对象的引用 必须使用Set关键字如果引用对象发生了变化,对象的属性将同步受到影像,设置属性,pLayer.Name = “Port Moresby“ No Set keyword,Set pLayer.FeatureClass = pMoresbyData Must use Set!,返回值 Name: String 返回一个对象的引用 Document: IDocument StatusBar: IStatusBar,取得属性值,返回一个值 Dim strName As String Dim pDoc As IDocument Dim pBar As IStatusBar st
21、rName = Application.Name MsgBox strName返回一个引用 Set pDoc = Application.Document Set pBar = Application.StatusBar pBar.Message(0) pDoc.Title,接口棒棒糖类型的图标 ( ),查找接口,这些接口也是有效的。但是详细的 属性和方法必须在其它地方浏览。 (e.g., Object Browser).,该接口被本类使用. 所有的属性和放都列表在类图中.,继承接口是有效的,FeatureLayer on Map Layer OMD,概念上,这是一个对象模型 事实上, 被分别
22、在几张图表里存放 虫洞表现了图表与图表间的连接关系,ArcObjects OMD图表上的虫洞,Element on ArcMap OMD,虫洞,例子: MxDocument Map layer,从当前的文档中取得聚焦的Map (active data frame) MxDocument 可以包含一些 Maps ( * ) 从一个 Map中取得图层对象 图层对象有多种的类型 ( ),Dim pMxDoc As IMxDocument Set pMxDoc = LoadMxdDoc(”c:Temptest.mxd”) Dim pMap As IMap Set pMap = pMxDoc.Focus
23、Map Dim pLayer As ILayer Set pLayer = pMap.Layer(1)Is pLayer a FeatureLayer? If TypeOf pLayer Is IFeatureLayer ThenMsgBox “Yes!, its a feature layer“ End If,MxDocument,Map,FeatureLayer,Layer,*,*,Others,地图和图层(3),小节内容,访问 maps 和 layers 遍历 maps 和 layers使用 集合对象Collections 枚举对象Enumerations 创建一个新的图层 使用图层对象
24、的属性 设置一个图层的数据源,Maps和Layers的对象模型图,FeatureLayer,Map,MxDocument,*,*,Layer,FeatureDataset,*,Geodatabase,FeatureClass,Table,DataSet,0 1,Map Layer,访问maps,从 MxDocument 中访问maps Get the active mapGet all maps (IMaps) A collection of Maps,Dim pMxDoc As IMxDocument Set pMxDoc = LoadMxdDoc(”c:Temptest.mxd”) Dim
25、 pMap As IMap Set pMap = pMxDoc.FocusMap,Dim pAllMaps As IMaps Set pAllMaps = pMxDoc.Maps,一个地图文档可以包含有多个数据框,每个数据框都可以拥有不同的图层和表现。FocusMap是指向当前活动的数据框,访问 layers,从Map或MxDocument中访问 layers 取得被选中的图层 (IMxDocument)取得一个指定的图层 (IMap)Get all layers (IMap) An enumeration of layers,Dim pLayer As ILayer Set pLayer =
26、 pMxDoc.SelectedLayer,Dim pAllLayers As IEnumLayer Set pAllLayers = pMap.Layers,Dim pLayer As ILayer Set pMap = pMxDoc.FocusMap Set pLayer = pMap.Layer(3),遍历Maps集合,Maps是一个有序的集合 使用索引号来引用 (index) 第一个条目的索引号为0, Map collection example Dim intIndex As IntegerDim pMaps As IMapsSet pMaps = pMxDoc.MapsFor in
27、tIndex = 0 To pMaps.Count - 1MsgBox pMaps.Item(intIndex).NameNext tIndex, Syntax ExampleFor To process ch item Next ,遍历一个Map对象中的图层对象,Imap的Layers属性返回一个IEnumLayers对象 枚举对象类似于集合(collection)对象,只是属性方法较少 Next 方法返回一个 Ilayer对象 Reset 方法把指针指向条目的顶部,Set pLayer = pLayers.Next,Nothing,pLayers.Reset,IEnumLayer Top,
28、Set pLayer = pLayers.Next,Set pLayer = pLayers.Next,Set pLayer = pLayers.Next,Dim pLayer As ILayer Dim pLayers As IEnumLayer Set pLayers = pMap.Layers,使用Do While 或 Do Until 根据一个Boolean值来循环, Layer enum exampleDim pLayer As ILayerDim pMapLayers As IEnumLayerSet pMapLayers = pMap.LayersSet pLayer = pMa
29、pLayers.NextDo Until pLayer Is NothingMsgBox pLayer.NameSet pLayer = pMapLayers.NextLoop,Nothing, Syntax Example Do Until/While Run this code Loop,!,在循环中控制流向,当条件为真的时候提前退出循环 For Next loops: Exit For Do While and Do Until loops: Exit Do,Dim pCityMap As IMap Dim X As Integer For X = 0 To pMaps.Count -
30、1If pMaps.Item(X).Name = “Cities“ Then Set pCityMap = pMaps.Item(X)Exit ForEnd IfNext XMsgBox “All Done“, vbInformation,循环语句回顾,指定次数的循环 For Next 根据条件循环 Do While Do Until 小心无限循环,Here is an Endless Loop Do While Not MsgBox(“Add a Record?“) = vbYesCode here to add a record to a tableMsgBox “Record Added
31、“ Loop,添加一个新的图层到 map中,Layer 是一个抽象类:不能创建 可以创建Layer的 子类: TinLayer, FeatureLayer, RasterLayer, etc.,Make a New FeatureLayer Dim pFLayer As ILayer Set pFLayer = New FeatureLayer Add a layer to MxDocument or MapDim pMxDoc As IMxDocumentDim pMap As IMapSet pMxDoc = ThisDocumentSet pMap = pMxDoc.FocusMappM
32、ap.AddLayer pFLayer,没有设置数据源,所以图标为失去数据连接的状态。,使用图层对象的属性,Ilayer接口的属性 Name, Visible, ShowTips, MaximumScale, MinimumScale, etc. IGeoDataset接口属性 Extent, SpatialReference,这些代码可以用于访问文档对象选择中的任何种类的图层。Dim pLayer As ILayerSet pLayer = pMxDoc.SelectedLayer 设置基础的Layer的属性pLayer.Name = “Streets“pLayer.Visible = Tr
33、uepLayer.ShowTips = False,设置 FeatureLayer的数据源属性,FeatureClass 属性 (IFeatureLayer) 指定显示的数据源 以传引用的方式 (must use the Set keyword),Make a new FeatureLayer Dim pFLayer As IFeatureLayer Set pFLayer = New FeatureLayerGet another layers FeatureClass Dim pFClass As IFeatureClass Set pFClass = pSomeOtherLayer.Fe
34、atureClassSet the new layers FeatureClass property Set pFLayer.FeatureClass = pFClass,数据访问和创建(4),小节内容,数据创建对象 Workspace FeatureDataset FeatureClass 使用 fields 和 field集合对象 创建一个 Tables 和 FeatureClasses 添加一个记录行 编辑一个表的属性数据,FeatureClasses,Workspace,FeatureDataset,数据创建对象,Table,Fields,Field,1 ,Dataset,Worksp
35、ace,WorkspaceFactory,AccessWorkspaceFactory,Row,*,FeatureClass,ArcInfoWorkspaceFactory,ShapefileWorkspaceFactory,Others,*,打开一个现有的 Workspace,使用 IWorkspaceFactory 去创建一个 Workspace 对象 其它子类的WorkSpaceFactory都是 WorkspaceFactory的泛化。 OpenFromFile: 访问一个磁盘上现有的文件目录 Open: 连接到一个现有的数据库 (e.g., ArcSDE),Dim pWFactory
36、 As IWorkspaceFactory Set pWFactory = New ArcInfoWorkspaceFactory,Dim pWorkspace As IWorkspace Set pWorkspace = pWFactory.OpenFromFile(“D:Covers“, 0),访问 FeatureDataset,使用Workspace对象的IFeatureWorkspace接口 OpenFeatureDataset method,Dim pFWorkspace As IFeatureWorkspace Set pFWorkspace = pWorkspace QI for
37、 IFeatureWorkspace Dim pCover As IFeatureDataset Set pCover = pFWorkspace.OpenFeatureDataset(“streets“),FeatureClasses,Workspace,FeatureDataset,访问 FeatureClasses,使用 IFeatureClassContainer 去取得一个 FeatureDataset 中的所有FeatureClasses 对象,Dim pFCC As IFeatureClassContainer Dim pStreetArcs As IFeatureClass S
38、et pFCC = pCover QI for IFeatureClassContainer Set pStreetArcs = pFCC.ClassByName(“arc“),FeatureClasses,Exercise 9A overview,Add a ShapeFile layer to a map,Private Sub AddShapeFile_Click()Dim pWF As IWorkspaceFactorySet pWF = New ShapefileWorkspaceFactory Dim pFWS As IFeatureWorkspaceSet pFWS = pWF.
39、OpenFromFile(“C:USA“, 0)Dim pFClass As IFeatureClassSet pFClass = pFWS.OpenFeatureClass(“STATES“)Dim pFLayer As IFeatureLayerSet pFLayer = New FeatureLayerSet pFLayer.FeatureClass = pFClassDim pDataset As IDatasetSet pDataset = pFClasspFLayer.Name = pDataset.NameDim pDoc As IMxDocumentSet pDoc = Thi
40、sDocumentpDoc.AddLayer pFLayer End Sub,使用名称对象(Name objects),是一个轻量级的对象 使用Iname接口的Open方法去返回对象 有一些可以创建的子类,Dim pName as IName Set pName = pFeatureClassName Set pFeatureClass = pName.Open,创建一个新的 Workspace,使用 IWorkspaceFactory 去取得 WorkspaceName 调用Create 方法 使用 IName 去取得 Workspace对象 调用Open 方法,例子:创建一个新的 Work
41、space,使用Create方法取得一个WorkspaceName. 参数 1) the parent folder, 2) the name, 3) a PropertySet, and 4) an hWnd Dim pWorkName As IWorkspaceName Set pWorkName = pShapeFileWSFactory.Create (“C:Data“, “MyFiles“, Nothing, 0)使用Open方法返回一个WorkSpace对象 Dim pName As IName Set pName = pWorkName QueryInterface to get
42、 the IName interface Dim pShapeWSpace As IWorkspace Set pShapeWSpace = pName.Open Open on any Name returns the object,通过Iname打开ArcSDE 中的FeatureClass,Dim pInWsName As IWorkspaceNameDim pInPropSet As IPropertySetSet pInPropSet = New PropertySetWith pInPropSet.SetProperty “SERVER“, “cuillin“.SetPropert
43、y “INSTANCE“, “cuillin_ora“.SetProperty “DATABASE“, “.SetProperty “USER“, “jim“.SetProperty “PASSWORD“, “jim“.SetProperty “VERSION“, “SDE.DEFAULT“End WithSet pInWsName = New WorkspaceNamepInWsName.WorkspaceFactoryProgID = “esricore.SDEWorkspaceFactory“pInWsName.ConnectionProperties = pInPropSet,Dim
44、pInFCName As IFeatureClassNameSet pInFCName = New FeatureClassNameDim pDatasetName As IDatasetNameSet pDatasetName = pInFCName QIpDatasetName.Name = “Counties“Set pDatasetName.WorkspaceName = pInWsNameDim pName As INameSet pName = pInFCNameSet pInFeatureClass = pName.Open,创建一个新的 Table 或 FeatureClass
45、,使用 Workspace的 IFeatureWorkspace 接口 CreateTable 和 CreateFeatureClass 方法 需要一个 Fields 集合对象,Field类 和 Fields 类,Tables 与 FeatureClasses 都有一个关联的 Fields A Fields is a Collection A Fields object has Field objects One or several (1*) Creatable,IField and IFieldEdit,通过Ifield接口来访问 field 对象的属性 Read-only 使用IFiel
46、dEdit来设置field对象的属性 Write-onlyDim pNameField As IFieldEditSet pNameField = New FieldWith pNameField.Name = “StreetName“.Type = esriFieldTypeString.Length = 16End With,创建一个 Fields 集合,使用 IFieldsEdit 接口 AddField 方法:把一个field对象加入到集合中,Dim pFieldsEdit As IFieldsEdit Set pFieldsEdit = New FieldspFieldsEdit.A
47、ddField pOIDField pFieldsEdit.AddField pNameField pFieldsEdit.AddField pSalesField,Field = Fields !,Creating a Table or FeatureClass,使用WorkSpace对象的 IFeatureWorkspace 接口 CreateTable and CreateFeatureClass methods,Dim pTable As ITable Set pTable = pFeatureWorkspace.CreateTable _(“Store55“ , pFieldsEdi
48、t , Nothing , Nothing , “ “ ),Table Name,Fields Collection,ArcSDE Configuration Keyword,如果是创建FeatrueClass则需要指定 FeatureType 和 ShapeFieldName 参数,创建一个ShapeFile类型的FeatureClass,Public Sub CreateShapefile()Const strFolder As String = “D:Data“Const strName As String = “MyShapeFile“ 不要加Shp后缀Const strShapeFi
49、eldName As String = “Shape“ 打开用来放置ShapeFile文件的目录作为一个WorkSpaceDim pFWS As IFeatureWorkspaceDim pWorkspaceFactory As IWorkspaceFactorySet pWorkspaceFactory = New ShapefileWorkspaceFactorySet pFWS = pWorkspaceFactory.OpenFromFile(strFolder, 0) 设置一个简单的字段集合对象Dim pFields As IFieldsDim pFieldsEdit As IFiel
50、dsEditSet pFields = New esriCore.FieldsSet pFieldsEdit = pFieldsDim pField As IFieldDim pFieldEdit As IFieldEdit 创建一个Shape字段,它需要一个Geometry定义和空间引用对象Set pField = New esriCore.FieldSet pFieldEdit = pFieldpFieldEdit.Name = strShapeFieldNamepFieldEdit.Type = esriFieldTypeGeometry定义Geometry属性和空间引用Dim pGeomDef As IGeometryDefDim pGeomDefEdit As IGeometryDefEdit,