ArcObjects - перечисление классов объектов и наборов данных в базе геоданных - PullRequest
2 голосов
/ 24 марта 2010

Я пытаюсь перечислить содержимое (классы пространственных объектов и наборы классов объектов, не интересуются таблицами и т. Д.) Файловой базы геоданных, используя vba / arcobjects.

У меня есть файл GDB, установленный как объект IGxDatabase, но я не могу найти способ продвинуться дальше. Я взглянул на объектную модель базы геоданных и попытался использовать IFeatureClass и IFeatureDataset, но ни один из них не дает полезных результатов. .

Заранее спасибо за любую помощь

Ответы [ 2 ]

6 голосов
/ 31 марта 2010

Гораздо быстрее перечислять имена, содержащиеся в базе геоданных, а не то, что имена могут открывать.Сложная часть состоит в циклическом прохождении имен в наборе классов.Хотя IFeatureWorkspace.Open можно использовать для открытия класса пространственных объектов без предварительного открытия набора классов объектов, в котором он содержится, для получения имен классов объектов в наборе классов объектов необходимо открыть набор классов объектов.

Если вы точно знаете, что вам нужно открыть каждый класс объектовтогда я полагаю, что не мешало бы использовать IWorkspace.Datasets, IEnumDataset и IDataset вместо IWorkspaceDatasetNames, IEnumDatasetname и IDatasetname.

<code>
Option Explicit
Sub TestGetContents()
    Dim pGxApp As IGxApplication
    Set pGxApp = Application
    If Not TypeOf pGxApp.SelectedObject Is IGxDatabase Then
        Debug.Print "select a geodb first"
        Exit Sub
    End If
    Dim c As Collection
    Set c = GetContents(pGxApp.SelectedObject)
    Dim l As Long
    For l = 1 To c.Count
        Dim pName As IName
        Set pName = c.Item(l)
        If TypeOf pName Is IFeatureClassName Then
            Dim pFC As IFeatureClass
            Set pFC = pName.Open
            Debug.Print pFC.AliasName, pFC.FeatureCount(Nothing)
        ElseIf TypeOf pName Is IFeatureDatasetName Then
            Dim pDSName As IDatasetName
            Set pDSName = pName
            Debug.Print pDSName.name, "(featuredataset)"
        End If
    Next l
End Sub</p>

<p>Function GetContents(pGxDB As IGxDatabase) As Collection
    Dim c As New Collection
    Dim pEnumDSName As IEnumDatasetName
    Set pEnumDSName = pGxDB.Workspace.DatasetNames(esriDTAny)
    Dim pDSName As IDatasetName
    Set 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
        Set pDSName = pEnumDSName.Next
    Loop
    Set GetContents = c
End Function</p>

<p>Sub AddSubNames(pDSName1 As IDatasetName, c As Collection)
    Dim pEnumDSName As IEnumDatasetName
    Set pEnumDSName = pDSName1.SubsetNames
    pEnumDSName.Reset
    Dim pDSName2 As IDatasetName
    Set pDSName2 = pEnumDSName.Next
    Do Until pDSName2 Is Nothing
        If TypeOf pDSName2 Is IFeatureClassName Then
            c.Add pDSName2
        End If
        Set pDSName2 = pEnumDSName.Next
    Loop
End Sub
0 голосов
/ 29 марта 2010

вы можете использовать метод ListFeatureClasses на Geoprocessor (ниже показано, как это можно сделать в C #)

IGeoProcessor gp = new GeoProcessorClass(); 

gp.SetEnvironmentValue("workspace", @"C:\temp"); 

IGpEnumList gpEnumList = gp.ListFeatureClasses("*", "Polygon", ""); 
string fc = gpEnumList.Next(); 
while (fc != "") 
{ 
//Do whatever
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...