GIS二次開發第7課教程課件_第1頁
GIS二次開發第7課教程課件_第2頁
GIS二次開發第7課教程課件_第3頁
GIS二次開發第7課教程課件_第4頁
GIS二次開發第7課教程課件_第5頁
已閱讀5頁,還剩229頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

GIS二次開發主講:張云鵬GIS二次開發主講:張云鵬第七課空間數據管理GeoDatabase的基礎知識Workspace及相關對象Dataset對象表、對象類和要素類ROW,Object和Feature對象第七課空間數據管理GeoDatabase的基礎知識7.1GeoDatabase的基礎知識在AO(AE)中,各種類型的空間數據都采用統一的對象模型

——

Geodatabase數據模型進行操作。7.1GeoDatabase的基礎知識在AO(AE)中,各GIS二次開發第7課教程課件7.2Workspace及相關對象在Geodatabase數據模型中,一個工作空間對應于一個geodatabase或一個ArcInfo

coverage工作空間或一個文件夾(內有地理數據文件)。工作空間是空間數據集與非空間數據集的容器。由esriWorkspaceType枚舉類型指定的Workspace有三種類型:esriFileSystemWorkspace:基于文件類型的Shapefiles和ArcInfo的工作空間esriLocalDatabaseWorkspace:Personal/FilegeodatabaseesriRemoteDatabaseWorkspace:ArcSDEgeodatabase7.2Workspace及相關對象在Geodatabas其它workspace類型包括:RasterWorkspace:AworkspacecontainingGridsandImages.TinWorkspace:AworkspacecontainingTINs.CADWorkspace:AworkspacecontainingCADdrawings.VPFWorkspace:AworkspacecontainingVPFdata.

其它workspace類型包括:要操作各種類型的空間數據,首先要獲得空間數據所在的工作空間。Workspace(工作空間)是一個普通類(Class),這意味著用戶不能直接新建它。為了獲得一個工作空間,需要使用WorkspaceFactory對象來創建或打開一個Workspace。WorkspaceFactory是GeoDatabase的入口。它是一個抽象類,派生了很多的子類,例如SdeWorkspaceFactory,

AccessWorkspaceFactory,ShapefileWorkspaceFactory

FileGDBWorkspaceFactory等。不同類型的空間數據需要不同的工作空間工廠對象來打開一個工作空間。要操作各種類型的空間數據,首先要獲得空間數據所在的工作空間。ClassesthatimplementIWorkspaceFactoryClassesClassesAccessWorkspaceFactory(esriDataSourcesGDB)PlugInWorkspaceFactoryAMSWorkspaceFactory(esriTrackingAnalyst)RasterWorkspaceFactory(esriDataSourcesRaster)ArcInfoWorkspaceFactory(esriDataSourcesFile)SDCWorkspaceFactory(esriDataSourcesFile)CadWorkspaceFactory(esriDataSourcesFile)SdeWorkspaceFactory(esriDataSourcesGDB)ExcelWorkspaceFactory(esriDataSourcesOleDB)ShapefileWorkspaceFactory(esriDataSourcesFile)FileGDBWorkspaceFactory(esriDataSourcesGDB)SqlWorkspaceFactory(esriDataSourcesGDB)GeoRSSWorkspaceFactory(esriDataSourcesFile)StreetMapWorkspaceFactory(esriDataSourcesFile)IMSWorkspaceFactory(esriGISClient)TextFileWorkspaceFactory(esriDataSourcesOleDB)InMemoryWorkspaceFactory(esriDataSourcesGDB)TinWorkspaceFactory(esriDataSourcesFile)NetCDFWorkspaceFactory(esriDataSourcesNetCDF)ToolboxWorkspaceFactory(esriGeoprocessing)OLEDBWorkspaceFactory(esriDataSourcesOleDB)VpfWorkspaceFactory(esriDataSourcesFile)PCCoverageWorkspaceFactory(esriDataSourcesFile)ClassesthatimplementIWorkspIWorkspaceFactory接口定義了所有工作空間工廠對象的一般屬性和方法,用戶可以通過它管理不同類型的工作空間。IWorkspaceFactory

IWorkspaceFactory接口定義了所有工作空間工廠使用IWorkspaceFactory::Create方法可以用于產生一個新的工作空間名稱對象。publicIWorkspaceNameCreate(

stringparentDirectory,

stringName,

IPropertySetConnectionProperties,

inthWnd

);IWorkspaceFactory::Open方法和IWorkspaceFactory::OpenFromFile方法可以用于打開一個已經存在的工作空間。publicIWorkspaceOpen(IPropertySetConnectionProperties,inthWnd);publicIWorkspaceOpenFromFile(stringfileName,inthWnd);IWorkspaceFactory::WorkspaceType屬性可以返回工作空間的類型。使用IWorkspaceFactory::Create方法7.2.1HowtocreatenewgeodatabasesCreatingapersonalgeodatabaseworkspacestoredinAccessprivateIWorkspace

CreateAccessWorkspace(){IWorkspaceFactorypAccessWorkspaceFactory=newAccessWorkspaceFactoryClass();IWorkspaceName

pWorkspaceName=pAccessWorkspaceFactory.Create(@"d:\temp","test.mdb",null,0);ESRI.ArcGIS.esriSystem.INamename=(IName)pWorkspaceName;IWorkspacepGDB_Wor=(IWorkspace

)name.Open();returnpGDB_Wor; }7.2.1HowtocreatenewgeodaCreatingafilegeodatabaseworkspace//Createafilegeodatabaseworkspacefactory.IWorkspaceFactoryworkspaceFactory=newFileGDBWorkspaceFactoryClass();//Createanewfilegeodatabase.IWorkspaceNameworkspaceName=workspaceFactory.Create("C:\\temp\\","MyFGDB.gdb",null,0);INamename=(IName)workspaceName;//Openareferencetothefilegeodatabaseworkspacethroughthenameobject.IWorkspacefGDB_Wor=(IWorkspace)name.Open();CreatingafilegeodatabasewopublicstaticIWorkspaceCreateFileGdbWorkspace(Stringpath)

{

TypefactoryType=Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");

IWorkspaceFactoryworkspaceFactory=(IWorkspaceFactory)Activator.CreateInstance(factoryType);

IWorkspaceNameworkspaceName=workspaceFactory.Create(path,"Sample.gdb",null,0);

INamename=(IName)workspaceName;

IWorkspaceworkspace=(IWorkspace)name.Open();returnworkspace;

}publicstaticIWorkspaceCreatCreatingaconnectionfile(.sde)toanEnterpriseArcSDEworkspacepublicIWorkspaceNameopen_ArcSDE_Workspace

(stringserver,stringinstance,stringuser,stringpassword,stringdatabase,stringversion){IPropertySetpropertySet=newPropertySetClass();propertySet.SetProperty("SERVER",server);propertySet.SetProperty("INSTANCE",instance);propertySet.SetProperty("DATABASE",database);propertySet.SetProperty("USER",user);propertySet.SetProperty("PASSWORD",password);propertySet.SetProperty("VERSION",version);

IWorkspaceFactory2workspaceFactory=(IWorkspaceFactory2)newSdeWorkspaceFactoryClass();returnworkspaceFactory.Create("d:\\temp\\","myconnection.sde",propertySet,0);}Creatingaconnectionfile(.sCreatingageodatabaseinapersonalorworkgroupArcSDEworkspace//Createadataservermanagerobject.IDataServerManagerdataserverManager=newDataServerManagerClass();//Settheservernameandconnecttotheserver.dataserverManager.ServerName="tivo\\sqlexpress";dataserverManager.Connect();//Openoneofthegeodatabasesinthedatabaseserver.IDataServerManagerAdmindataservermanagerAdmin=(IDataServerManagerAdmin)dataserverManager;IWorkspaceNameworkspaceName=dataservermanagerAdmin.CreateWorkspaceName("sewer","VERSION","dbo.Default");INamename=(IName)workspaceName;IWorkspaceGDB_wor=(IWorkspace)name.Open();Creatingageodatabaseinape7.2.2Howtoconnecttoageodatabase有3種不同的方法打開工作空間:IWorkspaceFactory.Open

publicIWorkspace

Open(IPropertySetConnectionProperties,inthWnd);IWorkspaceFactory.OpenFromFile

publicIWorkspace

OpenFromFile(string

fileName,inthWnd);IWorkspaceFactory2.OpenFromStringpublicIWorkspace

OpenFromString(

string

connectStr,

inthWnd);Theconnectstringisacollectionofnamevaluepairsseparatedbyasemicolon(;).thepathnameofafileordirectorythatrepresentseitheraFileSystemWorkspaceorLocalDatabaseWorkspace,oraconnectionfiletoaRemoteDatabaseworkspaceThehWndargumentistheparentwindoworapplication'swindow.ThehWndwillguaranteethattheconnectiondialog,ifpresentedtoyoubecauseofinsufficientproperties,hasthecorrectparent.7.2.2Howtoconnecttoageo(1)打開PersonalGeoDatabae數據庫//Forexample,database="C:\\myData\\mypGDB.mdb".

publicIWorkspaceopen_pGDB_Workspace(stringdatabase)

{IPropertySetpropertySet=newPropertySetClass();propertySet.SetProperty("DATABASE",database);

IWorkspaceFactoryworkspaceFactory=newAccessWorkspaceFactoryClass();returnworkspaceFactory.Open(propertySet,0);}publicIWorkspace

Open(IPropertySet

ConnectionProperties,

inthWnd);(1)打開PersonalGeoDatabae數據庫//F//Forexample,fileName="C:\\myData\\mypGDB.mdb".publicIWorkspaceopenFromFilepGDBWorkspace(stringfileName){IWorkspaceFactoryworkspaceFactory=newAccessWorkspaceFactoryClass();returnworkspaceFactory.OpenFromFile(fileName,0);}publicIWorkspaceOpenFromFile(stringfileName,

inthWnd);//Forexample,connectionString="DATABASE=C:\\myData\\mypGDB.mdb".publicIWorkspaceopenFromStringpGDBWorkspace(stringconnectionString){IWorkspaceFactory2workspaceFactory=(IWorkspaceFactory2)newAccessWorkspaceFactoryClass();returnworkspaceFactory.OpenFromString(connectionString,0);}publicIWorkspaceOpenFromString(stringconnectStr,

inthWnd);"SERVER=myServer;DATABASE=sde;INSTANCE=5151;USER=Editor;PASSWORD=Editor;VERSION=SDE.DEFAULT"http://Forexample,fileName="C:\(2)Connectingtoafilegeodatabaseworkspace//Forexample,database="C:\\myData\\myfGDB.gdb".publicIWorkspaceopen_fGDB_Workspace(stringdatabase){IPropertySetpropertySet=newPropertySetClass();propertySet.SetProperty("DATABASE",database);IWorkspaceFactoryworkspaceFactory=newFileGDBWorkspaceFactoryClass();returnworkspaceFactory.Open(propertySet,0);}publicIWorkspaceOpen(IPropertySet

ConnectionProperties,

inthWnd);(2)Connectingtoafilegeodat//Forexample,fileName="C:\\myData\\myfGDB.gdb".publicIWorkspaceopenFromFile_fGDB_Workspace(StringfileName){IWorkspaceFactoryworkspaceFactory=newFileGDBWorkspaceFactoryClass();returnworkspaceFactory.OpenFromFile(fileName,0);}publicIWorkspaceOpenFromFile(stringfileName,

inthWnd);//Forexample,connectionString="DATABASE=C:\\myData\\myfGDB.gdb".publicIWorkspaceopenFromString_fGDB_Workspace(stringconnectionString){IWorkspaceFactory2workspaceFactory=(IWorkspaceFactory2)newFileGDBWorkspaceFactoryClass();returnworkspaceFactory.OpenFromString(connectionString,0);}

publicIWorkspaceOpenFromString(stringconnectStr,

inthWnd);"SERVER=myServer;DATABASE=sde;INSTANCE=5151;USER=Editor;PASSWORD=Editor;VERSION=SDE.DEFAULT"http://Forexample,fileName="C:\(3)ConnectingtoanenterpriseArcSDEgeodatabaseworkspacepublicIWorkspaceopen_ArcSDE_Workspace(stringserver,stringinstance,stringuser,stringpassword,stringdatabase,stringversion)

{IPropertySetpropertySet=newPropertySetClass();propertySet.SetProperty("SERVER",server);propertySet.SetProperty("INSTANCE",instance);propertySet.SetProperty("DATABASE",database);propertySet.SetProperty("USER",user);propertySet.SetProperty("PASSWORD",password);propertySet.SetProperty("VERSION",version);IWorkspaceFactoryworkspaceFactory=newSdeWorkspaceFactoryClass();returnworkspaceFactory.Open(propertySet,0);}(3)Connectingtoanenterprise(4)打開Shapefile工作空間publicIWorkspaceOpenShapfileWorkspace

(stringLocation){

IWorkspaceFactorywsf=newShapefileWorkspaceFactoryClass();

IWorkspacews=wsf.OpenFromFile(Location,0); returnws;}(4)打開Shapefile工作空間publicIWork7.2.3

Workspace主要接口Workspace實現的主要接口如下表所示.InterfacesDescriptionIDatasetContainer3Providesaccesstoaddingdatasetstothedatasetcontainer.IFeatureWorkspaceProvidesaccesstomembersthatcreateandopenvarioustypesofdatasetsandotherworkspacelevelobjects.IFeatureWorkspaceSchemaEditProvidesaccesstoalteringtheinstanceCLSIDandtheclassextensionCLSID.ITopologyWorkspaceProvidesaccesstomembersthataccessthetopologiesinaworkspace.ITransactionsProvidesaccesstomembersthatcontrolTransactionmanagement.ITransactionsOptionsProvidesaccesstomembersthatcontrolTransactionoptions.IWorkspace2Providesaccesstomembersthathaveinformationabouttheworkspace.IWorkspaceConfigurationProvidesaccesstoconfigurationkeywords.IWorkspaceDomainsProvidesaccesstomembersthatreturninformationaboutdomainsandallowsyoutoaddordeletedomains.IWorkspaceDomains2Providesaccesstomembersthatallowyoutoalteradomain.IWorkspaceEditProvidesaccesstomembersthatcontrolWorkspaceEditing.IWorkspaceReplicaDatasetsProvidesaccesstomembersthatreturnalistofreplicadatasets.IWorkspaceReplicasProvidesaccesstomembersthatreturnobjectscontaininginformationaboutreplicas.IWorkspaceReplicasAdmin3Providesaccesstomembersthatmodifyinformationaboutareplica.7.2.3Workspace主要接口WorkspaceIWorkspace接口IWorkspace接口定義了一個工作空間最普通的屬性和方法。

ConnectionProperties返回工作空間的連接屬性集對象;Datasets屬性可以按照數據集(Dataset)的類型而返回一個數據集枚舉對象;Type和WorkspaceFactory屬性則可以分別返回工作空間的類型和工作空間工廠的種類。IWorkspace接口IWorkspace接口定義了一個publicIEnumDataset

get_Datasets(esriDatasetType

DatasetType);Theget_Datasetsmethodreturnsanenumeratoroverthedatasetsintheworkspaceofthespecifieddatasettype.UsingadatasettypeofesriDTAnywillreturnallthedatasetsordatasetsintheworkspace,acrossalldatasettypes.Notethatonlythetop-leveldatasetsintheworkspacearereturnedbythesemethods.Inparticular,ifaworkspacecontainsbothstand-alonefeatureclassesandadditionalfeatureclassesthatarepartofafeaturedataset,thencallingtheget_DatasetsontheworkspacewithadatasettypeofesriDTFeatureClasswillreturnonlythestandalonefeatureclasses.publicIEnumDatasetget_Datase//拷貝數據庫模式:包括屬性域、要素數據集、要素類(包括要素數據集中的要素類和獨立的要素類)、表

privatevoidCreateSchema(){CopyDomains(sourceWorkspace,targetWorkspace);

IEnumDatasetsourceFeatureDatasets=sourceWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);CreateFeatureDatasetsAndFeatureClasses(sourceFeatureDatasets);

IEnumDatasetfeatureClasses=sourceWorkspace.get_Datasets(esriDatasetType.esriDTFeatureClass);CreateFeatureClassesInWorkspace(featureClasses);

IEnumDatasettables=sourceWorkspace.get_Datasets(esriDatasetType.esriDTTable);CreateTablesInWorkspace(tables);}//拷貝數據庫模式:包括屬性域、要素數據集、要素類(包括要素IFeatureWorkspace接口主要用于管理基于要素的數據集,如表(Table)、對象類(ObjectClass)、要素類(FeatureClass)、要素數據集(FeatureDataset)和關系類(RelationshipClass)等。IFeatureWorkspace接口主要用于管理基于要素的privatevoidmnuAddFeatureClassToMap_Click(objectsender,System.EventArgse){

IWorkspaceFactorywsf=newShapefileWorkspaceFactoryClass();

IFeatureWorkspacepFeatWorkspace=wsf.OpenFromFile(@"D:\ArcTutor\usa",0)asIFeatureWorkspace;

IFeatureClasspFeatClass=pFeatWorkspace.OpenFeatureClass("counties");

IFeatureLayerpFeatLyr=newFeatureLayerClass(); pFeatLyr.FeatureClass=pFeatClass; pFeatLyr.Name=pFeatClass.AliasName;

IMappMap=axMapControl1.Map; pMap.AddLayer(pFeatLyr);}privatevoidmnuAddFeatureClas7.2.4PropertySetPropertyset對象是一個專門用于設置屬性的對象,它是一種name-value對的集合。屬性名必須是字符串,屬性值可以是字符串、數值或日期,也可以是一個對象。屬性值支持通過名字來查找屬性的方法。IWorkspaceFactory::Open方法要求用Propertyset(屬性集合)來打開一個Workspace。7.2.4PropertySetPropertyset對如打開一個SDE數據庫的時候,進行如下配置:IPropertySetpPropertyset=newPropertySetClass();pPropertyset.SetProperty("Server","data");//服務器pPropertyset.SetProperty("Instance","esri_sde");//SDE實例pPropertyset.SetProperty("user","sde");//SDE數據庫的用戶名pPropertyset.SetProperty("password","sde");//SDE數據庫的密碼pPropertyset.SetProperty("version","sde.DEFAULT");//'默認版本如打開一個SDE數據庫的時候,進行如下配置:7.2.5名稱對象名稱(Name)對象標識并且定義了GeoDatabase對象(如數據集或者工作空間)或地圖對象(如圖層)。盡管名稱對象只是它代表的對象的一個“代理”,但它支持程序員使用實例化的特定對象的Open方法。下面是一個使用Open方法實例化的例子:

INamepName=pFeatureClassNameasIName;

IFeatureClasspFeatureClass=pName.Open()asIFeatureClass;名稱對象的子類眾多,如TableName、FeatureClassName、ObjectClassName等。7.2.5名稱對象名稱(Name)對象標識并且定義了Ge7.3Dataset對象Dataset(數據集)是一個代表了Workspace中所謂的數據集合的抽象類,它是一個高級別的數據容器。所有放在工作空間的對象都是一種數據集對象。Dataset對象分為兩大類一種是Table,可以簡單看成是一張二維表,它是由一條條記錄組成的,是保存Row的容器;一種是GeoDataset,地理數據集,如要素數據集、柵格數據集。IDataset接口定義的屬性、方法如右圖所示:7.3Dataset對象Dataset(數據集)是一個代esriDatasetTypeConstantsesriDatasetTypeConstants7.3.1GeoDataset類GeoDataset(地理數據集)是一個抽象類,它代表了擁有空間屬性的數據集。GeoDataset的例子包括要素數據集FeatureDataset、要素類FeatureClass、TIN和柵格數據集RasterDataset等。非GeoDataset的數據集包括Table、對象類ObjectClass和關系類RelationshipClass等。7.3.1GeoDataset類GeoDataset(地IGeoDataset接口定義了GeoDataset對象的空間信息,包括空間參考和范圍屬性。通過IGeoDataset::SpatialRefrence可以獲得一個GeoDataset對象的空間參考,IGeoDataset::Extent則可以獲得要素集的定義范圍。IGeoDatasetSchemaEdit接口可以讓程序員去改變一個GeoDataset的空間參考,IGeoDatasetSchemaEdit::AlterSpatialRefrence方法重新設置與數據集關聯的空間參考。這個方法多使用于給一個空間參考為Unknown的地理數據集設置空間參考。IGeoDatasetSchemaEdit::CanAlterSpatialReferenceIndicatesifthespatialreferenceofthedatasetcanbealtered.IGeoDataset接口定義了GeoDataset對象的空改變一個圖層的空間參考privatevoidAlterSpatialReferrenc(

IMappMap,IFeatureLayerfeaturelayer)

{IActiveViewpActiveView=pMapasIActiveView;

IFeatureClasspFeatureClass=featurelayer.FeatureClass;

IGeoDatasetpGeoDataset=pFeatureClassasIGeoDataset;

IGeoDatasetSchemaEditpGeoDatasetEdit=pGeoDatasetasIGeoDatasetSchemaEdit;

????????????????if(pGeoDatasetEdit.CanAlterSpatialReference==true)

{ISpatialReferenceFactory2pSpatRefFact=newSpatialReferenceEnvironmentClass();

IGeographicCoordinateSystempGeoSys=pSpatRefFact.CreateGeographicCoordinateSystem(4214);//esriSRGeoCSType.esriSRGeoCS_Beijing1954pGeoDatasetEdit.AlterSpatialReference(pGeoSys);

}pActiveView.Refresh();

}改變一個圖層的空間參考privatevoidAlterSGIS二次開發第7課教程課件7.3.2FeatureDataset對象要素數據集對象是具有相同空間參考的要素類的容器。使用要素數據集的情況十分廣泛,例如幾何網絡、拓撲關系必須建立在一個要素數據集中。在工作空間中對一個要素類進行編程的時候,需要注意這個要素類放在什么地方,是直接放在工作空間中(這種要素類被稱為standalonefeatureclass),還是放在一個要素數據集中。當使用IWorkspace::Datasets屬性來遍歷一個工作空間內的數據集時,返回的只是直接放在工作空間的數據集,而保存在一個要素數據集中的要素類則不會被遍歷。7.3.2FeatureDataset對象要素數據集對象使用IFeatureWorkspace::OpenFeatureClass打開工作空間中的任何一個要素類,無論它是直接存放在工作空間還是存放在工作空間中的一個要素數據集中。使用IFeatureWorkspace::OpenFeatIFeatureDataset這個接口是從IDataset接口繼承而來的。使用IFeatureDataset::CreateFeatureClass方法可以用來在要素數據集中創建一個新的要素類。這個方法和IFeatureWorkspace::CreateFeaureClass的方法類似。新建要素類的空間參考是通過它的幾何字段來設置的。IFeatureDataset這個接口是從IDataset接

IEnumDatasetsourceFeatureDatasets=sourceWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);privatevoidCreateFeatureDatasetsAndFeatureClasses(IEnumDatasetsourceFeatureDatasets){if(sourceWorkspace==null||targetWorkspace==null)return;

ISpatialReferencespatialRference;sourceFeatureDatasets.Reset();

IDatasetdataset=sourceFeatureDatasets.Next();while(dataset!=null){IGeoDatasetgeoDataset=datasetasIGeoDataset;spatialRference=geoDataset.SpatialReference;

IFeatureDatasetsourceFeatureDataset=datasetasIFeatureDataset;

IFeatureWorkspacefeatureWorkspace=targetWorkspaceasIFeatureWorkspace;IEnumDatasetsourceFeatureDatif((IWorkspace2)targetWorkspace).get_NameExists

(esriDatasetType.esriDTFeatureDataset,((IDataset)sourceFeatureDataset).Name))dataset=sourceFeatureDatasets.Next();IFeatureDatasettargetFeatureDataset=featureWorkspace.CreateFeatureDataset(dataset.Name,spatialRference);CreateFeatureClassesInDataset(sourceFeatureDataset,targetFeatureDataset);dataset=sourceFeatureDatasets.Next();}}publicbool

get_NameExists(

esriDatasetTypeType,

stringName

);if((IWorkspace2)targetWorkspa//創建要素數據集中的要素類:要素類、拓撲關系publicvoidCreateFeatureClassesInDataset(IFeatureDatasetsourceFeatureDataset,IFeatureDatasettargetFeatureDataset){if(sourceFeatureDataset==null||targetFeatureDataset==null)return;

IEnumDatasetdatasets=sourceFeatureDataset.Subsets;

IDatasetsourceDataset=datasets.Next();while(sourceDataset!=null){switch(sourceDataset.Type){case

esriDatasetType.esriDTFeatureClass:

if(((IWorkspace2)targetWorkspace).get_NameExists

(esriDatasetType.esriDTFeatureClass,sourceDataset.Name))break;

IFeatureClasssourceFeatureClass=sourceDatasetasIFeatureClass;

CreateFeatureClassInThisDataset(sourceFeatureClass,targetFeatureDataset);break;//創建要素數據集中的要素類:要素類、拓撲關系case

esriDatasetType.esriDTNetworkDataset:

INetworkDatasetsourceNetworkDataset=sourceDatasetasINetworkDataset;

CreateNetworkDataset(sourceFeatureDataset,targetFeatureDataset);break;case

esriDatasetType.esriDTRelationshipClass:

CreateRelationshipClassSchema(sourceFeatureDataset,targetFeatureDataset);break;case

esriDatasetType.esriDTTopology:

CreateTopology(sourceFeatureDataset,targetFeatureDataset);break;default:break;}sourceDataset=datasets.Next();}

}caseesriDatasetType.esriDTNetIFeatureClassContainerIFeatureClassContainer接口用于管理要素數據集中的要素類。該接口的ClassByName和Class(index)等屬性都可以用來獲取數據集中的特定的要素類。IFeatureClassContainer::ClassCount和Classes屬性分別可以獲得要素數據集中的要素類的數目和得到一個要素類的枚舉對象。IFeatureClassContainer::ClassByID屬性可以讓程序員通過對象類的ID值返回一個特定的對象類。IFeatureClassContainerIFeaturepublicvoidCreateFeatureClassesInDataset(

IFeatureDataset

sourceFeatureDataset,IFeatureDatasettargetFeatureDataset){IFeatureClassContainersourceFeatureClassContainer=sourceFeatureDatasetasIFeatureClassContainer;

for(inti=0;i<sourceFeatureClassContainer.ClassCount;i++){IFeatureClasssourceFeatureClass=sourceFeatureClassContainer.get_Class(i);

CreateFeatureClassInThisDataset(sourceFeatureClass,targetFeatureDataset);}publicvoidCreateFeatureClassIRelationshipClassContainer接口要素數據集中還可以存儲關系類對象,可以通過這個接口來添加、新建和獲得要素數據集中的關系類對象。IRelationshipClassContainer.CreateRelationshipClass方法可以讓程序員在要素數據集中產生一個新的關系類。publicIRelationshipClass

CreateRelationshipClass(string

relClassName,

IObjectClass

OriginClass,

IObjectClass

DestinationClass,

string

forwardLabel,

string

backwardLabel,

esriRelCardinality

Cardinality,

esriRelNotification

Notification,

bool

IsComposite,

bool

IsAttributed,

IFields

relAttrFields,

string

OriginPrimaryKey,

string

destPrimaryKey,

string

OriginForeignKey,

string

destForeignKey);IRelationshipClassContainer接口要privatevoidCreateRelationshipClassSchema(IFeatureDatasetsourceFeatureDataset,IFeatureDatasettargetFeatureDataset){

IRelationshipClassContainerfromRelClsContainer=sourceFeatureDatasetasIRelationshipClassContainer;

IRelationshipClassContainertoRelClsContainer=targetFeatureDatasetasIRelationshipClassContainer;

IFeatureWorkspacetargetFeatureWorkspace=targetWorkspaceasIFeatureWorkspace;

IEnumRelationshipClassfromRelClasses=fromRelClsContainer.RelationshipClasses;

fromRelClasses.Reset();

IRelationshipClassfromRelClass=fromRelClasses.Next();privatevoidCreateRelationshiwhile(fromRelClass!=null){

stringfromRelClsName=(fromRelClassasIDataset).Name;

esriRelCardinalityfromRelCardinality=fromRelClass.Cardinality;

stringfromFwdPathLabel=fromRelClass.ForwardPathLabel;

stringfromBwdPathLabel=fromRelClass.BackwardPathLabel;

IObjectClassfromOriginCls=fromRelClass.OriginClass;

stringfromOriginPK=fromRelClass.OriginPrimaryKey;

stringfromOriginFK=fromRelClass.OriginForeignKey;

IObjectClassfromDesCls=fromRelClass.DestinationClass;

stringfromDesPK=fromRelClass.DestinationPrimaryKey;

stringfromDesFK=fromRelClass.DestinationForeignKey;

boolfromIsAttributed=fromRelClass.IsAttributed;

boolfromIsComposite=fromRelClass.IsComposite;

esriRelNotificationfromRelNotif=fromRelClass.Notification;while(fromRelClass!=null)

IObjectClasstoOriginCls=null;if(fromOriginClsisIFeatureClass)toOriginCls=targetFeatureWorkspace.OpenFeatureClass(((IDataset)fromOriginCls).Name);elseif(fromOriginClsisITable)toOriginCls=targetFeatureWorkspace.OpenTable(((IDataset)fromOriginCls).Name)asIObjectClass;

IObjectClasstoDesCls=null;if(fromDesClsisIFeatureClass)toDesCls=targetFeatureWorkspace.OpenFeatureClass(((IDataset)fromDesCls).Name);elseif(fromOriginClsisITable)toDesCls=targetFeatureWorkspace.OpenTable(((IDataset)fromDesCls).Name)asIObjectClass;IObjectClasstoOriginCls=toRelClsContainer.CreateRelationshipClass(fromRelClsName,toOriginCls,toDesCls,fromFwdPathLabel,fromBwdPathLabel,fromRelCardinality,fromRelNotif,fromIsComposite,fromIsAttributed,null,fromOriginPK,"",fromOriginFK,"");fromRelClass=fromRelClasses.Next();}}toRelClsContainer.CreateRelatiITopologyContainer2–拓撲關系publicITopologyCreateTopology(string

Name,

double

ClusterTolerance,

int

maxGeneratedErrorCount,

string

ConfigurationKeyword

);ITopologyContainer2–拓撲關系publiITopologypublicvoidAddClass(IClassclassToAdd,

doubleWeight,

intXYRank,

intZRank,

boolEventNotificationOnValidate);ITopologypublicvoidAddClass//拷貝拓撲關系

privatevoidCreateTopology(IFeatureDatasetsourceFeatureDataset,IFeatureDatasettargetFeatureDataset){

IFeatureWorkspaceManage2sourceWsManage=sourceWorkspaceasIFeatureWorkspaceManage2;

IFeatureWorkspacetargetFeatureWorkspace=targetWorkspaceasIFeatureWorkspace;

ITopologyContainertoTopoContainer=(ITopologyContainer)targetFeatureDataset;

ITopologyContainerfromTopoContainer=(ITopologyContainer)sourceFeatureDataset;

inttopoCount=fromTopoContainer.TopologyCount;

ITopologyfromTopology;ITopologytoTopology;//拷貝拓撲關系

for(inti=0;i<topoCount;i++){fromTopology=fromTopoContainer.get_Topology(i);

stringtopologyName=(fromTopologyasIDataset).Name;toTopology=toTopoContainer.CreateTopology(topologyName,toTopoContainer.DefaultClusterTolerance,-1,"");

ITopologyPropertiesfromTopoProps=fromTopologyasITopologyProperties;

IEnumFeatureClassfromTopoClasses=fromTopoProps.Classes;IFeatureClassfromFeatureClass=fromTopoClasses.Next();while(fromFeatureClass!=null){ITopologyClassfromTopoClass=fromFeatureClassasITopologyClass;

IFeatureClasstoFeatureClass=targetFeatureWorkspace.OpenFeatureClass(((IDataset)fromFeatureClass).Name);

toTopology.AddClass(toFeatureClass,fromTopoClass.Weight,fromTopoClass.XYRank,fromTopoClass.ZRank,false);fromFeatureClass=fromTopoClasses.Next();}for(inti=0;i<topoCountITopologyRuleContainerfromTopoRuleContainer=fromTopologyasITopologyRuleContainer;

IEnumRu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論