Daftar kelas fitur dalam beberapa geodatabases di folder menggunakan ArcPy?

11

Saya memiliki folder dengan banyak geodatabases di dalamnya. Di dalam geodatabases terdapat kelas fitur. Saya ingin mendapatkan daftar kelas fitur di geodatabases ini menggunakan skrip Python. Saya hanya sampai pada daftar geodatabases. Adakah yang punya saran untuk mendaftarkan kelas fitur di geodatabases?

Baris item cetak dalam skrip saya memberi saya hasil berikut:

C:\output\data.gdb 
C:\output\otherdata.gdb
C:\output\somethingelse.gdb

Saya ingin membuat daftar kelas fitur di geodatabases di atas. Berikut ini skrip saya.

    import arcpy, os, sys
    from arcpy import env

    arcpy.env.workspace = "D:\\output"
    inWorkspace = arcpy.env.workspace

    workspaces = arcpy.ListWorkspaces("*", "FileGDB")
    for item in workspaces:
         print item #This part gives me the print statements I shared above
    # fcList = arcpy.ListFeatureClasses() #I haven't figured this part out
    #I want to list the feature classes in the geodatabases
Patty Jula
sumber
1
Apakah ada juga fitur dataset dalam geodatabases?
blah238
Tidak, tidak ada dataset fitur.
Patty Jula

Jawaban:

14

Trik yang Anda lewatkan adalah menjadikan setiap gdb ruang kerja yang aktif sebelum mencantumkan konten:

for item in workspaces:
    print item
    env.workspace = item
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        print '\t', fc

Juga perhatikan bahwa ini akan melewatkan kelas fitur di dalam dataset fitur, lihat Daftar semua kelas fitur di File Geodatabase, termasuk di dalam dataset fitur? untuk menyelesaikannya.

Lebih umum, jika Anda menggunakan, rAnda tidak perlu menggandakan backslash semuanya (membuat copy dan paste lebih mudah dari bilah alamat windows explorer dll.): Mis.r'D:\output'

matt wilkie
sumber
1
Keren, itu berhasil! Saya mengambil beberapa alat lain dari apa yang Anda bagikan juga - tidak tahu saya bisa menggunakan env.workspace seperti itu. Terima kasih!
Patty Jula
1
@ PamJula Terima kasih Patty. Juga umumnya lebih baik untuk menghindari kata-kata umum seperti 'item' karena dapat berlaku untuk apa saja dan dalam skrip yang lebih besar akan membingungkan. Lebih mudah untuk diingat singular-> plural perbedaan - meskipun Anda perlu melatih diri untuk menonton untuk trailing s . Saya menggunakan singkatan untuk membantu yang terakhir. Sebagai contoh for wspace in workspaces:dan for fc in featureclasses:.
matt wilkie
8

Script ini akan berurusan dengan set data fitur yang ada (setidaknya secara teori - saya belum mengujinya). Namun, gagasan umum yang sama, jika ada dataset fitur, Anda perlu mengatur direktori kerja Anda ke dataset sebelum mendaftarkan fitur-fitur di dalamnya.

import arcpy

dir = r'D:\output'
arcpy.env.workspace = dir

gdbList = arcpy.ListWorkspaces('*','FileGDB')

for gdb in gdbList:
    arcpy.env.workspace = gdb               #--change working directory to each GDB in list
    datasetList = arcpy.ListDatasets('*','Feature')     #--make a list of all (if any) feature datasets that exist in current GDB
    fcList = arcpy.ListFeatureClasses()         #--make a list of all feature in current GDB (root)
    for fc in fcList:
        print arcpy.env.workspace,fc            #--print directory,fc name
    for dataset in datasetList:
        arcpy.env.workspace = dataset   #--change working directory to each dataset (if any) in list
        fcList = arcpy.ListFeatureClasses()     #--make a list of all feature in current GDB (current dataset)
        for fc in fcList:
            print arcpy.env.workspace,fc        #--print directory,fc name
        arcpy.env.workspace = gdb
Jason
sumber
1
+1 untuk komentar dan mengintegrasikan FD. Saya pribadi tidak akan menggunakan 'temp' sebagai nama variabel karena itu terkait arti "membuang" dan "bebas untuk menghapus". Variabelnya bisa dibuang, tetapi isinya, database, kemungkinan tidak. Bagaimanapun, dalam hal ini tidak perlu, cukup gunakan arcpy.env.workspace = gdbsebagai ListWorkspaces mengembalikan path lengkap. ;-)
matt wilkie
Anda sepenuhnya benar, Matt. Saya akan memperbarui contoh untuk referensi di masa mendatang. Juga, saya lupa baris di akhir yang me-reset ruang kerja ke induk GDB sebelum mencoba untuk pergi ke dataset fitur berikutnya (meskipun itu tidak perlu dalam kasus ini).
Jason