首页 ArcObjects开发PPT培训资料

ArcObjects开发PPT培训资料

举报
开通vip

ArcObjects开发PPT培训资料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是A...

ArcObjects开发PPT培训资料
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是ArcInfo8引入的一个全新的空间数据模型,是建立在DBMS之上的统一的、智能化的空间数据库。所谓“统一”,在于Geodatabase之前所有的空间数据模型都不能在一个同一的模型框架下对GIS通常所处理和表达的地理空间要素,如:矢量、栅格、三维表面、网络、地址等,进行统一的描述。所谓“智能化”,是指在Geodatabase模型中,地理空间要素的表达较之以往的模型更接近于我们对现实事物对象的认识和表述方式。Geodatabase中引入了地理空间要素的行为、规则和关系,当处理Geodatabase中的要素时,对其基本的行为和必须满足的规则,我们无需通过程序编码;对其特殊的行为和规则,则可以通过要素扩展进行客户化定义。这是其它任何空间数据模型都做不到的。而ArcSDE正是用GeoDatabase的数据模型将海量的空间数据存储于商用的大型关系数据库中GeoDatabase的体系结构(常用):(1)对象类(Objectclass)在Geodatabase中,对象类是一种特殊的类,它没有空间特征,其实例为可关联某种特定行为的表记录(Rowintable)。如:某块地的主人。在“地块”和“主人”之间,可以定义某种关系。(2)要素类(Featureclass)同类空间要素的集合即为要素类。如:河流、道路、植被、用地、电缆等。要素类之间可以独立存在,也可具有某种关系。当不同的要素类之间存在关系时,我们将其组织到一个要素数据集(Featuredataset)中。(3)要素数据集(Featuredataset)要素数据集由一组具有相同空间参考(SpatialReference)的要素类组成。(4)关系类(Relationshipclass)定义两个不同的要素类或对象类之间的关联关系。例如:我们可以定义房主和房子之间的关系,房子和地块之间的关系等。(5)RasterDatasets用于存放栅格数据。可以支持海量栅格数据,支持影像镶嵌,可通过建立“金字塔”索引,并在使用时指定可视范围提高检索和显示效率。(6)TINDatasetsTIN是ARC/INFO非常经典的数据模型,用不规则分布的采样点的采样值(通常是高程值,也可以是任意其它类型的值)构成的不规则三角集合。用于表达地表形状或其它类型的空间连续分布特征。在ArcGIS8.1版中,TIN存放在Coverage的workspace中。Geodatabase的实现方式主要有两种:(1)Accesss数据库(2)ArcSDE图层Acess数据库:SDE图层:(1)图层:ArcSDE将具有共同属性项的地理要素归为一个图层。例如,可以将不同图幅的等高线存放在一个线状要素层中,每个数据库记录对应一条等高线,这样有利于地理要素的存储与管理。逻辑上,一个图层包含描述空间和属性信息的表。空间数据存储在要素表中,一个包含空间列的表被称为业务表(businesstable),业务表与要素表以及空间索引表的集合组成一个ArcSDE图层。(2)业务表:在现有的数据库表中加入图形数据项(shapecolumn)(即增加一个空间列),供软件管理和访问与其关联的空间数据,就构成了一张业务表。一张业务表包括一个空间列和多个属性表,空间列是联系要素表和空间索引表的键值。在业务表中对应于空间列的每一行的存储值被称为一个shape。在业务表的非空间数据列可以存储shape的属性。一个shape及其属性可以组成一个ArcSDE要素。要素可以有另外的属性,当通过一个SQL连接语句从ArcSDE图层中获取要素时,就可以访问这些属性。(3)ArcSDE的数据模式:ArcSDE采用连续的数据模型,也就是说它可将整个城市的宗地数据放到一个连续的层中。每一个宗地地块作为一个完整的多边形存放,它只需一次磁盘的访问即可快速提取出来。ArcSDE为数据库中各层的所有要素都建立了空间索引,实现途径是将层从逻辑上分成一个个小块,称为”cell”,层中的要素则分解到各cell中加以描述,并将此描述信息写到索引表中。落到每个cell上的要素,将在每个cell对应的索引记录中加以描述,没有数据的cell不包括在索引表中。(4)ArcSDE的数据存储:缺省情况下,ArcSDE使用压缩的二进制格式来存储要素的集合图形,从而可以有效的提高存储和检索空间数据的效率。一个压缩的二进制要素类有由三个数据表组成:业务表,要素表,空间索引表,它们之间通过空间列和FID利发生关系。业务表:存放属性数据要素表:存放集合信息空间索引表:存放GridFileSP_FID1.2ArcGIS体系构成ArcGISDesktop:Anintegrated,scalablesuiteofsoftwareforcompiling,authoring,analyzing,mapping,andpublishinggeographicinformationandknowledge.ArcGISDesktopstartswithArcReader™andextendstoincludeArcView®,ArcEditor™,andArcInfo™,eachcomponentexposingmoreGIScapabilities.AdditionaldesktopextensionsexpandGIScapabilitiesfurther.arcgisdesktop产品子模块:ArcMap,ArcCatalog,ArcGlobe,ArcScene,ArcToolBox。ArcMap:主要是查看GIS数据,编辑GIS数据,地图输出等功能。在ArcMap添加GIS数据后可以保存为一个mxd后缀名的文档,它记录的是当前文档打开的数据的“引用“,记录添加的数据存储的位置等,还保存每个图层的symbol,地图输出的布局,添加的Elements等信息,但是它不包含实际的空间信息。ArcCatalog:类似于windows的资源管理器,可以进行GIS数据的创建,比如新建一个GEODATABASE,在GEODATABASE中新建图层等,还有很多其它的功能。ArcToolBox:它没有自己的窗体界面,可以作为ArcMap或者ArcCatalog的一个浮动工具条而存在,但是它的功能是不容小视的。可以进行不同格式数据的装换,各式各样的空间分析。关于桌面产品的详细说明可以参考安装桌面软件以后的desktophelp和pdf文档(usingarcmap,usingarccatalogetc)。其它的3D扩展模块的功能可以参考帮助。EmbeddedGIS:UseArcGISEnginetodevelopcustomdesktopGISapplicationsorembedGISfunctionalityinexistingapplications.Thesefocusedsolutionscanthenbeeasilydeployedthroughoutanorganization.ArcObjects开发仔细看上图,有三个红色的椭圆标注了三个开发形式的名称:TheArcGISDesktopDeveloperKit,TheArcGISEngineDeveloperKit,TheArcGISServerDeveloperKit。它们都是基于AO的组件集,可以把AO比作积木中的最小的元素,我们可以用它们构造一个房子(就是应用程序)。---AO组件比作原材料(水泥,木材,钢筋)---开发包比作半成品(做好的窗户,门,大块的砖)---应用程序比作房子用户要盖一个房子就比较的方便了,不用自己做门窗等,只要把它们合理的组合起来就可以了。这就涉及到组件的一个“粒度”大小的问题,比如AO组件是最原始的建筑材料,那么你会提供什么粒度大小的东西给程序员进行二次开发呢?是做好的门窗,墙壁砖,还是一个个的小房子,只要进行合理的组合就是一套别墅?后者的粒度肯定是比前者大了!ESRI提供的应该是门窗大小粒度的,粒度越小,给开发者自由发挥的余地就越是大,但是开发难度就越大!TheArcGISDesktopDeveloperKit:在desktop软件的基础上添加功能。好比用户不满意ESRI提供的房子,觉得不适合自己的口味,这样用户可以定制自己的功能,所有的功能都可以在以前房子的基础上完成。TheArcGISEngineDeveloperKit和TheArcGISServerDeveloperKit:用户买不起房子或者是觉得买那个房子不划算,因为那个房子的很多设施用户不想购买,可以!那用户可以购买ESRI提供的建筑材料自己盖房子。ArcGIS组件构成图二.AO开发2.1ArcObjects简介所有ArcGIS产品都是由ArcObjects组成.ArcObjects都是C++对象.通过不同的应用程序接口(API)来进行调用本身就是COM组成.2.2AO应用程序接口ArcObjects的功能可以通过四个应用程序接口(APIs)来访问。选择使用哪个API并不是一个简单的问题,而要取决于许多因素,包括:要开发的ArcGIS产品、要开发的最终用户功能以及使用特定开发语言的经验。ArcGISEngine支持的四种API是:COM-—任何COM生成语言(VisualBasic、VisualC++、Delphi等)都可以使用这个API。.NET-—这个API支持VisualBasic.NET和C#。Java——Sun公司的Java2平台标准编辑器。(Desktop不支持)C++——微软VC++6.0、微软VC++.NET2003、SunSolarisForte6Update2、LinuxGCC3.2支持此API。四个APIs全都支持使用ArcObjects的功能,但是,并不是所有ArcObjects实现的接口都在所有平台上支持。有些情况下,接口使用的数据类型与某种API不兼容。在这种情况下,提供了接口的其他实现以便开发者使用。COM和.NETAPIs只在微软Windows平台上被支持,而Java和C++APIs可以在ArcGISEngine支持的所有平台上都支持。2.3COMArcObjects基于微软组件对象模型(COM)之上。ArcGIS应用程序的最终用户不必理解COM,但打算基于AO开发应用程序或使用AO扩展已有ArcGIS应用程序的开发者必须理解COM,即使打算用C++、Java、.NetAPIs而不是用COM开发也要理解COM。需要理解的层次取决于定制和开发的深度。至少需要浏览组件对象模型和使用ArcObjects开发部分,然后继续所选的特定API部分。为了理解COM(以及所有基于COM的技术),认识到其不是一种面向对象语言而是一个 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 或标准是非常重要的。COM不仅仅是一种技术,还是软件开发的一种方法论。COM定义了一种连接软件组件或模型的协议。通过使用这种协议,可以建立能在分布式系统中动态交互的可重用软件组件。COM还定义了一种称作基于接口的编程模式。对象封装了能体现定义良好的接口后每个实例化对象特征的操作方法和数据。这增强了系统开发的结构化和安全性,因为一个对象的客户并不知道某个特定方法如何实现的任何细节。COM不规定应如何构建一个应用程序。语言、结构和实现细节都由使用COM的应用程序开发人员决定。在ArcGIS应用程序中,许多对象通过其接口提供了几千个属性和方法。当使用ESRI对象库时,可以假定所有这些属性和方法是完全实现了的,如果它们列在对象图中,就可以使用它们。使用COM开发就意味着用接口开发,即所谓的基于接口的编程模式。对象间的所有通信都是通过其接口实现的。COM接口是抽象的,意味着没有与接口相关联的实现;与接口关联的代码都来自类的实现。接口规定了对选择用于实现接口的对象可以作什么请求。左边的模型图解释了在实现接口时COM类中展现的多态行为。注意Human和Parrot类都实现了ITalk接口。ITalk接口定义了一些方法和属性,如StartTalking、StopTalking、Language等,但显然这两个类的实现是不同的。ArcObjects中开发者必须理解的类有三种类型:抽象类(abstractClasses)、组件对象类(coclasses)和类(classes)。抽象类不能创建对象,只是对其子类的实例化进行了规定(通过类型继承)。ArcObjects的Dataset或Geometry类就是抽象类的例子。不能创建Geometry类型的对象,但可以创建Polyline类型的对象。Polyline对象实现了在Geometry基类中定义的接口,因此在基于对象类中定义的任何接口都可以从组件对象类访问。对象,类和接口对象是COM的基本要素之一,和C++中的对象不同的是其封装特性是真正意义上的封装,对于对象使用者(通常称为客户)而言是不可见的,此外,COM对象的可重用性表现在COM对象的包容和聚合,一个对象可以完全使用另一个对象的所有功能,而C++对象的可重用性表现在c++类的继承性。接口是指组件对象的接口,它是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能,组件对象间的访问都是通过接口来进行的。1.接口不是类。接口不能实例化自身,因为其上没有实现。2.接口不是对象。接口是一个相关功能组,是客户和对象之间通信的二进制标准。3.接口具有很强的类型性。每个接口都有自己的接口标识符,因此消除了具有人们易读相同名字接口间可能的冲突。4.接口是不变的。接口从来没有版本。一旦接口被定义和公布就不能改变。1500多个类(分成多个逻辑子集)1600多个接口对象模型图有什么用?这个类支持哪些接口?要完成某项工作需要用到哪些对象?如何引用这个类的一个对象?这个接口上有哪些方法和属性?这个接口有隐藏的方法和属性吗?有其它类支持这个接口吗?2.4AOC++API应用实例。(1)新建一个MFC项目。(2)打开上一节所建项目。选择菜单Tools->Options->Directories页在Includefiles里添加两个路径(如果你的ArcGIS的安装目录在其它盘,需做相应改动:C:\PROGRAMFILES\ARCGIS\COMC:\PROGRAMFILES\ARCGIS\BIN(3)在项目的StdAfx.h中添加如下代码(AO引入库):#pragmawarning(push)………………………….#pragmawarning(pop)(4)加入MapControl控件。MapControl控件提供了类似ArcMap中的数据视图(DataView)的窗口,通过它你可完成以下甚至更多功能:显示图层地图。放大,缩小,漫游。生成图形元素,如点,线,圆,多边形。说明注记。识别地图上被选中的元素,进行空间或属性查询。标注地图元素。总之在ArcMap中能能够完成的大部分任务,通过MapControl控件也可以完成。通过设置MapControlGeneral,Layers,Map属性,你甚至不需要写一行代码可以获得一些GIS功能。关于MapControl控件有许多完整的应用示例,存放在\\ArcObjectsDeveloperKit\Samples\Controls目录下。(5)定义一个IMapControl3Ptr指针m_ipMapControl,将该指针指向刚才加入的MapControl控件,以获取控制权。获取Mapcontrol控件地址的关键语句:m_ipMapControl=GetDlgItem(IDC_MAPCONTROL1)->GetControlUnknown();(6)利用AO加载数据并显示。数据类型可以是Coverage,SHAPE,以及Access数据库和SDE图层。以SDE图层为例讲述加载的详细过程。首先定义一个IWorkspacePtr指针,该指针用于连接到一个数据库并进行数据库的相关操作。连接代码如下://数据库连接CAOConnectToSDEmyAO;//连接句柄CComBSTRserver=CComBSTR(“universi-9769b9”);//服务器名CComBSTRinstance=CComBSTR(“esri_sde”);//SDE实例CComBSTRdatabase=CComBSTR(“ORCL”);//数据库实例CComBSTRuser=CComBSTR(“SDE”);//数据库用户名CComBSTRpasswd=CComBSTR(“123456”);//密码CComBSTRversion=CComBSTR(“SDE.DEFAULT”);//默认值mysdeworkspace.CreateInstance(CLSID_Workspace);//关键步骤,在C++API中,一般情况下申请一个指针后必须实例化,即为其分配内存。if(myAO.CMyConnectToSDE(server,instance,user,passwd,database,version,&mysdeworkspace)==S_OK){AfxMessageBox("成功连接数据库");}else{AfxMessageBox("连接失败");}IFeatureWorkspacePtrmyfeatureworkspace;//定义要素工作空间,以打开要素集IFeatureClassPtrmyfeatureclass;//定义要素类指针并为其分配内存,以加载要打开的要素IFeatureLayerPtrmyfeaturelayer;//定义要素图层,以方便加载图层到MapControl进行显示myfeatureclass.CreateInstance(CLSID_FeatureClass);myfeaturelayer.CreateInstance(CLSID_FeatureLayer);myfeatureworkspace=mysdeworkspace;//AO的核心部分,充分体现了COM的多态HRESULTrc;rc=myfeatureworkspace->OpenFeatureClass(LayerName,&myfeatureclass);if(rc!=S_OK){AfxMessageBox("请输入正确的文件名");return;}myfeaturelayer->putref_FeatureClass(myfeatureclass);BSTRfeaturename;myfeatureclass->get_AliasName(&featurename);myfeaturelayer->put_Name(featurename);m_map.AddLayer(myfeaturelayer,NULL);(7)基本图形操作接口定义IActiveViewPtr指针,该指针负责对图形进行基本的操作。同样,需要将该指针指向MapControl控件。关键语句如下:HRESULThr=m_ipMapControl->get_ActiveView(&ipActiveView);地图放大操作函数:IEnvelopePtripEnvelope;//该接口用于判断放大的倍率hr=ipActiveView->get_Extent(&ipEnvelope);if(FAILED(hr))return;hr=m_ipMapControl->TrackRectangle(&ipEnvelope);if(FAILED(hr))return;if(ipEnvelope==NULL)return;doubleXMin,YMin,XMax,YMax;//判断是点击放大还是拉框放大XMin=YMin=XMax=YMax=0.0;if(S_OK!=ipEnvelope->get_XMin(&XMin))XMin=0.0;if(S_OK!=ipEnvelope->get_YMin(&YMin))YMin=0.0;if(S_OK!=ipEnvelope->get_XMax(&XMax))XMax=0.0;if(S_OK!=ipEnvelope->get_YMax(&YMax))YMax=0.0;if(XMin!=XMax&&YMin!=YMax)//用户拉框选择区域放大{ipActiveView->put_Extent(ipEnvelope);ipActiveView->Refresh();}ipActiveView->get_Extent(&ipEnvelope);if(FAILED(hr))return;IPointPtripPoint(CLSID_Point);ipPoint->put_X(mapX);ipPoint->put_Y(mapY);//设置中心点为用户点击为主ipEnvelope->CenterAt(ipPoint);ipEnvelope->Expand(0.5,0.5,true);ipActiveView->put_Extent(ipEnvelope);ipActiveView->Refresh();缩小:IEnvelopePtripEnvelope;hr=ipActiveView->get_Extent(&ipEnvelope);if(FAILED(hr))return;IPointPtripPoint(CLSID_Point);ipPoint->put_X(mapX);ipPoint->put_Y(mapY);ipEnvelope->CenterAt(ipPoint);//设置中心点为用户点击为主ipEnvelope->Expand(2,2,true);ipActiveView->put_Extent(ipEnvelope);ipActiveView->Refresh();漫游:m_ipMapControl->Pan();(8)空间缓冲区查询:首先获取查询的图层。IFeatureLayerPtrpfeaturelayer;pfeaturelayer=m_map.GetLayer(m_TableIndex);//打开要素类IFeatureClassPtrm_featureclass;pfeaturelayer->get_FeatureClass(&m_featureclass);pfeaturelayer->put_Selectable(TRUE)BSTRname;//获取图层类型,以定义空间操作m_featureclass->get_ShapeFieldName(&name);esriGeometryTypem_GeometryType;m_featureclass->get_ShapeType(&m_GeometryType);//定义缓冲区IPolygonPtrm_Circle;m_Circle.CreateInstance(CLSID_Polygon);IGeometryPtrm_Geometry;m_Geometry=m_map.TrackCircle();IEnvelopePtrm_ispoint;m_Geometry->get_Envelope(&m_ispoint)doublewidth;m_ispoint->get_Width(&width);if(width==0){return;}定义空间过滤器ISpatialFilterPtrm_SpatialFilter;m_SpatialFilter.CreateInstance(CLSID_SpatialFilter);m_SpatialFilt->putref_Geometry(m_Geometry);m_SpatialFilter->put_GeometryField(name);switch(m_GeometryType){caseesriGeometryPoint:caseesriGeometryMultipoint:m_SpatialFilter->put_SpatialRel(esriSpatialRelContains);break;caseesriGeometryLine:caseesriGeometryPolyline:caseesriGeometryPath:m_SpatialFilter->put_SpatialRel(esriSpatialRelIntersects);break;default:m_SpatialFilter->put_SpatialRel(esriSpatialRelWithin);break;}//进行查询//定义游标IFeatureCursorPtrm_FeatureCursor;m_FeatureCursor.CreateInstance(CLSID_FeatureCursor);pfeaturelayer->Search(m_SpatialFilter,false,&m_FeatureCursor););小结:数据的获取和创建查询和选择集2.5AO开发方法探讨:(1)AO的帮助系统:TheArcObjectsDeveloperHelpsystemisanessentialresourceforbothbeginningandexperiencedArcObjectsdeveloper.Itletyoufinddetailedreferencedocumentationabouteverycoclass,class,interface,andenumerationwithinArcObjectsaswellassamplecode,technicaldocuments,andobjectmodeldiagrams.ObjectmodelDigrams获取对象模型的帮助是成功使用ArcObjects的基础,对象模型图通过对象介绍了类图并展示了许多常用的方法。早期学习阶段查看打印的类图最有用。通过模型图,开发人员可以理解ArcObjects实现的对象模型的总体结构。当能够轻松地理解总体结构时,就可以更有效地使用随软件一块发布的PDF文件。对象浏览器除了类图的PDF文件外,许多依赖于开发平台的对象浏览器可以用来查看类型库信息。使用对象浏览器可以查看所引用的任何类型库的类型信息。类和接口的信息可以在VisualBasic、VisualC++或对象图格式中显示。对象浏览器可以用来查看组件对象类和类,但是不能用来查看抽象类。组件帮助所有接口和组件对象类都记录在组件帮助文件中。当更好地掌握了对象模型时,最终这些帮助是最经常要用到的。(2)《ExploringArcObjects》-----一本很不错的AO技术文档,对AO的开发进行了很好的组织,而且有大量的示例,可以随时复制利用;
本文档为【ArcObjects开发PPT培训资料】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥17.6 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
精品课件
暂无简介~
格式:ppt
大小:798KB
软件:PowerPoint
页数:0
分类:高中其他
上传时间:2021-01-25
浏览量:3