vba / arcobjectsを使用して、ファイルジオデータベースのコンテンツ(フィーチャクラスとフィーチャデータセット、テーブルには関心がないなど)を列挙しようとしています。
ファイルGDBをIGxDatabaseオブジェクトとして設定していますが、さらに詳しく調べる方法が見つかりません。ジオデータベースオブジェクトモデルを調べて、IFeatureClassとIFeatureDatasetを使用してみましたが、どちらも有用な結果を返さないようです。
助けてくれてありがとう
vba / arcobjectsを使用して、ファイルジオデータベースのコンテンツ(フィーチャクラスとフィーチャデータセット、テーブルには関心がないなど)を列挙しようとしています。
ファイルGDBをIGxDatabaseオブジェクトとして設定していますが、さらに詳しく調べる方法が見つかりません。ジオデータベースオブジェクトモデルを調べて、IFeatureClassとIFeatureDatasetを使用してみましたが、どちらも有用な結果を返さないようです。
助けてくれてありがとう
名前で開くことができるものではなく、ジオデータベースに含まれる名前を列挙する方がはるかに高速です。注意が必要な部分は、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
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
}