Elencare tutte le classi di caratteristiche nel file Geodatabase, comprese le serie di dati delle caratteristiche?


24

Da Python come posso creare un elenco di tutte le classi di caratteristiche in un file geodatabase (* .gdb), inclusi i set di dati delle caratteristiche interne? L' esempio standard elenca solo le classi di funzionalità al livello superiore del geodatabase:

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

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

for fc in fcs:
    print fc

Indica a quale versione di ArcGIS Desktop si applica la tua risposta (Sto cercando 9.3 ma potremmo anche raccogliere tutte le versioni in un unico posto).


1
Un D&R correlato ma più aggiornato (incluso l'uso di arcpy.da.Walk) è Come creare un inventario GIS?
blah238,

Risposte:


34

Questa routine per arcgis10 restituisce tutti i fcs (autonomi OR all'interno di un set di dati di funzionalità) all'interno di un gdb. Basta impostare il tuo arcpy.env.workspace quindi fare un ciclo 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)

Bello e pulito!
Chad Cooper,

1
grazie gotchula! Questa è la prima volta che ho incontrato la dichiarazione di rendimento, ho dovuto leggere un po ' per capirlo. Hai dimenticato di notare che il tuo campione è per arcgis v10.
matt wilkie,

1
scusa, sì, questo è per 10.x. e sì, la resa è ottima, rende il codice pulito.
gotchula,

Grazie gotchula, so che questo è un vecchio post, ma l'ho trovato molto utile per la gestione di un database a cui aggiungo ogni settimana. Potrei chiederti cosa compie il + ['']: nella terza riga?
Dylan Warburg,

1
chiamo arcpy.ListFeatureClasses all'interno di un ciclo di arcpy.ListDatasets. Ho bisogno di includere le featureclass che NON sono all'interno di alcun set di dati di funzionalità (aka classe di funzionalità standalone), quindi aggiungo '' all'elenco di set di dati che fa sì che ListFeatureClasses venga chiamato con '' come variabile fds.
gotchula,

12

Ho finito per usare la risposta di Gotchula , ma senza resa perché generalmente riutilizzo le maniglie FC create e le rese sono usate una volta poi scartate , per me è più facile leggere e capire cosa fcs.append()sta facendo 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            

risultati:

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

Questo è ora in un modulo che chiamo arcplus *. Inserire con l'altro codice o PYTHONPATH e quindi:

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

Arcplus aggiunge anche il filtro jolly; per elaborare solo le classi di funzionalità che iniziano con "HD_" all'interno di set di dati di funzionalità contenenti "Hydro"

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

. * ora su Github, aggiornato per 10.x. Per arcgis 9.3 vedi qui .


1
Non sono sicuro di comprendere la logica alla base dell'evitare l'uso di yieldqui. Per uno, le "maniglie" a cui ti riferisci non sono affatto maniglie, sono solo stringhe. E se la tua intenzione è quella di mantenere l'elenco delle classi di caratteristiche per più iterazioni, puoi comunque mantenerlo come una funzione generatore e semplicemente "elencarlo": my_list = list(generator_function(args))questo valuta il generatore e memorizza il risultato in una variabile di elenco.
blah238,

@ blah238: oh. Immagino che ancora non riesco a cedere la resa allora. Capisco cosa fcs = fcs.append(...)sta facendo un'affermazione molto più rapidamente di fcs = list(yield(...)).
matt wilkie,

8

Mi rendo conto che questa domanda è taggata 9.3, ma chiunque cerchi la stessa risposta dalla 10.1 in poi sta meglio usando arcpy.da.Walk . È più veloce e più preciso di ListDatasets / FeatureClasses / Rasters / ecc.

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)

La funzione walk funziona allo stesso modo della passeggiata di python . Esegue l'iterazione attraverso le directory nel percorso specificato e ad ogni iterazione, root rappresenta il percorso completo della directory e directory e set di dati sono elenchi delle sottodirectory e dei file contenuti all'interno.

Quando si percorre un geodatabase, i set di dati delle funzioni vengono trattati allo stesso modo delle directory. Se si desidera elencare solo i set di dati e i set di dati delle funzionalità nella cartella principale e non aprire i set di dati delle funzionalità per visualizzare i contenuti, è possibile eseguire:

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

Prenderò più veloce come un dato; puoi espandere "più accurato" però? Grazie.
matt wilkie,

ListDatasets, ListFeatureClasses, ecc. Non restituiscono sempre i set di dati corretti. Inoltre, ottieni risultati diversi tra SDE e file GDB. Non riesco a ricordare l'esatto problema, ma abbiamo smesso di usare arcpy.List ... perché non potevamo fidarci dei risultati.
jon_two,

5

Il ListDatasets metodo è quello che penso tu stia cercando. Questo FGDB ha un FD chiamato "Wells" e contiene 3 FC. Per 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
>>>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.