vba - ArcObjects - 枚举地理数据库中的要素类和数据集

标签 vba arcgis arcobjects

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

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

预先感谢您的帮助

最佳答案

枚举地理数据库中包含的名称比枚举名称可以打开的内容要快得多。棘手的部分是循环遍历特征数据集中的名称。虽然 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<p></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
</p>

关于vba - ArcObjects - 枚举地理数据库中的要素类和数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2509567/

相关文章:

.net - 开发 ArcMap 扩展 .Net 书籍?

c# - 如何使用c#设置arcobjects中的输入和输出参数,调用python脚本?

excel - : . Font.FontStyle = "Bold"与 .Font.Bold = msoTrue 之间的区别

vba - 从 SharePoint 使用 Excel VBA 2016 打开 Powerpoint 文件

crash - ArcGIS 10 + wxPython:在ArcMap python命令窗口中键入 'import wx'时,ArcGIS崩溃

javascript - 如何在 Angular-J 中使用 ArcGIS map ?

ArcGIS 字段计算器中的 Python 语法错误

c++ - 调试时出现 "myapp.exe has triggered a breakpoint"- 之后 Visual Studio 2015 Update 3 中的符号加载速度缓慢

vba - 在 VBA 插入的公式中使用变量

ms-access - 如何编写脚本来查找并更正表中的无效条目