Programmgesteuertes Erkennen von Join mit ArcPy?

10

Ich habe Python-Code, der in einem ArcMap-Projekt gestartet wird. Alle Verknüpfungen, die der Benutzer möglicherweise im Projekt erstellt hat, müssen entfernt werden, damit mein Code ausgeführt werden kann. Leider zerstört der Code, der einen Join entfernt… arcpy.RemoveJoin_management ("layer1", "layer2") ... auch einige der Layereigenschaften, die für meine Anwendung kritisch sind (hervorgehobene Felder, schreibgeschützte Felder usw.).

Wenn Verknüpfungen entfernt werden, indem Sie mit der rechten Maustaste auf die Ebene in ArcMap klicken und "Verknüpfungen entfernen" auswählen, bleiben die Ebeneneigenschaften erhalten.

Wenn ich in meinem Code feststellen kann, dass ein Join vorhanden ist, beende ich den Code einfach und zeige eine Meldung an, dass der Benutzer seine Joins manuell entfernen muss, bevor er versucht, den Code auszuführen. Also ... Kann ein Join programmgesteuert erkannt werden?

BrianPeasley
quelle
Ich bin ein bisschen verloren, wie das Entfernen von RemoveJoin über arcpy Probleme verursacht. Wie geht es darum, ein schreibgeschütztes Feld zu ruinieren? Verursacht die Verwendung des Werkzeugs "Join entfernen" in ArcMap dieselben Probleme?
Nathanus
Vielleicht besteht eine andere Möglichkeit, dies in Angriff zu nehmen, darin, Ihren Python-Code unempfindlich gegenüber Joins zu machen?
Dan S.
@ Nathanus - Das Handbuch Entfernen von Join in ArcMap zerstört meine Ebeneneigenschaften nicht, das GP-Tool jedoch. Hier ein relevantes Zitat aus der ESRI-Hilfe: "Da diese Tools die eigentliche Join-Verarbeitung hinter den Kulissen etwas anders ausführen als das Dialogfeld" Join-Daten ", verwenden Sie die Tools, wenn Sie unerwartete Probleme mit der Join-Funktionalität in diesem Dialogfeld haben. ""
BrianPeasley
@ Dan S. - Ich verwende Insert-Cursor und dergleichen in meinem Code. Ich habe keine Ahnung, wie ich meinen Code für Joins unempfindlich machen würde.
BrianPeasley
1
Nun, es hat sich gelohnt zu fragen. ;) forums.esri.com/Thread.asp?c=93&f=1729&t=293173 scheint zu implizieren, dass Sie möglicherweise Werte in einer verknüpften Tabelle aktualisieren können, indem Sie den Spaltennamen den Tabellennamen voranstellen . Vielleicht würde es auch über einen Einsatz hinweg funktionieren?
Dan S.

Antworten:

8

Schade, dass es in der arcpy.Layer-Klasse keine hasJoin-Eigenschaft gibt . Ich denke, Sie können einen Join testen, indem Sie sich die Feldnamen ansehen. Hier ist ein einfacher Proof of Concept für Daten in einer Datei-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
Derek Swingley
quelle
Das sieht vielversprechend aus! Ich verstehe das Fleisch dessen, was es tut, nicht: "if f.name.find (lyr.datasetName)> -1:", aber ich werde es in ein paar Tagen versuchen und zurückmelden (ich werde gleich schneien in & Macht verlieren!) ... Danke!
BrianPeasley
Froh, dass ich Helfen kann. Überprüfen Sie die integrierte Suchmethode für Python-Zeichenfolgen: docs.python.org/library/string.html und das Dokument für arcpy-Feldobjekte: help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#/ Field /… Ich würde sagen, geben Sie diesem Code einen Versuch mit Ihren Daten und sehen Sie, ob es funktioniert.
Derek Swingley
1
Am Ende habe ich eine Funktion verwendet, die dieser sehr ähnlich ist, und sie funktioniert hervorragend ... Für jede Ebene in meinem Dokument durchlaufe ich die Feldliste und verwende Python, um festzustellen, ob der Feldname einen "Punkt" enthält.
BrianPeasley
1

Ich denke, Sie werden feststellen, dass es keine kugelsichere Möglichkeit gibt, dies mit GP-Objekten zu tun. Sie müssen ArcObjects und comtypes verwenden. Hier einige Diskussionen aus den ESRI-Foren zu den Schwierigkeiten bei der Suche nach Verknüpfungen mit den Standard-GP-Tools / -Objekten: https://geonet.esri.com/thread/20317

blah238
quelle
ArcObjects und comtypes werden nicht die Lösung für dieses Projekt sein, sie sind mir fremd und dieses Projekt ist gestern fällig. Danke, dass du mich auf diesen Forenthread verwiesen hast! Ich werde die dort vorgestellte Idee ausprobieren: "... überprüfe, ob einer der fieldname.split (".) Zu 2 Teilen führen würde, von denen der erste die Join-Tabelle sein würde! "
BrianPeasley