Mehr

Arcpy.mapping.Layer-Fehler beim Arbeiten mit Dateien über mehrere Datenrahmen

Arcpy.mapping.Layer-Fehler beim Arbeiten mit Dateien über mehrere Datenrahmen


Ich kann den folgenden Code in einem mxd mit einem einzelnen Datenrahmen ausführen. Ich brauche es jedoch, um einen mxd auszuführen und zu durchlaufen, der mehrere Datenrahmen mit identisch benannten Dateien und Datenquellen mit denen in meiner Lyrlist hat.

BEARBEITEN Zusätzliche Information - Die Absicht der letzten if-Anweisung bestand darin, eine Problemumgehung für die Unfähigkeit von arcpy bereitzustellen, den Anzeigeausdruck im Dialogfeld "Layer-Eigenschaften" festzulegen, indem eine Datei mit einem Namensfeld erneut hinzugefügt wird. Der Kern der Frage ist also, wie man einen Layer-Anzeigeausdruck am besten automatisiert aktualisiert (vorzugsweise mit Python, da ich mit ArcObjects nicht vertraut bin).

import arcpy lyrlist = ['Inset Bridges','Bridges', 'Transportation Points', 'Transportation Lines'] mxd = arcpy.mapping.MapDocument("Current") dflist = arcpy.mapping.ListDataFrames(mxd) for df in dflist : if df.scale <= 126720: für lyr in (arcpy.mapping.ListLayers(mxd, "", df)): if lyr.supports("DEFINITIONQUERY"): if lyr.name in lyrlist: NewFile = arcpy.mapping .Layer(lyr.dataSource) OldFN = lyr.name NewFile.name ="NewFi" lyr.name = "OldFi" arcpy.mapping.InsertLayer(df, lyr, NewFile, "AFTER") #die folgende Zeile ergibt den ValueError bei Ausführung in einem #mxd mit mehreren Datenrahmen mit Dateinamen aus lyrlist updateLyr = arcpy.mapping.Layer("NewFi") sourceLyr = arcpy.mapping.Layer("OldFi") arcpy.mapping.UpdateLayer(df, updateLyr, sourceLyr, True) updateLyr.name = OldFN arcpy.mapping.RemoveLayer(df, lyr) arcpy.RefreshTOC() arcpy.RefreshActiveView print "script complete" del mxd

Der Code funktioniert gut, bis er an die Stelle gelangt, an der ich die Variable updateLyr zuweist. Das bringt mir folgenden Fehler:

Laufzeitfehler Traceback (letzter Aufruf zuletzt):

Datei "", Zeile 44, in

Datei "c:program files (x86)arcgisdesktop10.1arcpyarcpyarcobjectsmixins.py", Zeile 389, in drin super(LayerMixin, selbst).drin(Lyrfile)

Datei "c:program files (x86)arcgisdesktop10.1arcpyarcpyarcobjects_base.py", Zeile 47, in drin für Argumente in Argumenten))

ValueError: Object: CreateObject Layer ungültige Datenquelle


Um dies zu debuggen, empfehle ich, dass Sie Folgendes ändern:

für df in dflist: if df.scale <= 126720: für lyr in (arcpy.mapping.ListLayers(mxd, "", df)): if lyr.supports("DEFINITIONQUERY"):

zu:

for df in dflist: if df.scale <= 126720: for lyr in (arcpy.mapping.ListLayers(mxd, "", df)): print df.name + ": " + lyr.name if lyr.supports(" DEFINITIONABFRAGE"):

Ich habe das Obige nicht getestet, aber es sollte Ihnen ermöglichen, den Datenrahmen und die Ebene darin zu bestimmen, die Ihren Fehler auslöst.


Ich bekam gute Debugging-Ideen, die mir letztendlich halfen, meine Lösung zu finden, die am Ende einfacher war als das, was ich versucht hatte. Grundsätzlich lasse ich den arcpy UpdateLayer mehr von der Behebung meines Display Expression-Problems. Ich bin mir nicht sicher, was die Ursache meines ursprünglichen Problems war, aber die folgende Lösung hat das getan, was ich wollte:

* BEARBEITEN Hier ist meine Lösung. Es wurde bearbeitet, um den letzten UpdateLayer-Parameter in False zu ändern. Dies war kritisch, da dann die gesamte Layer-Vorlage und nicht nur die Legende auf die Datei angewendet wird, deren Anzeige aktualisiert werden musste. Weitere Informationen finden Sie in der Dokumentation von ESRI.

import arcpy mxd = arcpy.mapping.MapDocument("Current") dflist = arcpy.mapping.ListDataFrames(mxd) für df in dflist: if df.scale <= 126720: für lyr in (arcpy.mapping.ListLayers(mxd, " ", df)): if lyr.supports("DEFINITIONQUERY"): if lyr.name == "Bridges": sourceLyr = arcpy.mapping.Layer(r"C:Bridgefile.lyr") arcpy.mapping.UpdateLayer( df, lyr, sourceLyr, False) print lyr.name + "aktualisiert" elif lyr.name == "Transportlinien": sourceLyr = arcpy.mapping.Layer(r":C:TransFile.lyr") arcpy.mapping. UpdateLayer(df, lyr, sourceLyr, False) print lyr.name + "updated" arcpy.RefreshTOC() arcpy.RefreshActiveView print "script complete" del mxd

Schau das Video: Map Automation 2: Using Arcpy to Change Layer Symbology