Liệt kê các lớp tính năng trong nhiều cơ sở dữ liệu địa lý trong thư mục bằng ArcPy?


11

Tôi có một thư mục chứa nhiều cơ sở dữ liệu địa lý trong đó. Trong cơ sở dữ liệu địa lý là các lớp tính năng. Tôi muốn có một danh sách các lớp tính năng trong các cơ sở dữ liệu địa lý này bằng cách sử dụng tập lệnh Python. Tôi chỉ mới nhận được danh sách cơ sở dữ liệu địa lý. Có ai có một đề nghị về việc liệt kê các lớp tính năng trong cơ sở dữ liệu địa lý không?

Dòng mục in trong tập lệnh của tôi cho tôi các kết quả sau:

C:\output\data.gdb 
C:\output\otherdata.gdb
C:\output\somethingelse.gdb

Tôi muốn tạo một danh sách các lớp tính năng trong cơ sở dữ liệu địa lý ở trên. Dưới đây là kịch bản của tôi cho đến nay.

    import arcpy, os, sys
    from arcpy import env

    arcpy.env.workspace = "D:\\output"
    inWorkspace = arcpy.env.workspace

    workspaces = arcpy.ListWorkspaces("*", "FileGDB")
    for item in workspaces:
         print item #This part gives me the print statements I shared above
    # fcList = arcpy.ListFeatureClasses() #I haven't figured this part out
    #I want to list the feature classes in the geodatabases

1
Ngoài ra còn có các bộ dữ liệu tính năng trong cơ sở dữ liệu địa lý?
blah238

Không, không có bộ dữ liệu tính năng.
Patty Jula

Câu trả lời:


14

Thủ thuật bạn đang thiếu là biến mỗi gdb thành không gian làm việc hoạt động trước khi liệt kê nội dung:

for item in workspaces:
    print item
    env.workspace = item
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        print '\t', fc

Cũng lưu ý rằng điều này sẽ bỏ lỡ một lớp tính năng bên trong bộ dữ liệu tính năng, xem 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? để giải quyết điều đó.

Nói chung, nếu bạn sử dụng, rbạn không cần phải nhân đôi tất cả mọi thứ (giúp sao chép và dán dễ dàng hơn từ thanh địa chỉ windows explorer, v.v.): vdr'D:\output'


1
Thật tuyệt, thật tuyệt! Tôi đã chọn một vài công cụ khác từ những gì bạn đã chia sẻ - không biết tôi có thể sử dụng env.workspace như thế. Cảm ơn bạn!
Patty Jula

1
@PattyJula Bạn hoan nghênh Patty. Ngoài ra, tốt hơn hết là tránh các từ chung chung như 'mục' vì nó có thể áp dụng cho mọi thứ và trong các tập lệnh lớn hơn gây nhầm lẫn. Nó dễ dàng hơn để ghi nhớ singular-> số nhiều khác biệt - mặc dù bạn làm cần đào tạo chính mình để xem cho dấu s . Tôi sử dụng chữ viết tắt để giúp với cái sau. Ví dụ for wspace in workspaces:for fc in featureclasses:.
matt wilkie

8

Kịch bản này sẽ đối phó với bất kỳ bộ dữ liệu tính năng hiện có nào (ít nhất là về lý thuyết - tôi chưa thử nghiệm nó). Mặc dù cùng một ý tưởng chung, nếu có bộ dữ liệu tính năng, bạn cần đặt thư mục làm việc của mình thành tập dữ liệu đó trước khi liệt kê các tính năng bên trong.

import arcpy

dir = r'D:\output'
arcpy.env.workspace = dir

gdbList = arcpy.ListWorkspaces('*','FileGDB')

for gdb in gdbList:
    arcpy.env.workspace = gdb               #--change working directory to each GDB in list
    datasetList = arcpy.ListDatasets('*','Feature')     #--make a list of all (if any) feature datasets that exist in current GDB
    fcList = arcpy.ListFeatureClasses()         #--make a list of all feature in current GDB (root)
    for fc in fcList:
        print arcpy.env.workspace,fc            #--print directory,fc name
    for dataset in datasetList:
        arcpy.env.workspace = dataset   #--change working directory to each dataset (if any) in list
        fcList = arcpy.ListFeatureClasses()     #--make a list of all feature in current GDB (current dataset)
        for fc in fcList:
            print arcpy.env.workspace,fc        #--print directory,fc name
        arcpy.env.workspace = gdb

1
+1 cho ý kiến ​​và tích hợp FD. Cá nhân tôi sẽ không sử dụng 'temp' làm tên biến vì nó có nghĩa là "vứt đi" và "miễn phí để xóa". Biến là có thể loại bỏ, nhưng nội dung của nó, cơ sở dữ liệu, có thể không. Trong mọi trường hợp, trong trường hợp này là không cần thiết, chỉ cần sử dụng arcpy.env.workspace = gdbnhư ListWorkspaces trả về đường dẫn đầy đủ. ;-)
matt wilkie

Bạn hoàn toàn đúng, Matt. Tôi sẽ cập nhật ví dụ để tham khảo trong tương lai. Ngoài ra, tôi đã quên một dòng ở cuối đặt lại không gian làm việc cho GDB gốc trước khi cố gắng đi đến tập dữ liệu tính năng tiếp theo (mặc dù trong trường hợp này không cần thiết).
Jason
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.