Czy wyświetlasz klasy obiektów w wielu geobazach w folderze za pomocą ArcPy?

11

Mam folder z licznymi geobazami. W geobazach są klasy obiektów. Chciałbym uzyskać listę klas obiektów w tych geobazach przy użyciu skryptu Python. Dotarłem tylko do listy geobaz. Czy ktoś ma jakieś sugestie dotyczące umieszczenia klas obiektów w geobazach?

Wiersz pozycji wydruku w moim skrypcie daje mi następujące wyniki:

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

Chcę wygenerować listę klas obiektów w powyższych bazach danych. Poniżej znajduje się mój skrypt do tej pory.

    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
źródło
1
Czy istnieją również zestawy danych obiektów w geobazach?
blah238,
Nie, brak zestawów danych funkcji.
Patty Jula,

Odpowiedzi:

14

Sztuką, której brakuje, jest uczynienie każdego gdb aktywnym obszarem roboczym przed wyświetleniem zawartości:

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

Należy również pamiętać, że spowoduje to pominięcie klas elementów w zestawach danych elementów, zobacz Wylistowanie wszystkich klas elementów w Geobazie Plików, w tym w zestawach danych elementów? rozwiązać to.

Mówiąc bardziej ogólnie, jeśli używasz r, nie musisz podwójnie wykonywać ukośników odwrotnych (ułatwia kopiowanie i wklejanie z paska adresu Eksploratora Windows itp.): Np.r'D:\output'

matowe wilkie
źródło
1
Fajnie, działało! Wybrałem też kilka innych narzędzi z tego, co udostępniłeś - nie wiedziałem, że mogę użyć takiego środowiska pracy w środowisku env. Dziękuję Ci!
Patty Jula,
1
@PattyJula Nie ma za co, Patty. Ogólnie lepiej jest unikać słów ogólnych, takich jak „item”, ponieważ mogą one odnosić się do wszystkiego, aw większych skryptach są mylące. Łatwiej jest, aby pamiętać, singular-> mnoga wyróżnienie - choć Trzeba szkolić się do oglądania dla spływu s . Używam skrótów, aby pomóc w tym drugim. Na przykład for wspace in workspaces:i for fc in featureclasses:.
matt wilkie
8

Ten skrypt poradzi sobie z wszelkimi istniejącymi zestawami danych funkcji (przynajmniej teoretycznie - jeszcze go nie testowałem). Ten sam ogólny pomysł, jeśli istnieją zestawy danych funkcji, należy ustawić katalog roboczy na ten zestaw danych przed wyświetleniem funkcji w zestawie.

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
źródło
1
+1 za komentarze i integrujące FD. Osobiście nie użyłbym słowa „temp” jako nazwy zmiennej, ponieważ przypisuje się mu znaczenie „wyrzucić” i „swobodnie usunąć”. Zmienna jest możliwa do odrzucenia, ale jej zawartość, bazy danych, prawdopodobnie nie. W każdym razie, w tym przypadku nie jest to konieczne, wystarczy użyć, arcpy.env.workspace = gdbponieważ ListWorkspaces zwraca pełną ścieżkę. ;-)
matt wilkie
Masz całkowitą rację, Matt. Zaktualizuję przykład na przyszłość. Zapomniałem też na końcu linii, która resetuje obszar roboczy do nadrzędnego GDB przed próbą przejścia do następnego zestawu danych funkcji (nawet jeśli w tym przypadku nie jest to konieczne).
Jason