การแสดงคลาสคุณลักษณะทั้งหมดในไฟล์ Geodatabase รวมถึงภายในชุดข้อมูลคุณสมบัติ?


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

โปรดระบุเวอร์ชันที่คำตอบของคุณใช้กับ ArcGIS Desktop (ฉันกำลังมองหา 9.3 แต่เราอาจรวบรวมรุ่นทั้งหมดในที่เดียว)


1
คำถามและคำตอบที่เกี่ยวข้องมากขึ้น (รวมถึงการใช้arcpy.da.Walk) เป็นวิธีการสร้างสินค้าคงคลัง GIS?
blah238

คำตอบ:


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)

ดีและสะอาด!
Chad Cooper

1
ขอบคุณ gotchula! นั่นเป็นครั้งแรกที่ฉันได้พบข้อความสั่งผลต้องอ่านสักนิดเพื่อให้เข้าใจ คุณลืมที่จะสังเกตตัวอย่างของคุณสำหรับ arcgis v10
matt wilkie

1
ขออภัยใช่สำหรับ 10.x และใช่อัตราผลตอบแทนที่ดีทำให้รหัสที่สะอาด
gotchula

ขอบคุณ gotchula ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันเพิ่งพบว่ามีประโยชน์มากสำหรับการจัดการฐานข้อมูลที่ฉันเพิ่มทุกสัปดาห์ ฉันขอถามคุณว่า + ['']: สำเร็จในบรรทัดที่ 3 ได้อย่างไร
Dylan Warburg

1
ฉันเรียก arcpy.ListFeatureClasses ภายในลูปของ arcpy.ListDatasets ฉันจำเป็นต้องรวม featureclasses ซึ่งไม่ได้อยู่ในชุดข้อมูลคุณลักษณะใด ๆ (หรือที่รู้จักกันว่าคลาสคุณสมบัติแบบสแตนด์อโลน) ดังนั้นฉันจึงเพิ่ม '' ลงในรายการชุดข้อมูลที่ทำให้ ListFeatureClasses ถูกเรียกด้วย '' เป็นตัวแปร fds
gotchula

12

ฉันสิ้นสุดการใช้คำตอบของ gotchulaแต่ไม่มีผลตอบแทนเพราะฉันมักจะกลับมาใช้จับเอฟซีที่สร้างขึ้นและอัตราผลตอบแทนของถูกนำมาใช้ครั้งเดียวแล้วทิ้งมันง่ายสำหรับผมที่จะอ่านและเข้าใจในสิ่งที่จะทำมากกว่า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 สำหรับ ArcGIS 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

ฉันจะเร็วขึ้นตามที่กำหนด คุณสามารถขยายความ "แม่นยำยิ่งขึ้น" ได้ไหม? ขอบคุณ
matt wilkie

ListDatasets, ListFeatureClasses ฯลฯ จะไม่ส่งคืนชุดข้อมูลที่ถูกต้องเสมอไป นอกจากนี้คุณยังได้รับผลลัพธ์ที่แตกต่างกันระหว่าง SDE และไฟล์ GDB ฉันจำปัญหาไม่ได้ แต่เราหยุดใช้ arcpy รายการ ... เพราะเราไม่สามารถเชื่อถือผลลัพธ์ได้
jon_two

5

ListDatasets วิธีคือสิ่งที่ผมคิดว่าคุณกำลังมองหา FGDB นี้มี FD ในนั้นเรียกว่า "Wells" และมี 3 FCs ในนั้น สำหรับ 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
>>>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.