Özellik veri kümeleri dahil, tüm özellik sınıflarını File Geodatabase'de listelemek?


24

Python'dan, iç özellik veri kümeleri dahil olmak üzere, bir dosya coğrafi veritabanında (* .gdb) tüm özellik sınıflarının listesini nasıl oluşturabilirim? Standart örnek sadece listeler jeoveritabanı üst düzeyinde sınıfları bulunmaktadır:

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

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

for fc in fcs:
    print fc

Lütfen cevabınızın hangi ArcGIS Desktop sürümüne uygulandığını belirtin (9.3'i arıyorum ancak tüm sürümleri bir yerde toplayabiliriz).


1
İlgili ancak daha güncel bir soru-cevap (kullanımı dahil arcpy.da.Walk) GIS envanteri nasıl oluşturulur?
blah238

Yanıtlar:


34

Arcgis10 için bu rutin bir gdb içindeki tüm fcs'leri (bağımsız VEYA bir özellik veri kümesi içinde) döndürür. Sadece arcpy.env.workspace 'inizi ayarlayın, sonra bir for döngüsü yapın

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)

Güzel ve temiz!
Chad Cooper,

1
teşekkürler gotchula! Verim ifadesinde ilk karşılaştığım zaman, bunu anlamak için biraz okuma yapmak zorunda kaldım . Örneğinizin arcgis v10 için olduğunu unutmayın.
matt wilkie

1
üzgünüm, evet bu 10.x için. ve evet, verim harika, temiz kod için yapar.
23

Teşekkürler gotchula, bunun eski bir yazı olduğunu biliyorum ama bunu her hafta ekleyeceğim bir veritabanını yönetmek için çok yararlı buldum. + ['']: 3. satırda neler başardığını size sorabilir miyim?
Dylan Warburg,

1
Bir arcpy.ListDatasets bir döngü içinde arcpy.ListFeatureClasses çağırın. Herhangi bir özellik veri kümesi içinde olmayan (yani bağımsız özellik sınıfı) özellikli olmayan özellikler içermem gerekiyor, bu yüzden fds değişkeni olarak ListFeatureClasses'ın '' ile çağrılmasını sağlayan veri setleri listesine '' ekliyorum.
gotchula

12

Gotchula'nın cevabını kullanarak bittim , ancak verim olmadan, genellikle üretilen FC tutamaçlarını tekrar kullanıyorum ve verim bir kez kullanılmış, sonra atılmam ne fcs.append()olduğunu okumaktan ve anlamaktan daha kolay 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            

Sonuçlar:

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

Bu şimdi arcplus * dediğim bir modülde . Diğer kodunuzla veya PYTHONPATH ile yerleştirin ve sonra:

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

Arcplus, joker filtreleme de ekler; "Hydro" içeren özellik veri kümeleri içinde yalnızca "HD_" ile başlayan özellik sınıflarını işlemek için

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

. * şimdi Github'da, 10.x'e yükseltildi. Arcgis 9.3 için buraya bakınız .


1
yieldBuradaki kullanımdan kaçınmanın ardındaki mantığı anladığımdan emin değilim . Birincisi, atıfta bulunduğunuz "tanıtıcılar" hiç tanıtıcı değil, yalnızca dizelerdir. Ve eğer niyetiniz çoklu yinelemeler için özellik sınıfları listesini tutmaksa, yine de bir jeneratör fonksiyonu olarak tutabilir ve "onu sıralayabilirsiniz": my_list = list(generator_function(args))bu, jeneratörü değerlendirir ve sonucu bir liste değişkeninde saklar.
blah238

@ blah238: oh. Galiba o zaman hala verim elde etmiyorum. Anladığım kadarıyla böyle bir ifadeden fcs = fcs.append(...)çok daha hızlı bir şekilde ne yapıyorum fcs = list(yield(...)).
matt wilkie

8

Bu sorunun 9.3 olarak etiketlendiğini biliyorum, ancak 10.1'den sonra aynı cevabı arayanlar arcpy.da.Walk kullanarak daha iyi . ListDatasets / FeatureClasses / Rasters / etc'den daha hızlı ve daha doğru.

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)

Yürüyüş işlevi, python'un yürüyüşüyle aynı şekilde çalışır . Verilen yoldaki dizinler boyunca yinelenir ve her yinelemede kök, dizinin tam yolunu temsil eder ve dirler ve veri kümeleri, içinde bulunan alt dizinlerin ve dosyaların listesidir.

Bir coğrafi veritabanında yürürken, özellik veri kümeleri, dizinlerle aynı şekilde ele alınır. Kök klasördeki veri kümelerini ve özellik veri kümelerini yalnızca listelemek ve içeriğini görmek için özellik veri kümelerini açmak istemiyorsanız, şunları yapabilirsiniz:

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

Verdiğim gibi daha hızlı alacağım; "doğru" olsa da genişletebilir misin? Teşekkürler.
matt wilkie

ListDatasets, ListFeatureClasses, vs. her zaman doğru veri setlerini döndürmez. Ayrıca, SDE ve dosya GDB arasında farklı sonuçlar elde edersiniz. Asıl konuyu hatırlayamıyorum, ancak arcpy.List'i kullanmayı bıraktık ... çünkü sonuçlara güvenemiyoruz.
jon_two

5

ListDatasets Yöntem ben aradığınız düşünüyorum şeydir. Bu FGDB'nin içinde "Wells" adında bir FD var ve içinde 3 tane FC var. 9.3.1 için:

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
>>>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.