Con arcpy, come posso rilevare le classi di relazione in un file GDB (o non posso)?


10

Vorrei essere in grado di rilevare le classi di relazione in un file GDB. Poiché gli utenti del mio script potrebbero avere solo una licenza di livello ArcView, non sarebbero in grado di manipolare lo schema di una classe di caratteristiche (in particolare per aggiungere un campo) che si trova in uno spazio di lavoro con classi di relazione. Come posso rilevare la presenza di classi di relazione, in modo da poterle documentare, evitarle a livello di programmazione e consentire allo script di continuare?

Risposte:


6

Si suppone che larelationshipClassNames proprietà lo faccia ma non sembra funzionare per me (testato in un geodatabase di file, creato una classe di relazione tra due classi di caratteristiche, verificato la proprietà, l'elenco restituito è vuoto per entrambi). Forse funzionerà per te.


Grazie. Mi mancava come arrivare alle lezioni di relazione in primo luogo, ma mi hai dato la chiave. Esaminerò la proprietà relationshipClassNames e ti farò sapere come funziona (o no).
celticflute,

3

Come suggerito da @ blah238, questo codice Python elenca tutte le classi di relazione all'interno di un Geodatabase e le inserisce in un elenco univoco (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

Ho lottato con questo fino a quando realizzando che arcpy vede le classi di relazione attraverso le tabelle alle quali sono associate. Ecco un piccolo pezzo di codice per verificare la presenza di nomi di classi di relazione maggiori della lunghezza 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

Sono al 10.5.1 e sembra che il relationshipClassNames mi stia dando l'elenco dei nomi delle classi di relazioni come dovrebbe

layer = "C:\\Geodatabases\\somegeodatabase.gdb\\my_layer"
desc = arcpy.Describe(layer)
print desc.relationshipClassNames
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.