Wie exportiere ich nur einige Feature-Classes mit ArcObjects nach XML?

8

Ich muss einige der Feature-Classes ziemlich oft in eine XML-Datei ("XML-Arbeitsbereich exportieren") exportieren, um den Prozess zu automatisieren. Ich habe hier ein Beispiel gefunden, wie ein Feature-Dataset in eine XML-Datei exportiert wird . Ich konnte den Code nicht so ändern, dass nur die gewünschten Feature-Classes exportiert werden (z. B. nur diejenigen, die mit einem Buchstaben 'A' beginnen). Ich muss auch die Tabellen und Beziehungsklassen exportieren (nur Schema).

Ist das überhaupt möglich? Ich weiß, dass es eine Schnittstelle gibt IFeatureClassName, aber ich weiß nicht, wie ich sie in diesem Fall verwenden soll. Sollte dies stattdessen mit arcpy erfolgen?

Ich verwende ArcGIS 10.0 SP3.

kor_
quelle

Antworten:

6

Anstatt den Datensatz zu erhalten:

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

Sie können die Feature-Class erhalten, indem Sie:

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

Siehe diesen Thread:

Exportieren / Importieren einer Geodatabase-Feature-Class in eine XML-Datei

AKTUALISIEREN

Mit diesem Code (Lösung in VB.NET) können Sie fc-Namen innerhalb des Geodatabase- / Feature-Datasets abrufen:

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

Code, auf den in diesem Beitrag verwiesen wird:

ArcObjects - Auflisten von Feature-Classes und Datasets in einer Geodatabase

Artwork21
quelle
Das Beispiel im Thread ist so ziemlich das gleiche, das ich bereits ausprobiert habe. Ich verstehe nicht, wie ich die Feature-Classes aus dem IEnumDatasetNameObjekt herausfiltere . Das gibt (IName)name.NameStringimmer eine leere Zeichenfolge zurück. Ich bekomme auch eine Ausnahme (Ausnahme von HRESULT: 0x80040220) von GenerateNameMappingmit dem aktuellen Codebeispiel ...
kor_
@kor_, Siehe meine aktualisierte Antwort.
Artwork21
Ah, also muss ich das INamezu IFeatureClassNameoder werfen IFeatureClassund es dann öffnen, und dann habe ich den tatsächlichen Namen. Wie chaotisch ist das!
kor_
4

Wenn Sie mit 10.1 arbeiten, versuchen Sie, das Geoverarbeitungswerkzeug Export XML Workspace Document (Data Management) zu verwenden.

Ich bin mir nicht sicher, was genau es tun wird, wenn Sie eine Feature-Class angeben, die an einer Beziehungsklasse teilnimmt, aber ich kann mir vorstellen, dass sie auch die Beziehungsklasse und verwandte Objektklassen enthält.

blah238
quelle