Liệt kê tất cả các lớp tính năng trong Cơ sở dữ liệu địa lý tệp, bao gồm trong bộ dữ liệu tính năng?


24

Từ python, làm cách nào tôi có thể xây dựng danh sách tất cả các lớp đối tượng trong cơ sở dữ liệu địa lý tệp (* .gdb), bao gồm cả các bộ dữ liệu tính năng? Các ví dụ chuẩn chỉ liệt kê các tính năng các lớp ở cấp cao nhất của geodatabase:

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

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

for fc in fcs:
    print fc

Vui lòng cho biết phiên bản ArcGIS Desktop mà câu trả lời của bạn áp dụng cho (Tôi đang tìm kiếm 9.3 nhưng chúng tôi cũng có thể thu thập tất cả các phiên bản ở một nơi).


1
Một câu hỏi liên quan nhưng cập nhật hơn (bao gồm cả việc sử dụng arcpy.da.Walk) là Làm thế nào để tạo một kho lưu trữ GIS?
blah238

Câu trả lời:


34

Quy trình này cho arcgis10 trả về tất cả fcs (độc lập HOẶC trong tập dữ liệu tính năng) bên trong gdb. Chỉ cần đặt arcpy.env.workspace của bạn sau đó thực hiện một vòng lặp for

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)

Đẹp và sạch sẽ!
Chad Cooper

1
cảm ơn gotchula! Đó là lần đầu tiên tôi gặp phải tuyên bố lợi suất, phải đọc một chút để tìm ra nó. Bạn quên lưu ý mẫu của bạn là cho arcgis v10.
matt wilkie

1
xin lỗi, vâng, đây là cho 10.x. và có, sản lượng là tuyệt vời, làm cho mã sạch.
gotchula

Cảm ơn gotchula, tôi biết đây là một bài viết cũ nhưng tôi chỉ thấy điều này rất hữu ích cho việc quản lý cơ sở dữ liệu tôi thêm vào mỗi tuần. Tôi có thể hỏi bạn những gì + ['']: hoàn thành trong dòng thứ 3 không?
Dylan Warburg

1
tôi gọi arcpy.ListFeatureClass bên trong một vòng lặp của arcpy.ListDatasets. Tôi cần bao gồm các featureclass KHÔNG có trong bất kỳ tập dữ liệu tính năng nào (còn gọi là lớp tính năng độc lập), vì vậy tôi thêm '' vào danh sách các bộ dữ liệu khiến ListFeatureC Cầu được gọi với '' là biến fds.
gotchula

12

Cuối cùng tôi đã sử dụng câu trả lời của gotchula , nhưng không có năng suất vì tôi thường sử dụng lại các tay cầm FC được tạo và năng suất được sử dụng một lần sau đó loại bỏ nó giúp tôi dễ đọc và hiểu những gì fcs.append()đang làm hơn 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            

Các kết quả:

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

Đây là bây giờ trong một mô-đun tôi gọi arcplus *. Đặt với mã khác của bạn hoặc PYTHONPATH và sau đó:

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

Arcplus cũng thêm tính năng lọc ký tự đại diện; chỉ xử lý các lớp tính năng bắt đầu bằng "HD_" trong bộ dữ liệu tính năng có chứa "Hydro"

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

. * hiện có trên Github, được nâng cấp cho 10.x. Đối với arcgis 9.3 xem tại đây .


1
Không chắc chắn tôi hiểu lý do căn bản đằng sau việc tránh sử dụng yieldở đây. Đối với một, "tay cầm" mà bạn đề cập đến hoàn toàn không phải là tay cầm, chúng chỉ là chuỗi. Và nếu ý định của bạn là giữ danh sách các lớp tính năng xung quanh cho nhiều lần lặp, bạn vẫn có thể giữ nó như một hàm tạo và chỉ "liệt kê" nó: my_list = list(generator_function(args))điều này đánh giá trình tạo và lưu trữ kết quả trong một biến danh sách.
blah238

@ blah238: ồ. Tôi đoán tôi vẫn không làm giảm năng suất. Tôi hiểu những gì một tuyên bố như fcs = fcs.append(...)đang làm nhanh hơn nhiều fcs = list(yield(...)).
matt wilkie

8

Tôi nhận ra câu hỏi này được gắn thẻ 9.3, nhưng bất kỳ ai đang tìm kiếm câu trả lời tương tự ở 10.1 trở đi thì tốt hơn là sử dụng arcpy.da.Walk . Nó nhanh hơn và chính xác hơn ListDatasets / FeatureClass / Rasters / v.v.

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)

Chức năng đi bộ hoạt động theo cách tương tự như đi bộ của trăn . Nó lặp qua các thư mục trong đường dẫn đã cho và tại mỗi lần lặp, root đại diện cho đường dẫn đầy đủ của thư mục, và các thư mục và bộ dữ liệu là danh sách các thư mục con và tệp có trong.

Khi đi qua cơ sở dữ liệu địa lý, các bộ dữ liệu tính năng được xử lý theo cách tương tự như các thư mục. Nếu bạn chỉ muốn liệt kê các bộ dữ liệu và bộ dữ liệu tính năng trong thư mục gốc và không mở bộ dữ liệu tính năng để xem nội dung, bạn có thể làm:

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

Tôi sẽ mất nhanh hơn như đã cho; bạn có thể mở rộng trên "chính xác hơn" mặc dù? Cảm ơn.
matt wilkie

ListDatasets, ListFeatureClass, v.v. không phải lúc nào cũng trả về các bộ dữ liệu chính xác. Ngoài ra, bạn nhận được kết quả khác nhau giữa SDE và tệp GDB. Tôi không thể nhớ chính xác vấn đề, nhưng chúng tôi đã ngừng sử dụng arcpy. Hãy ... vì chúng tôi không thể tin vào kết quả.
jon_two

5

Các ListDatasets phương pháp là những gì tôi nghĩ rằng bạn đang tìm kiếm. FGDB này có một FD trong nó được gọi là "Wells" và nó có 3 FC trong đó. Đối với 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
>>>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.