फाइल जियोडैटबेस में सभी फीचर कक्षाओं को सूचीबद्ध करना, जिसमें फीचर डेटासेट भी शामिल है?


24

अजगर से मैं फाइल फीचरोडेटाबेस (* .gdb) में सभी फीचर कक्षाओं की सूची कैसे बना सकता हूं, जिसमें अंदर के फीचर डेटासेट भी शामिल हैं? मानक उदाहरण केवल सूचियों geodatabase के शीर्ष स्तर पर कक्षाओं की सुविधा:

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

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

for fc in fcs:
    print fc

कृपया बताएं कि आपका जवाब कौन सा आर्च डेस्कटॉप संस्करण पर लागू होता है (मैं 9.3 की तलाश में हूं लेकिन हम एक ही स्थान पर सभी संस्करणों को एकत्र कर सकते हैं)।


1
Q & A से संबंधित (लेकिन उपयोग सहित arcpy.da.Walk) एक से अधिक लेकिन जीआईएस इन्वेंट्री कैसे बनाई जाती है?
ब्लाह 238

जवाबों:


34

आर्कगिस 10 के लिए यह रूटीन एक gdb के अंदर सभी fcs (स्टैंडअलोन या फीचर डेटासेट के भीतर) लौटाता है। बस अपना 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
थैंक्स गोटुला! यह पहली बार है जब मैंने पैदावार स्टेटमेंट का सामना किया है, इसे जानने के लिए थोड़ा पढ़ना पड़ा। आप यह ध्यान रखना भूल गए कि आपका नमूना आर्कगिस वी 10 के लिए है।
मैट विल्की

1
क्षमा करें, हाँ यह 10.x के लिए है। और हाँ, उपज बढ़िया है, स्वच्छ कोड के लिए बनाता है।
गोचूला

धन्यवाद गोटुला, मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैंने अभी इसे एक डेटाबेस को प्रबंधित करने के लिए बहुत उपयोगी पाया है जिसे मैं हर हफ्ते जोड़ता हूं। क्या मैं आपसे पूछ सकता हूं कि + ['']: तीसरी पंक्ति में उपलब्ध है?
डायलन वारबर्ग

1
मैं arcpy.ListFeatureClasses को चापलूसी के पाश के अंदर कहता हूं। मुझे उन फीचरक्लैस को शामिल करने की आवश्यकता है जो किसी भी सुविधा डेटासेट (उर्फ स्टैंडअलोन फीचर क्लास) के अंदर नहीं हैं, इसलिए मैं उन डेटासेटों की सूची में '' जोड़ देता हूं जिनके कारण ListFeatureClasses को '' के साथ बुलाया जा सकता है।
गटचुला

12

मैंने गोटुला के उत्तर का उपयोग करके समाप्त कर दिया , लेकिन बिना उपज के क्योंकि मैं आम तौर पर बनाए गए एफसी हैंडल का फिर से उपयोग करता हूं और उपज का उपयोग एक बार किया जाता है , परित्याग करना मेरे लिए पढ़ने और समझने के लिए आसान है कि क्या 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
...

यह अब एक मॉड्यूल में है जिसे मैं चापलूस * कहता हूं । अपने अन्य कोड या PYTHONPATH के साथ रखें और फिर:

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

आर्कप्लस वाइल्डकार्ड फ़िल्टरिंग को भी जोड़ता है; केवल फीचर वर्गों को संसाधित करने के लिए जो "हाइड्रो" वाले फीचर डेटासेट में "HD_" से शुरू होते हैं

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

। * अब जीथुब पर, 10.x के लिए उन्नत किया गया। आर्कगिस 9.3 के लिए यहां देखें ।


1
यकीन नहीं होता कि मैं yieldयहाँ के उपयोग से बचने के पीछे के तर्क को समझता हूँ । एक के लिए, आप जिस "हैंडल" को संदर्भित करते हैं, वह बिल्कुल भी हैंडल नहीं है, वे सिर्फ तार हैं। और यदि आपका इरादा कई पुनरावृत्तियों के लिए चारों ओर सुविधा वर्गों की सूची रखने का है, तो आप अभी भी इसे जनरेटर फ़ंक्शन के रूप में रख सकते हैं और इसे "बस" सूचीबद्ध my_list = list(generator_function(args))करें : यह जनरेटर का मूल्यांकन करता है और परिणाम को सूची चर में संग्रहीत करता है।
blah238

@ blah238: ओह। मुझे लगता है कि मैं अभी भी उपज नहीं है। मुझे समझ में आया कि क्या एक बयान की fcs = fcs.append(...)तुलना में बहुत जल्दी कर रहा है fcs = list(yield(...))
मैट विल्की

8

मुझे एहसास है कि यह सवाल 9.3 टैग किया गया है, लेकिन 10.1 पर एक ही जवाब की तलाश करने वाले किसी भी व्यक्ति को arcpy.da.Walk का उपयोग करना बेहतर है । यह ListDatasets / FeatureClasses / Rasters / etc की तुलना में अधिक तेज और सटीक है।

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, आदि हमेशा सही डेटासेट वापस नहीं करते हैं। इसके अलावा, आपको एसडीई और फ़ाइल जीडीबी के बीच अलग-अलग परिणाम मिलते हैं। मुझे सटीक मुद्दा याद नहीं आ रहा है, लेकिन हमने arcpy.List का उपयोग करना बंद कर दिया है ... क्योंकि हम परिणामों पर भरोसा नहीं कर सकते।
jon_two

5

ListDatasets विधि मैं क्या लगता है कि आप के लिए देख रहे है। इस एफजीडीबी में एक एफडी है, जिसे "वेल्स" कहा जाता है और इसमें 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.