2

vba / arcobjectsを使用して、ファイルジオデータベースのコンテンツ(フィーチャクラスとフィーチャデータセット、テーブルには関心がないなど)を列挙しようとしています。

ファイルGDBをIGxDatabaseオブジェクトとして設定していますが、さらに詳しく調べる方法が見つかりません。ジオデータベースオブジェクトモデルを調べて、IFeatureClassとIFeatureDatasetを使用してみましたが、どちらも有用な結果を返さないようです。

助けてくれてありがとう

4

2 に答える 2

6

名前で開くことができるものではなく、ジオデータベースに含まれる名前を列挙する方がはるかに高速です。注意が必要な部分は、featuredataset 内の名前をループすることです。IFeatureWorkspace.Open を使用して、フィーチャクラスを含むフィーチャデータセットを最初に開かずにフィーチャクラスを開くことができますが、フィーチャデータセット内のフィーチャクラス名を取得するには、フィーチャデータセットを開く必要があります。

各フィーチャクラスを開く必要があることが確実にわかっている場合は、IWorkspaceDatasetNames、IEnumDatasetname、および IDatasetname の代わりに、IWorkspace.Datasets、IEnumDataset、および IDataset を使用しても問題はないと思います。


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

Geoprocessor で 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 に答える