¿Cómo exportar solo algunas clases de entidad a xml usando ArcObjects?

8

Necesito exportar algunas de las clases de entidad a un archivo xml ("exportar espacio de trabajo xml") con bastante frecuencia, así que me gustaría automatizar el proceso. He encontrado un ejemplo aquí sobre cómo exportar un conjunto de datos de características a un archivo xml. No he podido modificar el código para exportar solo las clases de entidad que quiero (por ejemplo, solo las que comienzan con una letra 'A'). También necesito exportar las tablas y las clases de relación (solo esquema).

¿Es esto posible en absoluto? Sé que hay una interfaz IFeatureClassName, pero no sé cómo usarla en este caso. ¿Debería hacerse esto con arcpy?

Estoy usando ArcGIS 10.0 SP3.

kor_
fuente

Respuestas:

6

En lugar de obtener el conjunto de datos:

// Retrieve the first feature dataset from the workspace.
IEnumDatasetName enumDatasetName = workspace.get_DatasetNames
    (esriDatasetType.esriDTFeatureDataset);

Puede obtener la clase de entidad de la siguiente manera:

IEnumDatasetName enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTFeatureClass);

Ver este hilo:

Exportar / importar una clase de entidad de geodatabase a un archivo XML

ACTUALIZAR

Puede obtener nombres fc dentro de la geodatabase / dataset de características utilizando este código (solución en VB.NET):

Sub TestGetContents()

        Try
            Dim pGxApp As IGxApplication
            Dim Type As System.Type = System.Type.GetTypeFromCLSID(GetType(ESRI.ArcGIS.Framework.AppRefClass).GUID)
            pGxApp = TryCast(Activator.CreateInstance(Type), ESRI.ArcGIS.CatalogUI.IGxApplication)
            'select geodatabase in Catalog tree
            If Not TypeOf pGxApp.SelectedObject Is IGxDatabase Then
                Debug.Print("select a geodb first")
                Exit Sub
            End If
            Dim c As Collection
            c = GetContents(pGxApp.SelectedObject)
            Dim l As Long
            For l = 1 To c.Count
                Dim pName As IName
                pName = c.Item(l)
                If TypeOf pName Is IFeatureClassName Then
                    Dim pFC As IFeatureClass
                    pFC = pName.Open
                    MessageBox.Show(pFC.AliasName)

                ElseIf TypeOf pName Is IFeatureDatasetName Then
                    Dim pDSName As IDatasetName
                    pDSName = pName
                    MessageBox.Show(pDSName.Name)

                End If
            Next l
        Catch ex As Exception
            MessageBox.Show("Caught an unspecified error in the calling code: " & vbCrLf & ex.ToString)
        End Try

    End Sub


    Function GetContents(ByVal pGxDB As IGxDatabase) As Collection

        Try
            Dim c As New Collection
            Dim pEnumDSName As IEnumDatasetName
            pEnumDSName = pGxDB.Workspace.DatasetNames(esriDatasetType.esriDTAny)
            Dim pDSName As IDatasetName
            pDSName = pEnumDSName.Next
            Do Until pDSName Is Nothing
                If TypeOf pDSName Is IFeatureClassName Then
                    c.Add(pDSName)
                ElseIf TypeOf pDSName Is IFeatureDatasetName Then
                    c.Add(pDSName)
                    AddSubNames(pDSName, c)
                End If
                pDSName = pEnumDSName.Next
            Loop
            GetContents = c
        Catch ex As Exception
            MessageBox.Show("Caught an unspecified error in the calling code: " & vbCrLf & ex.ToString)
        End Try

    End Function

    Sub AddSubNames(ByVal pDSName1 As IDatasetName, ByVal c As Collection)
        Try
            Dim pEnumDSName As IEnumDatasetName
            pEnumDSName = pDSName1.SubsetNames
            pEnumDSName.Reset()
            Dim pDSName2 As IDatasetName
            pDSName2 = pEnumDSName.Next
            Do Until pDSName2 Is Nothing
                If TypeOf pDSName2 Is IFeatureClassName Then
                    c.Add(pDSName2)
                End If
                pDSName2 = pEnumDSName.Next
            Loop
        Catch ex As Exception
            MessageBox.Show("Caught an unspecified error in the calling code: " & vbCrLf & ex.ToString)
        End Try

    End Sub

Código referenciado desde esta publicación:

ArcObjects: enumerar clases de entidad y conjuntos de datos dentro de una geodatabase

artwork21
fuente
El ejemplo en el hilo es casi el mismo que ya he probado. No entiendo cómo filtro las clases de entidad del IEnumDatasetNameobjeto. El (IName)name.NameStringsiempre devuelve una cadena vacía. También recibo una excepción (excepción de HRESULT: 0x80040220) GenerateNameMappingcon el ejemplo de código actual ...
kor_
@kor_, vea mi respuesta actualizada.
artwork21 el
Ah, así que tengo que emitir el INamea IFeatureClassNameo IFeatureClassy luego abrirlo, y luego tengo el nombre real. ¡Qué desordenado es eso!
kor_
4

Si está en 10.1, intente utilizar la herramienta de geoprocesamiento Exportar documento de espacio de trabajo XML (gestión de datos) .

No estoy seguro de qué hará exactamente si especifica una clase de entidad que participa en una clase de relación, pero imagino que también incluirá la clase de relación y las clases de objeto relacionadas.

blah238
fuente