將圖層匯入SDE有兩種情況,一種是直接匯入到SDE的根目錄下,一種是SDE中使用者建立了要素集(Dataset),然後往某個要素集中匯入資料
第一種情況:直接往SDE根目錄下匯入圖層:
bool impLayerByName(IName lName,IWorkspace inWorkspace,IWorkspace outWorkspace)<br /> {<br /> try<br /> {<br /> //Open input Featureclass to get field definitions.<br /> IFeatureClass inFeatureClass = (IFeatureClass)lName.Open();<br /> IFeatureClassName inFeatureClassName = (IFeatureClassName)lName;<br /> // Set out dataset and feature class names.<br /> IFeatureClassName outFeatureClassName = new FeatureClassNameClass();<br /> IDatasetName outDatasetName = (IDatasetName)outFeatureClassName;<br /> IDataset outWorkspaceDataset = (IDataset)outWorkspace;<br /> IWorkspaceName outWorkspaceName = (IWorkspaceName)outWorkspaceDataset.FullName;<br /> outDatasetName.WorkspaceName = outWorkspaceName;<br /> //string outFullName = ((IDatasetName)lName).Name;<br /> //string outFileName = outFullName.Substring(outFullName.LastIndexOf(".") + 1);<br /> outDatasetName.Name = "SDE."+((IDatasetName)lName).Name;<br /> //Validate the field names.<br /> IFieldChecker fieldChecker = new FieldCheckerClass();<br /> IFields outFeatureClassFields;<br /> IFields inFeatureClassFields = inFeatureClass.Fields;<br /> IEnumFieldError enumFieldError;<br /> fieldChecker.InputWorkspace = inWorkspace;<br /> fieldChecker.ValidateWorkspace = outWorkspace;<br /> // Validate the fields.<br /> fieldChecker.Validate(inFeatureClassFields,out enumFieldError,out outFeatureClassFields);<br /> // Set up the geometry definition.<br /> IField geometryField;<br /> geometryField = outFeatureClassFields.get_Field(outFeatureClassFields.FindField(inFeatureClass.ShapeFieldName));<br /> // Get the geometry field's geometry definition.<br /> IGeometryDef geometryDef = geometryField.GeometryDef;<br /> //Set up the IQueryFilter to convert all the features by leaving a blank WhereClause<br /> QueryFilter qf = new QueryFilterClass();<br /> qf.WhereClause = "";<br /> //Load the feature class<br /> IFeatureDataConverter fctofc = new FeatureDataConverterClass();<br /> IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(inFeatureClassName,qf,null,outFeatureClassName,geometryDef,outFeatureClassFields,"",1000,0);<br /> return true;<br /> }<br /> catch (Exception ex)<br /> {<br /> MessageBox.Show(ex.Message);<br /> return false;<br /> }<br /> }<br />
其中,lName是源圖層的IName,inWorkspace是源圖層所在的工作空間,outWorkspace是要匯出到的工作空間,這段代碼預設將匯出後的圖層命名為與源圖層一樣
第二種情況:往SDE中某個要素集匯入圖層
bool impLayerByNameIntoDataset(IName lName,IWorkspace inWorkspace,IFeatureDataset featureDataset)<br /> {<br /> try<br /> {<br /> //IFeatureClassDescription fcDesc = new FeatureClassDescriptionClass();<br /> //IObjectClassDescription ocDesc = (IObjectClassDescription)fcDesc;<br /> //Open input Featureclass to get field definitions.<br /> IFeatureClass inFeatureClass = (IFeatureClass)lName.Open();<br /> IFeatureClassName inFeatureClassName = (IFeatureClassName)lName;<br /> // Set out dataset and feature class names.<br /> IFeatureClassName outFeatureClassName = new FeatureClassNameClass();<br /> IDatasetName outDatasetName = (IDatasetName)outFeatureClassName;<br /> IDataset outWorkspaceDataset = (IDataset)featureDataset.Workspace;<br /> IWorkspaceName outWorkspaceName = (IWorkspaceName)outWorkspaceDataset.FullName;<br /> outDatasetName.WorkspaceName = outWorkspaceName;<br /> outDatasetName.Name = "SDE." + ((IDatasetName)lName).Name;<br /> //Validate the field names.<br /> IFieldChecker fieldChecker = new FieldCheckerClass();<br /> IFields outFeatureClassFields;<br /> IFields inFeatureClassFields = inFeatureClass.Fields;<br /> IEnumFieldError enumFieldError;<br /> fieldChecker.InputWorkspace = inWorkspace;<br /> fieldChecker.ValidateWorkspace = featureDataset.Workspace;</p><p> // Validate the fields.<br /> fieldChecker.Validate(inFeatureClassFields,out enumFieldError,out outFeatureClassFields);<br /> //featureDataset.CreateFeatureClass("SDE." + ((IDatasetName)lName).Name,outFeatureClassFields,ocDesc.InstanceCLSID,ocDesc.ClassExtensionCLSID,esriFeatureType.esriFTSimple,fcDesc.ShapeFieldName,"");<br /> // Set up the geometry definition.<br /> IField geometryField;<br /> geometryField = outFeatureClassFields.get_Field(outFeatureClassFields.FindField(inFeatureClass.ShapeFieldName));<br /> // Get the geometry field's geometry definition.<br /> IGeometryDef geometryDef = geometryField.GeometryDef;<br /> //Set up the IQueryFilter to convert all the features by leaving a blank WhereClause<br /> IQueryFilter qf = new QueryFilterClass();<br /> qf.WhereClause = "";<br /> //Load the feature class<br /> IFeatureDataConverter fctofc = new FeatureDataConverterClass();<br /> IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(inFeatureClassName,qf,(IFeatureDatasetName)featureDataset.FullName,outFeatureClassName,geometryDef,outFeatureClassFields,"",1000,0);</p><p> return true;<br /> }<br /> catch (Exception ex)<br /> {<br /> MessageBox.Show(ex.Message);<br /> return false;<br /> }</p><p> }<br />
其中,lName是源圖層的IName,inWorkspace是源圖層所在的工作空間,featureDataset是目標資料集,這段代碼預設將匯出後的圖層命名為與源圖層一樣
附:擷取SDE中資料集(Dataset)的方法:
//在SDE裡尋找名稱為datasetName的Dataset<br />IFeatureDataset outSet = null;<br />IEnumDatasetName idNames = outSpace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset);<br />IDatasetName idNames.Reset();<br />fNameBase = idNames.Next();<br />while (fNameBase != null)<br />{<br /> if(fNameBase.Name == datasetName) outSet = (IFeatureDataset)((IName)fNameBase).Open();<br /> fNameBase = idNames.Next();<br />}
其中outSpace為已經開啟的SDE工作空間