フィーチャデータセット内を含め、ファイルジオデータベース内のすべてのフィーチャクラスをリストしますか?


24

pythonから、ファイルジオデータベース(* .gdb)内のすべてのフィーチャクラスのリストを作成するにはどうすればよいですか?の標準例のみリストは、ジオデータベースのトップレベルでクラスを備えています:

import arcgisscripting, os
gp = arcgisscripting.create(9.3)

gp.workspace = 'd:\scratch.gdb'
fcs = gp.ListFeatureClasses()

for fc in fcs:
    print fc

回答が適用されるArcGIS Desktopのバージョンを指定してください(9.3を探していますが、すべてのバージョンを1か所で収集することもできます)。


1
関連するがより最新のQ&A(の使用を含むarcpy.da.Walk)は、GISインベントリの作成方法ですか?
blah238

回答:


34

arcgis10のこのルーチンは、gdb内のすべてのfc(スタンドアロンまたはフィーチャデータセット内)を返します。arcpy.env.workspaceを設定してからforループを実行するだけです

def listFcsInGDB():
    ''' set your arcpy.env.workspace to a gdb before calling '''
    for fds in arcpy.ListDatasets('','feature') + ['']:
        for fc in arcpy.ListFeatureClasses('','',fds):
            yield os.path.join(arcpy.env.workspace, fds, fc)

素敵できれい!
チャドクーパー

1
ゴッチュラに感謝!yieldステートメントに出会ったのはそれが初めてでありそれを理解するために少し読む必要がありました。サンプルがarcgis v10用であることを忘れていました。
マットウィルキー

1
申し訳ありませんが、これは10.x用です。そして、はい、歩留まりは素晴らしく、きれいなコードになります。
ゴチュラ

ありがとうございます 3行目で+ ['']:が何を達成するのか、お伺いできますか?
ディランウォーバーグ

1
arcpy.ListDatasetsのループ内でarcpy.ListFeatureClassesを呼び出します。フィーチャデータセット(別名スタンドアロンフィーチャクラス)内にないフィーチャクラスを含める必要があるため、データセットのリストに ''を追加します。これにより、ListFeatureClassesが ''とともにfds変数として呼び出されます。
ゴチュラ

12

私が使用して終了gotchulaの答えを、しかし、収率のないので、私は一般的に再利用作成され、歩留まりのが一度使用されているFCハンドルを捨て、私は読んで内容を理解することは簡単ですfcs.append()よりもやっていますfcs = yield(...)

def listFcsInGDB(gdb):
    ''' list all Feature Classes in a geodatabase, including inside Feature Datasets '''
    arcpy.env.workspace = gdb
    print 'Processing ', arcpy.env.workspace

    fcs = []
    for fds in arcpy.ListDatasets('','feature') + ['']:
        for fc in arcpy.ListFeatureClasses('','',fds):
            #yield os.path.join(fds, fc)
            fcs.append(os.path.join(fds, fc))
    return fcs

gdb = sys.argv [1]
fcs = listFcsInGDB(gdb)
for fc in fcs:
    print fc            

結果:

d:\> python list-all-fc.py r:\v5\YT_Canvec.gdb
Processing  r:\v5\YT_Canvec.gdb
Buildings_and_structures\BS_2530009_0
Buildings_and_structures\BS_2380009_2
Buildings_and_structures\Tower
Buildings_and_structures\Underground_reservoir
...

これは、arcplus * と呼ばれるモジュールになりました。他のコードまたはPYTHONPATHを配置してから、次の操作を行います。

import arcplus
fcs = arcplus.listAllFeatureClasses('d:\default.gdb')
for fc in fcs:
    print "magic happens with: ", fc

Arcplusはワイルドカードフィルタリングも追加します。「Hydro」を含むフィーチャデータセット内の「HD_」で始まるフィーチャクラスのみを処理する

fcs = arcplus.listAllFeatureClasses(gdb, fd_filter='*Hydro*', fc_filter='HD_*')

。* がGithubで、10.x用にアップグレードされました。arcgis 9.3については、こちらをご覧ください


1
yieldここの使用を避けた理由を理解していない。1つは、参照する「ハンドル」はハンドルではなく、単なる文字列です。また、複数の反復でフィーチャクラスのリストを保持することを目的とする場合、ジェネレーター関数として保持し、それを「リスト化」することができます。my_list = list(generator_function(args))これにより、ジェネレーターが評価され、結果がリスト変数に格納されます。
blah238

@ blah238:ああ。まだ歩留まりが悪いとは思いません。私は声明のようなことfcs = fcs.append(...)がよりずっと速くしていることを理解しfcs = list(yield(...))ます。
マットウィルキー

8

この質問には9.3というタグが付けられていますが、10.1以降で同じ回答を探している人は、arcpy.da.Walkを使用した方が良いでしょ。ListDatasets / FeatureClasses / Rasters / etcよりも高速で正確です。

import arcpy
import os

for root, dirs, datasets in arcpy.da.Walk('d:\scratch.gdb'):
    for ds in datasets:
        print os.path.join(root, ds)

walk関数は、pythonのwalkと同じように機能します。指定されたパスのディレクトリを反復処理し、各反復で、ルートはディレクトリのフルパスを表し、dirsとデータセットは、その中に含まれるサブディレクトリとファイルのリストです。

ジオデータベースをウォークスルーするとき、フィーチャデータセットはディレクトリと同様に扱われます。ルートフォルダー内のデータセットとフィーチャデータセットのみをリストし、コンテンツを表示するためにフィーチャデータセットを開かない場合は、次のことができます。

for root, dirs, datasets in arcpy.da.Walk('d:\scratch.gdb'):
    print 'feature datasets:'
    for fds in dirs:
        print os.path.join(root, fds)
    print 'datasets:'
    for ds in datasets:
        print os.path.join(root, ds)
    break

私は与えられたとおりに速くなります。「より正確」に拡張できますか?ありがとう。
マットウィルキー

ListDatasets、ListFeatureClassesなどは、常に正しいデータセットを返すとは限りません。また、SDEとファイルGDBで異なる結果が得られます。正確な問題を思い出せませんが、結果を信頼できなかったため、arcpy.List ...の使用を中止しました。
jon_two

5

ListDatasets この方法は、私はあなたが探していると思うものです。このFGDBには「Wells」と呼ばれるFDがあり、3つのFCがあります。9.3.1の場合:

C:\WINDOWS\system32>python
Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import arcgisscripting
>>> gp=arcgisscripting.create(9.3)
>>> d='c:\data\Third_Party_Wells_PRD.gdb'
>>> gp.workspace = d
>>>
>>> fds=gp.ListDatasets('','Feature')
>>> for fd in fds:
...     print fd
...
Wells
>>> for fd in fds:
...     gp.workspace=d + '/' + fd
...     fcs=gp.ListFeatureClasses()
...     for fc in fcs:
...             print fc
...
Third_Party_Wells_BHL
Third_Party_Wells_LAT
Third_Party_Wells_SHL
>>>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.