Список классов объектов в нескольких базах геоданных в папке с помощью ArcPy?

11

У меня есть папка с многочисленными базами геоданных. В базах геоданных есть классы объектов. Я хотел бы получить список классов объектов в этих базах геоданных, используя скрипт Python. Я только дошел до перечисления баз геоданных. У кого-нибудь есть предложения по перечислению классов объектов в базах геоданных?

Строка печати в моем скрипте дает мне следующие результаты:

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

Я хочу создать список классов объектов в базах геоданных выше. Ниже мой сценарий до сих пор.

    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
Пэтти Юла
источник
1
Есть ли также наборы классов объектов в базах геоданных?
blah238
Нет, нет наборов функциональных данных.
Пэтти Юла

Ответы:

14

Хитрость, которую вы пропускаете, - сделать каждый GDB активным рабочим пространством перед перечислением содержимого:

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

Также обратите внимание, что при этом будут пропущены классы пространственных объектов внутри наборов классов объектов, см. Список всех классов пространственных объектов в файловой базе геоданных, включая наборы классов объектов? чтобы решить это.

В более общем случае, если вы используете, rвам не нужно дублировать обратную косую черту (это упрощает копирование и вставку из адресной строки проводника Windows и т. Д.): Например,r'D:\output'

Мэтт Уилки
источник
1
Круто, это сработало! Я подобрал несколько других инструментов из того, что вы тоже поделились - не знал, что смогу так использовать env.workspace. Спасибо!
Пэтти Юла
1
@PattyJula Не за что, Патти. Также, как правило, лучше избегать общих слов, таких как «элемент», так как они могут относиться ко всему и в больших скриптах приводят в замешательство. Это легче иметь в виде , особенности в > множественного различия - хотя вам не нужен тренировать себя , чтобы наблюдать за тянущуюся s . Я использую сокращения, чтобы помочь с последним. Например for wspace in workspaces:и for fc in featureclasses:.
Мэтт Уилки
8

Этот скрипт будет работать с любыми существующими наборами классов объектов (по крайней мере, теоретически - я не проверял его). Тем не менее, общая идея заключается в том, что если имеются наборы классов объектов, вам нужно установить рабочий каталог на этот набор данных, прежде чем перечислять компоненты внутри.

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
Джейсон
источник
1
+1 за комментарии и интеграцию FD. Лично я бы не использовал «temp» в качестве имени переменной из-за связанного с ним значения «throw out» и «free to delete». Переменная игнорируется, но ее содержимое, базы данных, скорее всего, нет. В любом случае, в этом случае это не нужно, просто используйте, arcpy.env.workspace = gdbпоскольку ListWorkspaces возвращает полный путь. ;-)
Мэтт Уилки
Ты совершенно прав, Мэтт. Я обновлю пример для дальнейшего использования. Кроме того, я забыл строку в конце, которая сбрасывает рабочую область в родительский GDB, прежде чем пытаться перейти к следующему набору функциональных данных (хотя в этом случае это не нужно).
Джейсон