2

我正在尝试使用 vba/arcobjects 枚举文件地理数据库的内容(要素类和要素数据集,对表不感兴趣等)。

我将文件 GDB 设置为 IGxDatabase 对象,但找不到进一步深入的方法。我查看了地理数据库对象模型并尝试使用 IFeatureClass 和 IFeatureDataset 但似乎都没有返回有用的结果。

提前感谢您的任何帮助

4

2 回答 2

6

枚举地理数据库中包含的名称而不是名称可以打开的内容要快得多。棘手的部分是遍历特征数据集中的名称。虽然 IFeatureWorkspace.Open 可用于打开要素类而无需先打开包含它的要素数据集,但获取要素数据集中的要素类名称需要打开要素数据集。

如果您确定需要打开每个要素类,那么我认为使用 IWorkspace.Datasets、IEnumDataset 和 IDataset 而不是 IWorkspaceDatasetNames、IEnumDatasetname 和 IDatasetname 不会有什么坏处。


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

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

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

于 2010-03-31T18:28:59.900 回答
0

您可以在地理处理器上使用 ListFeatureClasses 方法(以下显示如何在 C# 中完成此操作)

IGeoProcessor gp = new GeoProcessorClass(); 

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

IGpEnumList gpEnumList = gp.ListFeatureClasses("*", "Polygon", ""); 
string fc = gpEnumList.Next(); 
while (fc != "") 
{ 
//Do whatever
}
于 2010-03-29T11:36:23.080 回答