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


24

Як я можу створити список усіх класів функцій у базі даних геоданих (* .gdb) із python, у тому числі всередині наборів даних про функції? TheСтандартний приклад тільки списки мають класи на верхньому рівні геоданих:

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

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

for fc in fcs:
    print fc

Вкажіть, будь ласка, до якої версії ArcGIS Desktop стосується вашої відповіді (я шукаю 9.3, але ми можемо також зібрати всі версії в одному місці).


1
Пов’язаний, але більш сучасний Q&A (включаючи використання arcpy.da.Walk) - Як зробити інвентар ГІС?
bla22

Відповіді:


34

Ця програма для arcgis10 повертає всі fcs (автономні АБО в наборі даних про функції) всередині gdb. Просто встановіть arcpy.env.workspace, потім зробіть цикл

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)

Приємно і чисто!
Чад Купер

1
спасибі готчула! Це перший раз, коли я стикався з дохідністю, довелося трохи прочитати, щоб зрозуміти це. Ви забули зазначити, що ваш зразок призначений для arcgis v10.
matt wilkie

1
вибачте, так, це для 10.x. і так, урожай великий, що робить чистим код.
gotchula

Дякую, я знаю, що це старий пост, але я просто знайшов це дуже корисним для управління базою даних, яку я додаю щотижня. Чи можу я запитати вас, що + ['']: виконує у 3-му рядку?
Ділан Варбург

1
Я називаю arcpy.ListFeatureClasses всередині циклу arcpy.ListDatasets. Мені потрібно включити класи класів, які НЕ знаходяться в будь-якому наборі даних (він же окремий клас функцій), тому я додаю "" до списку наборів даних, через що ListFeatureClasses викликається з "" як змінна fds.
gotchula

12

Я в кінцевому підсумку використав відповідь gotchula , але без виходу, тому що я, як правило, повторно використовую створені ручки FC, а урожайність використовується колись потім, відкинувшись , мені легше читати і розуміти, що fcs.append()робиться, ніж 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            

Результати:

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

Це зараз в модулі, який я називаю arcplus *. Розмістіть свій інший код або PYTHONPATH, а потім:

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

Arcplus також додає фільтрування підстановки; обробляти лише класи функцій, які починаються з "HD_" в наборах даних функцій, що містять "Hydro"

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

. * тепер на Github, оновлений для 10.x. Про арггіс 9.3 дивіться тут .


1
Не впевнений, що я розумію обґрунтування уникнення використання yieldтут. Для одного "ручки", на які ви посилаєтесь, зовсім не є ручками, вони просто струни. І якщо ваш намір полягає в тому, щоб утримувати список класів функцій навколо декількох ітерацій, ви все одно можете зберігати його як функцію генератора і просто "списувати" його: my_list = list(generator_function(args))це оцінює генератор і зберігає результат у змінній списку.
blah238

@ blah238: о. Я здогадуюсь, я досі не врожай. Я розумію, що таке твердження fcs = fcs.append(...)робить набагато швидше, ніж fcs = list(yield(...)).
matt wilkie

8

Я усвідомлюю, що це питання позначено 9.3, але всім, хто шукає таку ж відповідь за 10.1 і далі, краще використовувати arcpy.da.Walk . Це швидше і точніше, ніж ListDatasets / FeatureClasses / Rasters / тощо.

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)

Функція ходьби працює таким же чином , як і пітона ходьби . Він повторюється через каталоги в заданому шляху і при кожній ітерації корінь представляє повний шлях до каталогу, а dirs і набори даних - це списки підкаталогів і файлів, що містяться в ньому.

Під час прогулянки по базі даних про геодані до наборів даних трактуються так само, як до каталогів. Якщо ви хочете лише перелічити набори даних і набори даних у кореневій папці, а не відкривати набори даних функцій для перегляду вмісту, ви можете зробити:

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

Я прийму швидше як даність; чи можна розширити на "точніші"? Спасибі.
матовий вілкі

ListDatasets, ListFeatureClasses тощо не завжди повертають правильні набори даних. Крім того, ви отримуєте різні результати між SDE і файлом GDB. Я не можу згадати точну проблему, але ми перестали використовувати arcpy.List ... тому що ми не могли довіряти результатам.
jon_two

5

ListDatasets Метод є те , що я думаю , що ви шукаєте. Цей FGDB має FD в ньому під назвою "Колодязі" і в ньому є 3 ФК. Для 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
>>>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.