С помощью arcpy, как я могу определить классы отношений в файле GDB (или я не могу)?

10

Я хотел бы иметь возможность обнаруживать классы отношений в файле GDB. Поскольку пользователи моего скрипта могут иметь только лицензию уровня ArcView, они не смогут манипулировать схемой класса пространственных объектов (в частности, добавить поле), который находится в рабочей области, которая имеет классы отношений. Как определить наличие классов отношений, чтобы я мог задокументировать их, избежать их программным путем и позволить сценарию продолжить?

celticflute
источник

Ответы:

6

relationshipClassNamesСвойство предполагается сделать это , но это не похоже на работу для меня (проверено в файле базы геоданных, созданный класс отношений между двумя клас, проверяется свойство, список возвращается пустой для обоих). Может быть, это будет работать для вас.

blah238
источник
Спасибо. Я скучал по тому, как добраться до уроков отношений, но ты дал мне подсказку. Я проверю свойство Relationship Class и покажу, как оно работает (или нет).
celticflute
3

Согласно предложению @ blah238, этот код на python перечисляет все классы отношений в базе геоданных и помещает их в уникальный список (relClasses):

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

Я боролся с этим, пока не понял, что arcpy видит классы отношений через таблицы, с которыми они связаны. Вот небольшой фрагмент кода для проверки имен классов отношений, длина которых превышает 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

Я нахожусь на 10.5.1, и похоже, что relationsClassNames дает мне список имен классов отношений, как это должно быть

layer = "C:\\Geodatabases\\somegeodatabase.gdb\\my_layer"
desc = arcpy.Describe(layer)
print desc.relationshipClassNames
Амир Сулеман
источник