Перерахування класів функцій у кількох базах геоданих у папці за допомогою 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

Також зауважте, що це буде пропускати класи функцій у наборах даних функцій, див. Перелік усіх класів функцій у File Geodatabase, у тому числі в наборах даних про функції? щоб вирішити це.

Більш загально, якщо ви користуєтеся, rвам не потрібно подвоювати нахил у всьому світі (це полегшує копіювання та вставлення з адресного рядка провідника Windows тощо): наприкладr'D:\output'


1
Класно, що спрацювало! Я зібрав кілька інших інструментів із того, що ви поділилися теж - не знав, що можу використовувати env.workspace таким чином. Дякую!
Патті Джула

1
@PattyJula Ласкаво просимо Патті. Крім того, краще уникати загальних слів, таких як "item", оскільки це може застосовуватися до чого завгодно, а у великих сценаріях стає заплутаним. Це легше мати у вигляді , особливо в > множинного відмінності - хоча вам не потрібен тренувати себе , щоб спостерігати за тягнеться s . Я використовую абревіатури, щоб допомогти з останніми. Наприклад for wspace in workspaces:і for fc in featureclasses:.
matt wilkie

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" як ім'я змінної, оскільки це пов'язані значення "викинути" та "вільно видалити". Змінна не може бути видана, але її вміст, бази даних, ймовірно, ні. У будь-якому випадку, у цьому випадку це непотрібно, просто використовуйте, arcpy.env.workspace = gdbяк ListWorkspaces повертає повний шлях. ;-)
matt wilkie

Ти абсолютно прав, Метт. Я оновлю приклад для подальшого використання. Крім того, я забув рядок у кінці, який скидає робочу область до батьківського GDB, перш ніж намагатися перейти до наступного набору даних про функції (хоча це не потрібно в цьому випадку).
Джейсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.