ArcEngine开发入门.ppt

上传人:max****ui 文档编号:3359685 上传时间:2019-12-12 格式:PPT 页数:235 大小:4.96MB
返回 下载 相关 举报
ArcEngine开发入门.ppt_第1页
第1页 / 共235页
ArcEngine开发入门.ppt_第2页
第2页 / 共235页
ArcEngine开发入门.ppt_第3页
第3页 / 共235页
点击查看更多>>
资源描述
ArcEngine开发入门,ArcGISEngine开发包,ArcGISEngine开发包包括了支持开发任务所需要的所有的开发资源ComponentsEnginelibrariesArcGIScontrolsAPIsCOM,.NET,Java,andC+ToolsArcGISDeveloperKitDocumentationDeveloperutilities,ArcGISEngine库,ArcGISEngine库,SystemSystemUIGeoAnalystGeometry3DAnalystDisplayGlobeCoreServerSpatialAnalystOutputGeoStatisticalAnalystGeodatabasePublisher,GISClientArcReaderControlGeoDatabaseDistributedDataSourcesFileDataSourcesOleDBDataSourcesRasterCatoLocationNetWorkAnalysisControls,主要Library介绍,SystemSystem库是ArcGIS框架中最底层的一个库,它包含了一些被其他库使用的一些组件。SystemUISystemUI库定义了一些在ArcGIS中被用户界面组件使用的类型。象Icommand和Itool这样的接口就在这里定义。,主要Library介绍,Geometry几何库包含了核心的几何对象,比如点,面,线等。在几何库中还定义和实现了空间参考的对象,包括投影坐标系和几何坐标系。Display显示库包含了支持在输出设备上显示图形的组件,屏幕显示,符号,颜色等都在这个库中定义。Controls控件库包含了应用程序开发中用到的控件,包括在控件中使用的命令和工具。,主要Library介绍,CartoCarto库包含了为数据显示服务的对象。PageLayout和Map对象在这个库中,以及支持各种数据类型的图层,渲染。这个库中也包括了MxdServer和MapServer对象,它们通常被Server用来显示地图数据。GeoDatabaseGeoDatabase包含了所有相关数据组织的定义类型。要素,表,网络,TIN都在这个库中定义。其中一些类型的实现在各自的数据来源的库中。,Carto库MapElements,Render,DataSourcesFileDataSourcesFile库包含了为支持的矢量数据格式提供的工作空间工厂和工作空间.DataSourcesGDBDataSourcesGDB库包含了为存储在RDBMS中的矢量和栅格数据提供的工作空间工厂和工作空间。GeoDatabaseDistributedGeoDatabaseDistributed库包含了需要执行checkout/checkin的离线GeoDatabase的对象。DataSourcesOleDBDataSourcesOleDB库为通过OleDB方式提供的数据提供空组空间。,DataSourcesRasterDataSourcesRaster包含了为基于文件方式的栅格数据提供的工作空间工厂和工作空间。GISClientGISClient库包含了作用于远程GIS服务的对象。这些远程服务可以有ArcGISServer和ArcIMS提供。Server库包含了连接ArcGISServer的对象,以及管理这个连接的对象。,GeoAnalystGeoAnalyst库包含了核心的空间分析功能,这些功能是在spatialAnalyst和3DAnalyst扩展都会用到的功能。3DAnalyst3DAnalyst库包含了数据的3d分析对象,也包括显示3d数据,在这个库中有一个控件SceneControl可用。GlobeCoreGlobeCore库包含了globe数据分析的对象,也包含了显示globe数据,在这个库中有一个控件GlobeControl可用。SpatialAnalystSpatialAnalyst库包含了在栅格和矢量数据上执行空间分析的对象。,主要内容,ArcObjects通用基于COM接口编程基础理解对象模型图(OMD)地图和图层数据访问和创建几何对象和地理处理过程使用子集和选择集符号化使用工具数据管理使用Layout元素针对ArcEngine使用开发控件扩展控件其他东西,基于COM接口编程基础(1),小节内容,COM组件对象模型简介如何使用COM类接口Interfaces多态Polymorphism接口查询QueryInterface测试一个对象的引用的常用方法Isitnothing?Whattypeofobjectisit?,COM简介,COM是创建类的一个标准COM类可以在不同的工程中重用不依赖于具体的开发语言所有的ArcObjects都是COM类ArcObjects基于COM技术构建对象连接与嵌入技术(OLE)OLEDB技术ActiveX技术是COM技术的一种封装DCOM和COM+,COM类拥有接口,对象拥有一个或多个接口接口是定义了一组方法和属性的逻辑关系与对象的通信是通过接口来进行的,通信契约接口,接口的秘密接口可以被看做一种定义了必要的方法和属性的类型。作为类型而存在,是类型(Class)一般行为的定义和契约。,启动,接口的作用定义多个类型都需要的公共方法和属性。作为一种不可实例化的类型存在。,在讨论COM接口时,COM规范(微软,1995)着重强调以下四点:接口不是类。接口不能实例化自身,因为其上没有实现。接口不是对象。接口是一个相关功能组,是客户和对象之间通信的二进制标准。接口具有很强的类型性。每个接口都有自己的接口标识符,因此消除了具有人们易读相同名字接口间可能的冲突。接口是不变的。接口从来没有版本。一旦接口被定义和公布就不能改变。,COM接口,使用一个接口实例化一个COM类DimAs接口集合了属性和方法,DimpGarbageAsIDriveSetpGarbage=NewGarbageTruckpGarbage.Fuel=FullpGarbage.Accelerate,使用ArcObjectsCOM类,更多的接口例子,一个组合音响的例子一个对象可以播放收音机、磁带、CD必须使用适当的接口如果选择了播放磁带的接口,则不能收听收音机,DimpBBoxAsITapeSetpBBox=NewBoomBoxpBBox.FM=True,IDrive燃料加速刹车,多态,许多不同的类可以支持相同的接口拥有相同的所有的方法和属性可以有不同的执行方式和拥有不同的属性值,多态,ArcObjects多态,许多ArcGIS的类都表现出多态的特性所有的子类都是集成了接口ILayer:Alllayertypes(raster,tin,feature,etc.)IGxFile:AllArcCatalogfiletypes(shapefile,map,table,etc.)IActiveView:Map(dataview)andPageLayout(layoutview)Severalothers,使用接口的属性和方法,定义一个指向接口的遍历实例化一个对象调用方法和设置属性只能使用定义的接口的属性和方法,CreateanewRaceCarwithIDriveDimpCarAsIDriveSetpCar=NewRaceCarpCar.AcceleratepCar.Fuel=FullpCar.PitStop,CreateanewRaceCarwiththeIDriveinterfaceDimpCarAsIDriveSetpCar=NewRaceCarpCar.AccelerateSwitchinterfacesDimpRaceAsIRaceSetpRace=pCarpRace.PitStoppCar.Accelerate*pCarandpRacepointtothesameobject*,取得其他的接口,接口查询(QI)访问其它接口的属性和方法,QI,RaceCar,Accelerate,Brake,Fuel,PitStop,LapTime,IRace,IDrive,DimpAreaAsIAreaDimpPtAsIPointSetpArea=pPolygonQIforIAreaonpPolygonSetpPt=pArea.Center,测试一个对象的引用关系,IsanobjectNothing?,WhatTypeOfobjectisit?,IfTypeOfpLayerIsIFeatureLayerThenMsgBoxYouselectedaFeatureLayer.ElseMsgBoxThislayerisnotaFeatureLayer.EndIf,IfpLayerIsNothingThenMsgBoxYoumustselectalayer.ExitSubEndIf,COM类代码,接口模块定义方法和属性类模块实现方法和属性客户端模块实例化类使用方法和属性,Client,Server,Interface,使用类库命名空间,许多类库中有相同的类名和接口名可以明白地引用对象库在EsriCore库中创建一个新的点和线对象DimpPointAsesriCore.IpointDimpLineAsesriCore.IlineSetpPoint=NewPointSetpLine=NewLine,使用ESRIObject浏览器,列表类、接口、属性和方法位置:ArcGISDeveloperKittoolsEOBrowser.exe,理解对象模型OMD图(2),小节内容,ArcObject的对象模型图(ObjectModelDiagramsOMD)阅读一个对象的模型图类的类型类的相互关系接口、属性、方法的图标根据OMD图表编写程序,OMD图表可以帮助编写代码显示每一个类的接口、方法和属性显示类与类之间的相互关系ArcGIS在几个图表中拥有超过1,500个类超过1,600个接口,ArcObjectOMD对象模型图,在哪里可以找到ArcGISOMD图表,StartProgramsArcGISDeveloperHelp简单的、详细的类图PDFfiles电子书籍光盘中软件安装的目录中,解析对象模型图,抽象类:不能用于创建对象,对子类例程进行了规定(通过类型继承)。类:不能直接创建对象,但可以作为另一个类的属性或者通过另一个类的实例化来创建对象。实例化类:可以直接创建对象。关联关系:表示类之间的关系。关联的两端都定义了多样性。组成关系:是一种“整体类”对象控制着“部分类”对象的生命期关系。类型继承关系:定义共享父类的属性和方法,同时又具有了自己独特的属性和方法的特定对象类。实例化关系:表示某个类的对象具有创建另一个类的对象的方法。N元关系:表示两个以上的类相互关联。在各个关联分支的交叉点上放置一个菱形。多样性关系:是对能于另一个对象关联的对象数目的一种限制。关联和组成关系的两端都定义了多样性。,解析对象模型图,ArcObjectsUML关系符号例子,继承组成用来创建对应关系1:N联合,*,_,蛋,鸟,翅膀,羽毛,2,Abstract,Class,Class,Class,鸡,CoClass,巢,CoClass,*,类和他们相应的对象,ArcObjects对象例子,MxDocument,Map,Layer,*,*,FeatureLayer,Application,ArcEngine没有这个层次对象,不能创建或实例化抽象类永远不能有实例为子类定义了泛化(general)子类集成了抽象类的接口抽象类的OMD符号:2维阴影矩形,抽象类(没有阴影),类(Class),不能直接创建的类不能使用New关键字来创建从其它对象处获得实例实例化类的OMD符号:3维没有阴影的矩形,生成,DimpNewRowAsIRowSetpNewRow=pTable.CreateRowIRowrow=table.CreateRow();,可以创建:使用New关键字DimpMapAsIMapSetpMap=NewMapIMappmap=newMapClass();实例化:从其它对象获得DimpMapAsIMapSetpMap=pMxDocument.FocusMappMap=m_MapDocument.get_Map(i);可创建类的OMD符号:3维阴影矩形,可创建的类(CoClass),属性和方法的符号,属性哑铃形状的图标方法,属性传值:大部分ArcObjects的属性属性保存了一个对象的值或者一个拷贝不需要使用Set关键字属性传引用:一些ArcObjects的属性属性保存了一个对象的引用必须使用Set关键字如果引用对象发生了变化,对象的属性将同步受到影像,设置属性,pLayer.Name=PortMoresbyNoSetkeyword,SetpLayer.FeatureClass=pMoresbyDataMustuseSet!,返回值Name:String返回一个对象的引用Document:IDocumentStatusBar:IStatusBar,取得属性值,返回一个值DimstrNameAsStringDimpDocAsIDocumentDimpBarAsIStatusBarstrName=Application.NameMsgBoxstrName返回一个引用SetpDoc=Application.DocumentSetpBar=Application.StatusBarpBar.Message(0)pDoc.Title,接口棒棒糖类型的图标(),查找接口,这些接口也是有效的。但是详细的属性和方法必须在其它地方浏览。(e.g.,ObjectBrowser).,该接口被本类使用.所有的属性和放都列表在类图中.,继承接口是有效的,FeatureLayeronMapLayerOMD,概念上,这是一个对象模型事实上,被分别在几张图表里存放虫洞表现了图表与图表间的连接关系,ArcObjectsOMD图表上的虫洞,ElementonArcMapOMD,虫洞,例子:MxDocumentMaplayer,从当前的文档中取得聚焦的Map(activedataframe)MxDocument可以包含一些Maps(*)从一个Map中取得图层对象图层对象有多种的类型(),DimpMxDocAsIMxDocumentSetpMxDoc=LoadMxdDoc(”c:Temptest.mxd”)DimpMapAsIMapSetpMap=pMxDoc.FocusMapDimpLayerAsILayerSetpLayer=pMap.Layer(1)IspLayeraFeatureLayer?IfTypeOfpLayerIsIFeatureLayerThenMsgBoxYes!,itsafeaturelayerEndIf,MxDocument,Map,FeatureLayer,Layer,*,*,Others,地图和图层(3),小节内容,访问maps和layers遍历maps和layers使用集合对象Collections枚举对象Enumerations创建一个新的图层使用图层对象的属性设置一个图层的数据源,Maps和Layers的对象模型图,FeatureLayer,Map,MxDocument,*,*,Layer,FeatureDataset,*,Geodatabase,FeatureClass,Table,DataSet,0.1,MapLayer,访问maps,从MxDocument中访问mapsGettheactivemapGetallmaps(IMaps)AcollectionofMaps,DimpMxDocAsIMxDocumentSetpMxDoc=LoadMxdDoc(”c:Temptest.mxd”)DimpMapAsIMapSetpMap=pMxDoc.FocusMap,DimpAllMapsAsIMapsSetpAllMaps=pMxDoc.Maps,一个地图文档可以包含有多个数据框,每个数据框都可以拥有不同的图层和表现。FocusMap是指向当前活动的数据框,访问layers,从Map或MxDocument中访问layers取得被选中的图层(IMxDocument)取得一个指定的图层(IMap)Getalllayers(IMap)Anenumerationoflayers,DimpLayerAsILayerSetpLayer=pMxDoc.SelectedLayer,DimpAllLayersAsIEnumLayerSetpAllLayers=pMap.Layers,DimpLayerAsILayerSetpMap=pMxDoc.FocusMapSetpLayer=pMap.Layer(3),遍历Maps集合,Maps是一个有序的集合使用索引号来引用(index)第一个条目的索引号为0,MapcollectionexampleDimintIndexAsIntegerDimpMapsAsIMapsSetpMaps=pMxDoc.MapsForintIndex=0TopMaps.Count-1MsgBoxpMaps.Item(intIndex).NameNexttIndex,SyntaxExampleForToprocesschitemNext,遍历一个Map对象中的图层对象,Imap的Layers属性返回一个IEnumLayers对象枚举对象类似于集合(collection)对象,只是属性方法较少Next方法返回一个Ilayer对象Reset方法把指针指向条目的顶部,SetpLayer=pLayers.Next,Nothing,pLayers.Reset,IEnumLayerTop,SetpLayer=pLayers.Next,SetpLayer=pLayers.Next,SetpLayer=pLayers.Next,DimpLayerAsILayerDimpLayersAsIEnumLayerSetpLayers=pMap.Layers,使用DoWhile或DoUntil根据一个Boolean值来循环,LayerenumexampleDimpLayerAsILayerDimpMapLayersAsIEnumLayerSetpMapLayers=pMap.LayersSetpLayer=pMapLayers.NextDoUntilpLayerIsNothingMsgBoxpLayer.NameSetpLayer=pMapLayers.NextLoop,Nothing,SyntaxExampleDoUntil/WhileRunthiscodeLoop,!,在循环中控制流向,当条件为真的时候提前退出循环ForNextloops:ExitForDoWhileandDoUntilloops:ExitDo,DimpCityMapAsIMapDimXAsIntegerForX=0TopMaps.Count-1IfpMaps.Item(X).Name=Cities“ThenSetpCityMap=pMaps.Item(X)ExitForEndIfNextXMsgBoxAllDone,vbInformation,循环语句回顾,指定次数的循环ForNext根据条件循环DoWhileDoUntil小心无限循环,HereisanEndlessLoopDoWhileNotMsgBox(AddaRecord?)=vbYesCodeheretoaddarecordtoatableMsgBoxRecordAddedLoop,添加一个新的图层到map中,Layer是一个抽象类:不能创建可以创建Layer的子类:TinLayer,FeatureLayer,RasterLayer,etc.,MakeaNewFeatureLayerDimpFLayerAsILayerSetpFLayer=NewFeatureLayerAddalayertoMxDocumentorMapDimpMxDocAsIMxDocumentDimpMapAsIMapSetpMxDoc=ThisDocumentSetpMap=pMxDoc.FocusMappMap.AddLayerpFLayer,没有设置数据源,所以图标为失去数据连接的状态。,使用图层对象的属性,Ilayer接口的属性Name,Visible,ShowTips,MaximumScale,MinimumScale,etc.IGeoDataset接口属性Extent,SpatialReference,这些代码可以用于访问文档对象选择中的任何种类的图层。DimpLayerAsILayerSetpLayer=pMxDoc.SelectedLayer设置基础的Layer的属性pLayer.Name=StreetspLayer.Visible=TruepLayer.ShowTips=False,设置FeatureLayer的数据源属性,FeatureClass属性(IFeatureLayer)指定显示的数据源以传引用的方式(mustusetheSetkeyword),MakeanewFeatureLayerDimpFLayerAsIFeatureLayerSetpFLayer=NewFeatureLayerGetanotherlayersFeatureClassDimpFClassAsIFeatureClassSetpFClass=pSomeOtherLayer.FeatureClassSetthenewlayersFeatureClasspropertySetpFLayer.FeatureClass=pFClass,数据访问和创建(4),小节内容,数据创建对象WorkspaceFeatureDatasetFeatureClass使用fields和field集合对象创建一个Tables和FeatureClasses添加一个记录行编辑一个表的属性数据,FeatureClasses,Workspace,FeatureDataset,数据创建对象,Table,Fields,Field,1.,Dataset,Workspace,WorkspaceFactory,AccessWorkspaceFactory,Row,*,FeatureClass,ArcInfoWorkspaceFactory,ShapefileWorkspaceFactory,Others,*,打开一个现有的Workspace,使用IWorkspaceFactory去创建一个Workspace对象其它子类的WorkSpaceFactory都是WorkspaceFactory的泛化。OpenFromFile:访问一个磁盘上现有的文件目录Open:连接到一个现有的数据库(e.g.,ArcSDE),DimpWFactoryAsIWorkspaceFactorySetpWFactory=NewArcInfoWorkspaceFactory,DimpWorkspaceAsIWorkspaceSetpWorkspace=pWFactory.OpenFromFile(D:Covers,0),访问FeatureDataset,使用Workspace对象的IFeatureWorkspace接口OpenFeatureDatasetmethod,DimpFWorkspaceAsIFeatureWorkspaceSetpFWorkspace=pWorkspaceQIforIFeatureWorkspaceDimpCoverAsIFeatureDatasetSetpCover=pFWorkspace.OpenFeatureDataset(streets),FeatureClasses,Workspace,FeatureDataset,访问FeatureClasses,使用IFeatureClassContainer去取得一个FeatureDataset中的所有FeatureClasses对象,DimpFCCAsIFeatureClassContainerDimpStreetArcsAsIFeatureClassSetpFCC=pCoverQIforIFeatureClassContainerSetpStreetArcs=pFCC.ClassByName(arc),FeatureClasses,Exercise9Aoverview,AddaShapeFilelayertoamap,PrivateSubAddShapeFile_Click()DimpWFAsIWorkspaceFactorySetpWF=NewShapefileWorkspaceFactoryDimpFWSAsIFeatureWorkspaceSetpFWS=pWF.OpenFromFile(C:USA,0)DimpFClassAsIFeatureClassSetpFClass=pFWS.OpenFeatureClass(STATES)DimpFLayerAsIFeatureLayerSetpFLayer=NewFeatureLayerSetpFLayer.FeatureClass=pFClassDimpDatasetAsIDatasetSetpDataset=pFClasspFLayer.Name=pDataset.NameDimpDocAsIMxDocumentSetpDoc=ThisDocumentpDoc.AddLayerpFLayerEndSub,使用名称对象(Nameobjects),是一个轻量级的对象使用Iname接口的Open方法去返回对象有一些可以创建的子类,DimpNameasINameSetpName=pFeatureClassNameSetpFeatureClass=pName.Open,创建一个新的Workspace,使用IWorkspaceFactory去取得WorkspaceName调用Create方法使用IName去取得Workspace对象调用Open方法,例子:创建一个新的Workspace,使用Create方法取得一个WorkspaceName.参数1)theparentfolder,2)thename,3)aPropertySet,and4)anhWndDimpWorkNameAsIWorkspaceNameSetpWorkName=pShapeFileWSFactory.Create(C:Data,MyFiles,Nothing,0)使用Open方法返回一个WorkSpace对象DimpNameAsINameSetpName=pWorkNameQueryInterfacetogettheINameinterfaceDimpShapeWSpaceAsIWorkspaceSetpShapeWSpace=pName.OpenOpenonanyNamereturnstheobject,通过Iname打开ArcSDE中的FeatureClass,DimpInWsNameAsIWorkspaceNameDimpInPropSetAsIPropertySetSetpInPropSet=NewPropertySetWithpInPropSet.SetPropertySERVER,cuillin.SetPropertyINSTANCE,cuillin_ora.SetPropertyDATABASE,.SetPropertyUSER,jim.SetPropertyPASSWORD,jim.SetPropertyVERSION,SDE.DEFAULTEndWithSetpInWsName=NewWorkspaceNamepInWsName.WorkspaceFactoryProgID=esricore.SDEWorkspaceFactorypInWsName.ConnectionProperties=pInPropSet,DimpInFCNameAsIFeatureClassNameSetpInFCName=NewFeatureClassNameDimpDatasetNameAsIDatasetNameSetpDatasetName=pInFCNameQIpDatasetName.Name=CountiesSetpDatasetName.WorkspaceName=pInWsNameDimpNameAsINameSetpName=pInFCNameSetpInFeatureClass=pName.Open,创建一个新的Table或FeatureClass,使用Workspace的IFeatureWorkspace接口CreateTable和CreateFeatureClass方法需要一个Fields集合对象,Field类和Fields类,Tables与FeatureClasses都有一个关联的FieldsAFieldsisaCollectionAFieldsobjecthasFieldobjectsOneorseveral(1.*)Creatable,IFieldandIFieldEdit,通过Ifield接口来访问field对象的属性Read-only使用IFieldEdit来设置field对象的属性Write-onlyDimpNameFieldAsIFieldEditSetpNameField=NewFieldWithpNameField.Name=StreetName.Type=esriFieldTypeString.Length=16EndWith,创建一个Fields集合,使用IFieldsEdit接口AddField方法:把一个field对象加入到集合中,DimpFieldsEditAsIFieldsEditSetpFieldsEdit=NewFieldspFieldsEdit.AddFieldpOIDFieldpFieldsEdit.AddFieldpNameFieldpFieldsEdit.AddFieldpSalesField,Field=Fields!,CreatingaTableorFeatureClass,使用WorkSpace对象的IFeatureWorkspace接口CreateTableandCreateFeatureClassmethods,DimpTableAsITableSetpTable=pFeatureWorkspace.CreateTable_(Store55“,pFieldsEdit,Nothing,Nothing,“),TableName,FieldsCollection,ArcSDEConfigurationKeyword,如果是创建FeatrueClass则需要指定FeatureType和ShapeFieldName参数,创建一个ShapeFile类型的FeatureClass,PublicSubCreateShapefile()ConststrFolderAsString=D:DataConststrNameAsString=MyShapeFile不要加Shp后缀ConststrShapeFieldNameAsString=Shape打开用来放置ShapeFile文件的目录作为一个WorkSpaceDimpFWSAsIFeatureWorkspaceDimpWorkspaceFactoryAsIWorkspaceFactorySetpWorkspaceFactory=NewShapefileWorkspaceFactorySetpFWS=pWorkspaceFactory.OpenFromFile(strFolder,0)设置一个简单的字段集合对象DimpFieldsAsIFieldsDimpFieldsEditAsIFieldsEditSetpFields=NewesriCore.FieldsSetpFieldsEdit=pFieldsDimpFieldAsIFieldDimpFieldEditAsIFieldEdit创建一个Shape字段,它需要一个Geometry定义和空间引用对象SetpField=NewesriCore.FieldSetpFieldEdit=pFieldpFieldEdit.Name=strShapeFieldNamepFieldEdit.Type=esriFieldTypeGeometry定义Geometry属性和空间引用DimpGeomDefAsIGeometryDefDimpGeomDefEditAsIGeometryDefEdit,SetpGeomDef=NewGeometryDefSetpGeomDefEdit=pGeomDefWithpGeomDefEdit.GeometryType=esriGeometryPolygonSet.SpatialReference=NewUnknownCoordinateSystemEndWithSetpFieldEdit.GeometryDef=pGeomDefpFieldsEdit.AddFieldpField添加其它字段SetpField=NewesriCore.FieldSetpFieldEdit=pFieldWithpFieldEdit.Length=30.Name=MiscText.Type=esriFieldTypeStringEndWithpFieldsEdit.AddFieldpField创建Shape文件,一些用于GeoDatabase的可选参数可以设置为NothingDimpFeatClassAsIFeatureClassSetpFeatClass=pFWS.CreateFeatureClass(strName,pFields,Nothing,Nothing,esriFTSimple,strShapeFieldName,)EndSub,在一个Table对象中使用fields对象,IFields接口FieldCount返回所有字段的数目FindField返回查找的字段的索引号Field返回指定索引号的字段,ForintLoop=1TopFClass.Fields.FieldCount1MsgBoxpFClass.Fields.Field(intLoop).NameNextintLoopintFieldNum=pTable.Fields.FindField(“Area)IfintFieldNum-1Then-1meansthefieldwasnotfoundSetpAreaField=pTable.Fields.Field(intFieldNum)EndIf,Addingrowsandvaluestoatable,调用Itable对象的CreateRow方法,返回一个Row对象调用IFeatureClass的CreateFeature方法则返回一个Feature对象属性值使用Get或set方法了进行赋值指定字段的索引号,DimpRowAsIRowSetpRow=pTable.CreateRowpRow.Value(1)=JesseWhiteNamepRow.Value(pTable.FindField(Age)=35AgepRow.Store,保存提交新的行,Feature有一个Shape属性来保几何对象,几何对象(5),小节内容,几何对象几何对象的操作绘制几何对象,线段:在曲线的起点和终点之间线段集合成paths/ringsPaths/rings集合成lines/polygons可以在任何层次上编辑,Featuregeometry,几何对象的类图,Point,MultiPoint,Ring,Path,Segment,Geometry,Envelope,Curve,Polyline,Line,BezierCurve,CircularArc,Polycurve,*,*,*,Polygon,*,Geometrycollection,*,点对象和多点对象,点是零维的通过X、Y坐标来定义可以拥有Z和M属性值Multipoints是points的集合,Point,Multipointwithsixpoints,DimpPointAsIPointSetpPoint=NewPointpPoint.X=300pPoint.Y=450DimpMultiPtsAsIPointCollectionSetpMultiPts=NewMultiPointpMultiPts.AddPointpPoint,由起点、终点和方程定义三个方面组成子类:Line,BezierCurve,CircularArc线段用来创建其它的几个对象Paths,polylines,rings,andpolygonsDimpSegmentAsILineSetpSegment=NewLinepSegment.FromPoint=pPointApSegment.ToPoint=pPointB,线段Segments,From,To,Pathsandpolygons,Polylines由一组闭合或不闭合的Paths组成Polygons由一个或多个rings组成,Pathwithfoursegments,Polygonwithsevenrings,Envelopes,定义了feature的空间范围最小外接矩形所有的几何对象都有Envelop属性GetorsetwithIGeometry:EnvelopeDimpEnvelopeAsIEnvelopeSetpEnvelope=pLine.Envelope,缩放地图到一个图形(居中显示),通过图形(shape)的最小外接矩形(Envelope)来设置地图范围使用IGeometry接口设置ActiveView的Extent属性为图形的Envelope,Feature,Geometry,Envelope,1PolygonFeature,pMxDoc.ActiveView.Extent=pFeature.Shape.EnvelopepMxDoc.ActiveView.Refresh,缩放地图到一个图形(居中显示),通过图形(shape)的最小外接矩形(Envelope)来设置地图范围使用IGeometry接口设置ActiveView的Extent属性为图形的Envelope,Feature,Geometry,Envelope,1PolygonFeature,pMxDoc.ActiveView.Extent=pFeature.Shape.EnvelopepMxDoc.ActiveView.Refresh,Displayingfeatures,调用IScreenDisplay接口的几个Draw方法StartDrawing:为绘制准备显示环境DrawPoint,DrawMultipoint,DrawPolyline,DrawPolygonFinishDrawing:把缓存中的内容绘制到屏幕上显示Feature的例子DimpDisplayAsIScreenDisplaySetpDisplay=pMxApplication.DisplaypDisplay.StartDrawingpDisplay.HDC,esriNoScreenCachepDisplay.SetSymbolpSympDisplay.DrawPolygonpPolygonpDisplay.FinishDrawing,Geometryspatialoperatorinterfaces,由Geometry的子类提供支持接口ITopologicalOperator(空间操作)IProximityOperator(测量)IRelationalOperator(检查)用于完成例如buffer,cut,clip等空间操作测量shapes之间的距离检查空间关系通过空间标准来进行查询,ITopologicalOperator,提供方法去操作几何对象由Point,Multipoint,Polyline,andPolygon提供,DimpTopoOpAsITopologicalOperatorDimpBuffPolyAsIPolygonSetpTopoOp=pFeature.ShapeSetpBuffPoly=pTopoOp.Buffer(intBufferDistance),Buffer,Intersect,Union,Cut,Clip,IRelationalOperator,提供检查空间关系的功能(returnBoolean)Equals:几何对象在空间上是否相同?Touches:边界是否接触?Contains:是否是包容关系?其它操作,DimpRelationOpAsIRelationalOperatorDimbooTouchesAsBooleanSetpRelationOp=pPolybooTouches=pRelationOp.Touches(pAnotherPoly),IProximityOperator,提供检查两个空间对象的相邻关系功能ReturnDistance:返回两个空间对象间的最短距离(double)ReturnNearestPoint:在指定的要素上返回最近的点(point),DimpProxOpAsIProximityOperatorDimdblDistanceAsDoubleSetpProxOp=pLinedblDistance=pProxOp.ReturnDistance(pSomeOtherLine),Areaandlength,每一个feature对象都是Geometry的一种具体类型可以通过接口查询去引用Curve(Linefeatures)或Polygon对象。,DimpAreaAsIAreaSetpArea=pPolyQIMsgboxpArea.Area,DimpCurveAsICurveSetpCurve=pLineQIMsgboxpCurve.Length,使用子集和选择集(6),小节内容,从Table或Layer对象中取得当前的选择集SelectionSet从records对象中取得一个subset游标Cursor特征游标FeatureCursor查询过滤器和空间过滤器QueryFiltersandSpatialFilters三种可定义的游标:Search,Update,andInsert遍历一个cursor的记录显示一个图层要素的subset,对象模型,Table,Cursor,FeatureClass,FeatureCursor,QueryFilter,Row,Feature,SelectionSet,SpatialFilter,选择集SelectionSet,取得当前被选定的记录(RowsorFeatures)IFeatureSelection:SelectionSet(FeatureLayer)ITableWindow:SelectionSet(TableWindow),PublicSubGetLayerSelection()DimpMxDocAsIMxDocumentDimpFSelAsIFeatureSelectionDimpSelSetAsISelectionSetSetpMxDoc=ThisDocumentSetpFSel=pMxDoc.SelectedLayerQueryInterfaceSetpSelSet=pFSel.SelectionSetMsgBoxpSelSet.Count&selectedfeaturesEndSub,创建一个过滤器QueryFilter,使用New关键字来创建QueryFilter设置它的WhereClause属性(string),QueryFilter,WhereClause,DimpQFilterAsIQueryFilterSetpQFilter=NewQueryFilterpQFilter.WhereClause=LENGTH100000,返回一个查询游标(Searchcursor),应用于Table或者FeatureClassSearch方法返回一个Cursor或者FeatureCursor,DimpFCursorAsIFeatureCursorSetpFCursor=pFClass.Search(pQFilter,True),你认为以下语句的结果是什么?(all!)SetpFCursor=pFClass.Search(Nothing,True),FeatureClass,Search,QueryFilter,空间过虑器SpatialFilter,QueryFilter的一种子类作用是根据空间关系选择要素,GeometryPropertyPointLinePolygon,SpatialRelPropertyInsideContainsIntersectsEtc,DimpSFilterAsISpatialFilterSetpSFilter=NewSpatialFilterSetpSFilter.Geometry=pBufferPolygonpSFilter.SpatialRel=esriSpatialRelContainsSetpFCursor=pCityFClass.Search(pSFilter,True),三种类型的cursors,由调用的方法来决定返回的游标SearchcursorSearchmethod用来进行只读分析UpdatecursorUpdatemethod用来对数据库记录进行update或delete操作InsertcursorInsertmethod用来对数据库记录进行Insert操作,DimmyCursorAsIFeatureCursorSetmyCursor=pFClass.Search(pQFilter,False),DimmyCursorAsIFeatureCursorSetmyCursor=pFClass.Update(pQFilter,False),DimmyCursorAsIFeatureCursorSetmyCursor=pFClass.Insert(True),访问游标中的记录,当游标初始化完成,游标指针指向第一个位置的上面使用NextRow/NextFeature方法来返回一个Row/Feature,SetmyRow=myCursor.NextRowSetmyRow=myCursor.NextRowSetmyRow=myCursor.NextRowSetmyRow=myCursor.NextRow,myCursorinitializeshere,Nothing,DimmyCursorAsICursorSetmyCursor=pTable.Sear
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!