Rilevare Join a livello di codice utilizzando ArcPy?


10

Ho del codice Python che viene lanciato da un progetto ArcMap. Eventuali join che l'utente potrebbe aver creato nel progetto devono essere rimossi per consentire l'esecuzione del mio codice. Sfortunatamente, il codice che rimuove un join ... arcpy.RemoveJoin_management ("layer1", "layer2") ... rompe anche alcune delle proprietà del layer che sono fondamentali per la mia applicazione (campi evidenziati, campi di sola lettura, ecc.).

Se i join vengono rimossi facendo clic con il pulsante destro del mouse sul layer in ArcMap e selezionando “Rimuovi join” le proprietà del layer restano intatte.

Se riesco a rilevare l'esistenza di un join all'interno del mio codice, uscirò semplicemente dal codice e visualizzerò un messaggio che l'utente deve rimuovere manualmente i propri join prima di tentare di eseguire il codice. Quindi ... un join può essere rilevato a livello di codice?


Mi sono perso un po 'su come causare RemoveJoin tramite arcpy causi problemi. Come si fa a rovinare un campo di sola lettura? Inoltre, l'utilizzo dello strumento Rimuovi join in ArcMap causa gli stessi problemi?
Nathanus,

Forse un altro modo per affrontarlo sarebbe rendere il tuo codice Python insensibile ai join?
Dan S.

@ Nathanus - Il manuale Rimuovi Join in ArcMap non rompe le proprietà del mio livello, lo strumento GP. Ecco una citazione pertinente della Guida di ESRI: "Poiché questi strumenti eseguono l'elaborazione effettiva del join dietro le quinte in modo leggermente diverso rispetto alla finestra di dialogo Dati join, utilizzare gli strumenti se si verificano problemi imprevisti con la funzionalità di join in quella finestra di dialogo. "
BrianPeasley,

@ Dan S. - Sto usando i cursori di inserimento e simili nel mio codice. Non ho idea di come farei per rendere il mio codice insensibile ai join.
BrianPeasley,

1
bene, valeva la pena chiedere. ;) forums.esri.com/Thread.asp?c=93&f=1729&t=293173 sembra implicare che potresti essere in grado di aggiornare i valori in una tabella unita prefissando i nomi delle colonne con il nome della tabella, tuttavia; forse avrebbe funzionato anche su un inserto?
Dan S.

Risposte:


8

Peccato che non ci sia una proprietà hasJoin nella classe arcpy.Layer . Penso che puoi provare per un join guardando i nomi dei campi però. Ecco una semplice prova di concetto per i dati in un file geodatabase:

import arcpy, arcpy.mapping as arc

def joinCheck(lyr):
  fList = arcpy.Describe(lyr).fields
  for f in fList:
    if f.name.find(lyr.datasetName) > -1:
      return True
  return False

arcpy.env.workspace = r'<path_to_your_gdb>'
mxd = arc.MapDocument(r'<path_to_your_mxd>')
lyrs = arc.ListLayers(mxd)
for lyr in lyrs:
  # ignore group layers
  if not lyr.isGroupLayer:
    hasJoin = joinCheck(lyr)
    if hasJoin:
      print '\nFound a join: %s.' % lyr.datasetName
    else:
      print '\nNo join found on %s.' % lyr.datasetName

Sembra promettente! Non capisco la carne di ciò che sta facendo: "if f.name.find (lyr.datasetName)> -1:" ma lo proverò tra qualche giorno e riporterò indietro (sto per nevicare in & perde potere!) ... Grazie!
BrianPeasley,

Felice di aiutare. Scopri il metodo di ricerca incorporato per le stringhe di Python: docs.python.org/library/string.html e anche il documento per gli oggetti di campo arcpy : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Campo / ... Direi di dare a questo codice uno scatto con i tuoi dati e vedere se funziona.
Derek Swingley,

1
Ho finito per usare una funzione molto simile a questa e funziona benissimo ... Per ogni livello nel mio documento, cerco l'elenco dei campi e uso Python per determinare se c'è un "punto" nel nome del campo.
BrianPeasley,

1

Penso che scoprirai che non esiste un modo antiproiettile per farlo con oggetti GP, dovrai usare ArcObjects e i comtype. Ecco alcune discussioni dai forum ESRI sulle difficoltà nel controllo dei join con gli strumenti / oggetti GP standard: https://geonet.esri.com/thread/20317


ArcObjects e comtypes non saranno la soluzione per questo progetto, sono estranei a me e questo progetto è dovuto ieri. Grazie per avermi indicato il thread del forum! Proverò l'idea qui presentata: "... controlla se uno qualsiasi dei fieldname.split (".)
Provocherebbe
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.