¿Listado de todas las clases de entidad en la Geodatabase de archivos, incluidos los conjuntos de datos de entidades?

22

Desde Python, ¿cómo puedo crear una lista de todas las clases de entidad en una geodatabase de archivos (* .gdb), incluidos los conjuntos de datos de entidades? El ejemplo estándar solo enumera las clases de entidad en el nivel superior de la geodatabase:

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

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

for fc in fcs:
    print fc

Indique a qué versión de ArcGIS Desktop se aplica su respuesta (estoy buscando 9.3, pero también podríamos recopilar todas las versiones en un solo lugar).

    
pregunta matt wilkie 08.02.2011 - 01:55

4 respuestas

12

Terminé usando la respuesta de gotchula , pero sin rendimiento porque generalmente reutilizo los manejadores FC creados y los rendimientos se usan una vez y luego se descartan , es más fácil para mí leer y entender qué hace fcs.append() que 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            

Resultados:

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

Ahora está en un módulo al que llamo arcplus *. Coloque con su otro código o PYTHONPATH y luego:

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

Arcplus también agrega filtrado de comodines; para procesar solo las clases de entidad que comienzan con "HD_" dentro de los datasets de características que contienen "Hydro"

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

. * ahora en Github, actualizado a 10.x. Para arcgis 9.3, consulte aquí .

    
respondido por el matt wilkie 08.02.2011 - 23:37
33

Esta rutina para arcgis10 devuelve todos los fcs (OR independiente o dentro de un dataset de características) dentro de un gdb. Simplemente configura tu arcpy.env.workspace y luego haz un bucle 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)
    
respondido por el gotchula 08.02.2011 - 19:57
8

Me doy cuenta de que esta pregunta está etiquetada como 9.3, pero es mejor que cualquier persona que busque la misma respuesta a partir de 10.1 en adelante use arcpy.da.Walk . Es más rápido y más preciso que 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)

La función de caminar funciona de la misma manera que walk . Se itera a través de los directorios en la ruta dada y en cada iteración, la raíz representa la ruta completa del directorio, y los directorios y conjuntos de datos son listas de los subdirectorios y archivos contenidos dentro.

Al recorrer una geodatabase, los datasets de entidades se tratan de la misma manera que los directorios. Si solo desea enumerar los datasets y los datasets de entidades en la carpeta raíz y no abrir los datasets de entidades para ver el contenido, puede hacerlo:

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
    
respondido por el jon_two 11.05.2016 - 12:43
5

El método ListDatasets es lo que creo que estás buscando. Este FGDB tiene un FD en él llamado "Wells" y tiene 3 FCs en él. Para 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
>>>
    
respondido por el Chad Cooper 08.02.2011 - 03:47

Lea otras preguntas en las etiquetas