27 votos

¿Listado de todas las clases de características en la geodatabase de archivos, incluso dentro de los conjuntos de datos de características?

Desde python, ¿cómo puedo construir una lista de todas las clases de características en un archivo de geodatabase (*.gdb), incluyendo los conjuntos de datos de características internas? El ejemplo estándar sólo enumera las clases de características 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

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

34voto

Michael Gorsuch Puntos 1760

Esta rutina para arcgis10 devuelve todos los fcs (independientes o dentro de un conjunto de datos de características) dentro de un gdb. Simplemente establece 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)

12voto

Greg Puntos 1756

Terminé usando Respuesta de gotchula pero sin rendimiento porque Generalmente reutilizo las asas de FC creadas y las de rendimiento se utilizan una vez y luego se desechan es más fácil para mí leer y entender lo que fcs.append() está haciendo 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
...

Esto está ahora en un módulo 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 añade el filtrado con comodines; para procesar sólo las clases de características que empiezan por "HD_" dentro de los conjuntos de datos de características que contienen "Hydro"

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

.* ahora en Github, actualizado para 10.x. Para arcgis 9.3 ver aquí .

10voto

StuartLC Puntos 133

Me doy cuenta de que esta pregunta está etiquetada como 9.3, pero quien busque la misma respuesta en 10.1 en adelante es mejor que utilice arcpy.da.Walk . Es más rápido y 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 walk funciona de la misma manera que la de python caminar . Recorre los directorios de la ruta dada y en cada iteración, root representa la ruta completa del directorio, y dirs y datasets son listas de los subdirectorios y archivos que contiene.

Al recorrer una geodatabase, los conjuntos de datos de características se tratan de la misma manera que los directorios. Si sólo desea listar los conjuntos de datos y los conjuntos de datos de características en la carpeta raíz y no abrir los conjuntos de datos de características 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

5voto

Arda Xi Puntos 1099

El ListDatasets método es lo que creo que está 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
>>>

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X