首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArcObjects -枚举地理数据库中的要素类和数据集

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

Stack Overflow用户
提问于 2010-03-25 00:42:36
回答 2查看 7.2K关注 0票数 2

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

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

提前感谢您的帮助

EN

回答 2

Stack Overflow用户

发布于 2010-04-01 02:29:00

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

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

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2010-03-29 19:36:23

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

代码语言:javascript
复制
IGeoProcessor gp = new GeoProcessorClass(); 

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

IGpEnumList gpEnumList = gp.ListFeatureClasses("*", "Polygon", ""); 
string fc = gpEnumList.Next(); 
while (fc != "") 
{ 
//Do whatever
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2509567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档