Với arcpy, làm cách nào để phát hiện các lớp quan hệ trong tệp GDB (hoặc tôi không thể)?


10

Tôi muốn có thể phát hiện các lớp mối quan hệ trong một tệp GDB. Vì người dùng tập lệnh của tôi có thể chỉ có giấy phép cấp ArcView, nên họ sẽ không thể thao tác lược đồ của lớp tính năng (cụ thể là thêm trường) trong không gian làm việc có các lớp quan hệ. Làm cách nào để phát hiện sự hiện diện của các lớp mối quan hệ, để tôi có thể ghi lại chúng, tránh chúng theo chương trình và cho phép tập lệnh tiếp tục?

Câu trả lời:


6

Các relationshipClassNamesbất động sản được cho là để làm điều này nhưng nó dường như không làm việc cho tôi (thử nghiệm trong một file geodatabase, tạo lớp mối quan hệ giữa hai lớp đối tượng, kiểm tra tài sản, danh sách trả về là trống cho cả hai). Có lẽ nó sẽ làm việc cho bạn.


Cảm ơn. Tôi đã bỏ lỡ làm thế nào để đến lớp học mối quan hệ ngay từ đầu, nhưng bạn đã cho tôi manh mối. Tôi sẽ kiểm tra thuộc tính mối quan hệClassNames và cho bạn biết cách thức hoạt động (hoặc không).
celticflute

3

Theo đề xuất @ blah238, mã python này liệt kê tất cả các lớp mối quan hệ trong Cơ sở dữ liệu địa lý và đưa chúng vào một danh sách duy nhất (relClass):

inGDB = r"D:\mygeodatabase.gdb"
env.workspace = inGDB
#################Getting all Tables and Feature Classes###########
fcs = []
#root of workspace
for item in arcpy.ListFeatureClasses("*"):    fcs.append(item)
for item in arcpy.ListTables("*"):    fcs.append(item)

fds = arcpy.ListDatasets("*","Feature")
for fd in fds:
    env.workspace = inGDB +'\\'+fd
    for fc in arcpy.ListFeatureClasses("*"):
        fcs.append(fd+'/'+fc)
    for tb in arcpy.ListTables("*"):
        fcs.append(fd+'/'+tb)

env.workspace = inGDB
relClasses = set()
for i,fc in enumerate(fcs): 
    desc = arcpy.Describe(fc)
    for j,rel in enumerate(desc.relationshipClassNames):
        relDesc = arcpy.Describe(rel)
        if relDesc.isAttachmentRelationship:
            continue
        relClasses.add(rel)

print relClasses

1

Tôi đã vật lộn với điều này cho đến khi nhận ra Arcpy thấy các lớp quan hệ thông qua các bảng mà chúng được liên kết. Đây là một đoạn mã nhỏ để kiểm tra tên lớp quan hệ lớn hơn độ dài 30:

arcpy.env.workspace = 'C:/workspace'

# Local variables
tables = arcpy.ListTables()

# Iterate through tables in file geodatabase (workspace)
for t in tables:
    # Get relationship class(es) associated with table
    desc = arcpy.Describe(t)
    rcs = desc.relationshipClassNames
# Iterate through any relationship classes associated with current table in loop
    for r in rcs:
        if len(r) > 30:
            print 'Relationship class ' + r + ' has ' + str(len(r)) + ' characters.'

0

Tôi đang ở 10.5.1 và có vẻ như mối quan hệClassNames đang đưa cho tôi danh sách các tên lớp mối quan hệ giống như nó được yêu cầu

layer = "C:\\Geodatabases\\somegeodatabase.gdb\\my_layer"
desc = arcpy.Describe(layer)
print desc.relationshipClassNames
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.