Mais

ArcObjects 10 - copiando campos (estrutura de tabela) para uma nova classe de recurso

ArcObjects 10 - copiando campos (estrutura de tabela) para uma nova classe de recurso


Estou criando uma nova classe de recurso com o esquema da tabela de atributos (nomes de campo, tipos, etc.) copiado de outra classe de recurso. Em seguida, gostaria de modificar um pouco esse esquema (por exemplo, adicionar um campo adicional).

Qual a melhor maneira de alcançar isto? Devo percorrer todos os campos de entrada e criar os respectivos campos de saída?

Agradecemos antecipadamente, Jan


Eu consideraria aproveitar o IFieldChecker. Há algum código de amostra no Criação de campos de classe de recurso de saída e geometria seção nesta página.

Além disso, se você precisa manter o controle de quais campos de destino foram derivados de quais campos de origem, você pode considerar o uso de IModelInfo:

… O nome do modelo, que é uma ferramenta para desenvolvedores de objetos personalizados usarem para garantir os nomes de objetos independentemente do nome verdadeiro ou do apelido.

Se você só precisa adicionar um campo, o mais simples é provavelmente chamar IClone.Clone () no membro IFeatureClass.Fields da classe de recursos de origem, usar IFieldsEdit.AddField no clone resultante para adicionar o campo único e, em seguida, usá-lo para criar o novo featureclass.


Aqui estão algumas sub-rotinas que uso na criação de novas classes de recursos com um modelo existente e na adição de campos.

Algumas notas sobre o código. Eu criei uma variável global para o geoprocessador (Globals.GP) e iniciei em outro lugar. Além disso, você deve ser capaz de usar um IFeatureClass como entrada para a propriedade do modelo da ferramenta CreateFeatureclass, mas o bug NIM068724 (que pode ser corrigido em 10.1) atualmente impede isso e você deve usar o nome do caminho para a classe de recurso.

Public Sub AddField (ByVal Input as Object, ByVal FieldName As String, ByVal FieldType As String, Opcional ByVal Precision As Long = 0, Opcional ByVal Scale As Long = 0, Opcional ByVal Length As Long = 0, Opcional ByVal FieldAlias ​​As String = Nothing , Opcional ByVal Nullable As String = "NULLABLE", Opcional ByVal Requerido As String = "NON_REQUIRED", Opcional ByVal Domain As String = Nothing) Dim AddField As New ESRI.ArcGIS.DataManagementTools.AddField Dim Result As ESRI.ArcGIS.Geoprocessing.IGeoProcessor2Result2 Tente usar o releaser como novo ESRI.ArcGIS.ADF.ComReleaser releaser.ManageLifetime (AddField) AddField.in_table = Input AddField.field_name = FieldName AddField.field_type = FieldType AddField.field_precision = Precisão AddField.field_scale = Escala AddField.field_scale = Escala AddField.field_scale = Escala AddField.field_scale = Escala AddField.field_scale = Escala AddField.field_scale = Escala AddField.field_scale = Escala AddField.field_scale = Escala AddField.field_scale = Escala AddField.field_scale = Escala AddField.field_scale = Escala. field_alias = FieldAlias ​​AddField.field_is_nullable = Nullable AddField.field_is_required = Obrigatório AddField.field_domain = Domain Result = RunTool (AddField, Nothing) Se o resultado for nada, então o sistema .Windows.Forms.MessageBox.Show ("Não foi possível adicionar campo") End If End Usando Catch ex As Exception System.Windows.Forms.MessageBox.Show (ex.ToString, "Adicionar erro de campo") End Try End Sub Função privada CreateFeatureClass (ByVal PathString As String, ByVal Name As String, ByVal pTemplateFClass As ESRI.ArcGIS.Geodatabase.IFeatureClass) As ESRI.ArcGIS.Geodatabase.IFeatureClass Dim CreateFC As New ESRI.ArcGIS.DataManagementTools.ArcGIS.DataManagement .ArcGIS.Geodatabase.IDataset Dim Result As ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2 Dim Path As String Tente usar releaser As New ESRI.ArcGIS.ADF.ComReleaser releaser.ManageLifetime (CreateFC) Selecione Case pTemplateFClass.ShapeType ESRIeType. esriGeometryType.esriGeometryPoint ShapeType = "Point" Case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline ShapeType = "Line" Case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon Endpoint Seleype = "Nothing Case Polygon ShapeType" ct dataset = pTemplateFClass Path = dataset.Workspace.PathName & "" & dataset.Name If dataset.Workspace.WorkspaceFactory.WorkspaceType = ESRI.ArcGIS.Geodatabase.esriWorkspaceType.esriFileSystemWorkspace Then If TypeOf dataset.WorkspaceFactory.WorkspaceType = ESRI.ArcGIS.Geodatabase.esriWorkspaceType.esriFileSystemWorkspace Then If TypeOf dataset.Workspace.WorkspaceFactory É ESRI. DataSourcesFile.ShapefileWorkspaceFactory Then Path = Path & ".shp" End If End If Dim pSR As ESRI.ArcGIS.Geometry.ISpatialReference3 = GetSpatialReferenceFromDataset (pTemplateFClass) CreateFC.out_path = CreateFct_path = CreateFC.templateCrieType = CreateFC.templateFormaTemplate = CreateFC.templateFC.geype = CreateFC.templateFormaTemplate = Criar ShapeTypeFC. Path CreateFC.spatial_reference = GetSpatialReferenceFromDataset (pTemplateFClass) Result = RunTool (CreateFC, Nothing) If Result Is Nothing Then System.Windows.Forms.MessageBox.Show ("Não foi possível criar dataset") Return Nothing End If ReturnObjectfromResult (Result, "Feature Classe ") End Using Catch ex As Exception System.Windows.Forms.MessageBox.Show (ex.ToString," Create InMemory Featureclass error ") Return Nothing End Try End Func Função Pública GetSpatialReferenceFromDataset (ByVal dataset As ESRI.ArcGIS.Geodatabase.IDataset) As ESRI.ArcGIS.Geometry.ISpatialReference3 'Se o conjunto de dados suportar IGeoDataset Se o conjunto de dados TypeOf for ESRI.ArcGIS.Geodatabase.IGeoDataset) devolver. Dim geoDataset As ESRI.ArcGIS.Geodatabase.IGeoDataset = CType (dataset, ESRI.ArcGIS.Geodatabase.IGeoDataset) Retorna geoDataset.SpatialReference Else Retorna Nada 'caso contrário, retorna nada End If End Function Friend Function ReturnObjectfromResult (ByVal result As ESRI.Arcocessing .IGeoProcessorResult2, ByVal Type As String) As Object Dim GPVal As ESRI.ArcGIS.Geodatabase.IGPValue Dim InMemFC As String Dim GPUtil As ESRI.ArcGIS.Geoprocessing.IGPUtilities3 = Novo ESRI.ArcGIS.Geoprocessing.GPUtilities 0) InMemFC = GPVal.GetAsText () Selecione o tipo de caso Case "Feature Class" Return GPUtil.OpenFeatureClassFromString (InMemFC) Case "Table" Return GPUtil.OpenTableFromString (InMemFC) End Select Catch ex As Exception System.Windows.Forms.MessageBox.Show (ex.ToString, "Return FeatureClass error") Return Nothing End Try End Função Amigo Função RunTool (ByVal Process As ESRI.ArcGIS.Geoprocessor.IGPProcess, ByVal TC As ESRI.ArcGIS.esriSystem.ITrackCancel2) As ESRI.Ar cGIS.Geoprocessing.IGeoProcessorResult2 Dim Result as ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2 Try Result = CType (Globals.GP.Execute (Process, Nothing), ESRI.ArcGIS.Geoprocessing.IGeoProcessorResult2GeSult.Status <> .esriJobStatus.esriJobSucceeded Then ReturnMessages (Result, "Geoprocessing Error") Globals.GP.ClearMessages () Catch ex As Exception System.Windows.Forms.MessageBox.Show (ex.ToString, "Executar Geoprocessador") End Try Return Resultado Final Função

Em geral, você pode usar a seguinte ferramenta ArcToolbox:

Gerenciamento de dados -> Classe de recurso -> Criar classe de recurso

no campo opcional "Classe de recurso do modelo", você deve escolher a classe de recurso original, esta é a fonte do esquema do campo

A nova classe de recurso vazia terá o mesmo esquema de campo de origem e você poderá adicionar os novos campos

Espero que isto ajude


Assista o vídeo: How to Install ArcGis