Listando classes de recursos em vários bancos de dados geográficos na pasta usando o ArcPy?

11

Eu tenho uma pasta com vários bancos de dados geográficos nela. Dentro dos bancos de dados geográficos existem classes de recursos. Gostaria de obter uma lista das classes de recursos nesses bancos de dados geográficos usando um script Python. Eu só cheguei ao ponto de listar os bancos de dados geográficos. Alguém tem uma sugestão para listar as classes de recurso nos geodatabases?

A linha do item de impressão no meu script fornece os seguintes resultados:

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

Quero gerar uma lista das classes de recursos nos geodatabases acima. Abaixo está o meu script até agora.

    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
fonte
1
Também existem conjuntos de dados de recursos nos bancos de dados geográficos?
precisa saber é o seguinte
Não, não há conjuntos de dados de recursos.
Patty Jula

Respostas:

14

O truque que você está perdendo é tornar cada gdb o espaço de trabalho ativo antes de listar o conteúdo:

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

Observe também que isso perderá uma classe de recurso dentro dos conjuntos de dados de recursos, consulte Listando todas as classes de recursos no Geodatabase de Arquivos, inclusive nos conjuntos de dados de recursos? para resolver isso.

De maneira mais geral, se você usar r, não precisará dobrar a barra invertida (facilita a cópia e a colar da barra de endereços do Windows Explorer etc.): por exemplor'D:\output'

Matt Wilson
fonte
1
Legal, isso funcionou! Peguei algumas outras ferramentas do que você compartilhou também - não sabia que eu poderia usar o env.workspace assim. Obrigado!
Patty Jula
1
@PattyJula De nada, Patty. Também é geralmente melhor evitar palavras genéricas como 'item', pois isso pode se aplicar a qualquer coisa e em scripts maiores fica confuso. É mais fácil ter em mente uma distinção singular-> plural - embora você precise treinar-se para observar os s posteriores . Eu uso abreviações para ajudar com o último. Por exemplo for wspace in workspaces:e for fc in featureclasses:.
Matt Wilkie
8

Este script irá lidar com quaisquer conjuntos de dados de recursos existentes (pelo menos em teoria - eu não testei). A mesma idéia geral, porém, se houver conjuntos de dados de recursos, você precisará definir seu diretório de trabalho para esse conjunto de dados antes de listar os recursos.

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
fonte
1
+1 para comentários e integração de DFs. Eu, pessoalmente, não usaria 'temp' como um nome de variável por causa dos significados associados a "jogar fora" e "livre para excluir". A variável é descartável, mas seu conteúdo, os bancos de dados, provavelmente não. De qualquer forma, nesse caso, é desnecessário, basta usar arcpy.env.workspace = gdbcomo o ListWorkspaces retorna o caminho completo. ;-)
Matt Wilkie
Você está totalmente certo, Matt. Vou atualizar o exemplo para referência futura. Além disso, esqueci uma linha no final que redefine o espaço de trabalho para o GDB pai antes de tentar ir para o próximo conjunto de dados do recurso (mesmo que não seja necessário neste caso).
Jason