Mendaftar semua kelas fitur di File Geodatabase, termasuk di dalam dataset fitur?

24

Dari python bagaimana saya bisa membuat daftar semua kelas fitur dalam file geodatabase (* .gdb), termasuk di dalam dataset fitur? Contoh standar hanya mencantumkan kelas fitur di tingkat atas geodatabase:

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

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

for fc in fcs:
    print fc

Tolong tunjukkan versi ArcGIS Desktop mana jawaban Anda berlaku (Saya mencari 9.3 tetapi kami mungkin juga mengumpulkan semua versi di satu tempat).

matt wilkie
sumber
1
T&J terkait namun lebih terkini (termasuk penggunaan arcpy.da.Walk) adalah Bagaimana cara membuat inventaris GIS?
blah238

Jawaban:

34

Rutin ini untuk arcgis10 mengembalikan semua fcs (mandiri atau dalam dataset fitur) di dalam gdb. Cukup atur arcpy.env.workspace Anda lalu lakukan for loop

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)
Gotchula
sumber
Bagus dan bersih!
Chad Cooper
1
terima kasih gotchula! Itulah pertama kali saya menemukan pernyataan hasil, harus melakukan sedikit bacaan untuk mencari tahu. Anda lupa mencatat sampel Anda untuk arcgis v10.
matt wilkie
1
maaf, ya ini untuk 10.x. dan ya, hasilnya hebat, membuat kode bersih.
Gotchula
Terima kasih Gotchula, saya tahu ini adalah posting lama tapi saya baru saja menemukan ini sangat membantu untuk mengelola database yang saya tambahkan setiap minggu. Bisakah saya bertanya kepada Anda apa yang + ['']: capai di baris ke-3?
Dylan Warburg
1
saya sebut arcpy.ListFeatureClasses di dalam loop dari arcpy.ListDatasets. Saya perlu memasukkan kacamata feature yang TIDAK ada di dalam dataset fitur apa pun (alias kelas fitur mandiri), jadi saya menambahkan '' ke daftar dataset yang menyebabkan ListFeatureClasses dipanggil dengan '' sebagai variabel fds.
Gotchula
12

Saya akhirnya menggunakan jawaban gotchula , tetapi tanpa hasil karena saya biasanya menggunakan kembali pegangan FC yang dibuat dan hasil digunakan sekali kemudian dibuang , lebih mudah bagi saya untuk membaca dan memahami apa fcs.append()yang dilakukan daripada 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            

Hasil:

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
...

Ini sekarang dalam modul yang saya sebut arcplus *. Tempatkan dengan kode atau PYTHONPATH Anda yang lain dan kemudian:

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

Arcplus juga menambahkan pemfilteran wildcard; untuk hanya memproses kelas fitur yang dimulai dengan "HD_" dalam kumpulan fitur yang berisi "Hydro"

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

. * sekarang di Github, ditingkatkan untuk 10.x. Untuk arcgis 9.3 lihat di sini .

matt wilkie
sumber
1
Tidak yakin saya mengerti alasan di balik menghindari penggunaan di yieldsini. Pertama, "pegangan" yang Anda maksud bukan pegangan sama sekali, itu hanya string. Dan jika maksud Anda adalah untuk membuat daftar kelas fitur sekitar untuk beberapa iterasi, Anda masih dapat menyimpannya sebagai fungsi generator dan cukup "listify" itu: my_list = list(generator_function(args))ini mengevaluasi generator dan menyimpan hasilnya dalam variabel daftar.
blah238
@ blah238: oh. Kurasa aku masih belum menghasilkan grok kalau begitu. Saya mengerti apa yang dilakukan pernyataan fcs = fcs.append(...)jauh lebih cepat daripada fcs = list(yield(...)).
matt wilkie
8

Saya menyadari pertanyaan ini ditandai 9.3, tetapi siapa pun yang mencari jawaban yang sama pada 10.1 dan seterusnya lebih baik menggunakan arcpy.da.Walk . Lebih cepat dan lebih akurat daripada ListDatasets / FeatureClasses / Raster / dll.

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)

Fungsi berjalan bekerja dengan cara yang sama seperti berjalan python . Itu iterates melalui direktori di jalur yang diberikan dan pada setiap iterasi, root mewakili path lengkap dari direktori, dan dirs dan dataset adalah daftar dari subdirektori dan file yang terkandung di dalamnya.

Saat berjalan melalui geodatabase, kumpulan data fitur diperlakukan dengan cara yang sama seperti direktori. Jika Anda hanya ingin mendaftar dataset dan dataset fitur dalam folder root dan tidak membuka dataset fitur untuk melihat konten, Anda dapat melakukan:

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
jon_two
sumber
Saya akan mengambil lebih cepat sebagai yang diberikan; dapatkah Anda mengembangkan "lebih akurat"? Terima kasih.
matt wilkie
ListDatasets, ListFeatureClasses, dll. Tidak selalu mengembalikan dataset yang benar. Juga, Anda mendapatkan hasil yang berbeda antara SDE dan file GDB. Saya tidak dapat mengingat masalah sebenarnya, tetapi kami berhenti menggunakan arcpy.List ... karena kami tidak dapat mempercayai hasilnya.
jon_two
5

The ListDatasets Metode adalah apa yang saya pikir Anda cari. FGDB ini memiliki FD di dalamnya yang disebut "Wells" dan memiliki 3 FC di dalamnya. Untuk 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
>>>
Chad Cooper
sumber