Ändern von Beschriftungsstilen (Schriftart, Farbe, Größe usw.) mit ArcPy?

9

Ich versuche, ein Python-Makro für ArcGIS 10.2 zu schreiben, das das Beschriften von Punkten in einer Ebene basierend auf verschiedenen Arten von Apartments automatisiert. Zum Beispiel würde eine Art von Wohnungen ein blaues Quadrat mit weißem fettem Text als eine Beschriftung haben; ein anderer hätte ein rosa Quadrat mit schwarzem fettem Text; Ein anderer hätte ein rotes Quadrat mit einem weißen Fettdruck usw.

Welchen Ausdruck oder welche Funktion würden Sie in arcpy verwenden, um den Stil dieser Beschriftungen zu ändern?

Derzeit kennzeichnet das Skript die Apartments mit einem Kartencode und ändert seinen Namen im Inhaltsverzeichnis in Apartments, wie es sollte.

Geben Sie hier die Bildbeschreibung ein

Jetzt möchte ich die Schriftart, die Grafik und die Größe der Beschriftungen ändern, um eine eindeutige Beschriftung für jede Beschriftung zu erstellen, und dann eine Schaltfläche zum Drücken und einfachen Automatisieren des Vorgangs erstellen, wenn wir eine dieser Ebenen ausführen müssen.

Gibt es eine Möglichkeit, die Schriftarten, Beschriftungen und Grafiken mithilfe von Python-Skripten (ArcPy, IDLE usw.) zu ändern?


Ich habe beschlossen, diesen Beitrag zu bearbeiten, um eine endgültige Beschreibung dessen zu geben, was ich hier vorhabe, damit keine Verwirrung entsteht. Im Wesentlichen sehen die Punkte auf der Karte so aus wie auf dem obigen Bild:

Geben Sie hier die Bildbeschreibung ein


Ich habe versucht, die lblClass.expressionFunktion zu verwenden, aber der Code, den ich verwenden möchte, funktioniert nicht. Ich denke, das ist wahrscheinlich der Schritt in die richtige Richtung. Im Folgenden finden Sie einen Code, den ich nur verwendet habe, um den Ausdruck labelClass.expression zum Ändern der Schriftarten der Beschriftungen zu erhalten.

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])
Tyler Spears
quelle

Antworten:

7

Die API arcpy.mapping bietet nur Zugriff auf eine begrenzte Anzahl von Ebeneneigenschaften, die direkt geändert werden können. Alle im Dialogfeld Ebeneneigenschaften gefundenen Eigenschaften können jedoch mithilfe der UpdateLayer-Funktion geändert werden. Die Informationen werden aus einer Quellenebene extrahiert und auf die Ebene in einem Kartendokument angewendet, das aktualisiert werden muss. Die Quellschicht kann entweder eine Ebenendatei (.lyr) oder eine Ebene innerhalb eines Kartendokuments sein. UpdateLayer ist eine robuste Funktion, da es auf verschiedene Arten verwendet werden kann, um unterschiedliche Ergebnisse zu erzielen.

Sie müssen die Symbologie / Beschriftungen wie gewünscht erstellen und in einer Ebenendatei speichern. Laden Sie dann diese Layer-Datei mit arcpy.mapping.UpdateLayer () .

Wenn mehrere Personen das Python-Add-In ausführen müssen, müssen Sie die Layer-Datei für alle zugänglich machen, z. B. für ein öffentliches Netzwerklaufwerk.


Am Ende habe ich eine benutzerdefinierte Toolbox zum Aktualisieren von Ebeneneigenschaften erstellt . Sie können eine Ebene im ArcMap-Inhaltsverzeichnis auswählen und anschließend eine Eingabe-Layer-Datei auswählen. Anschließend wird der Layer mit allen Eigenschaften in der Layerdatei aktualisiert und auf die ursprüngliche Feature-Class zurückgesetzt. Es funktioniert mit Daten in gdb, mdb, shp oder sde.

Zeigen Sie den Quellcode an

Bitte lassen Sie mich wissen, wenn Sie Fragen haben.

Geben Sie hier die Bildbeschreibung ein

ianbroad
quelle
Ich habe eine separate Layer-Datei aus einer anderen punktbasierten Datenebene erstellt, in der alles festgelegt ist (Symbologie und Beschriftungen). Sie wird ausgeführt, aber alles, was sie zu tun scheint, ist, die unbeschriftete, nicht symbolisierte Apartment-Datei (je nachdem, welche ich hinzufügen möchte) vollständig durch die zu ersetzen sourceLayer Apartment-Datei. Ich gehe davon aus, dass dies an der Falschmeldung im Abschnitt "Nur Symbologie aktualisieren" liegt. Gibt es eine Möglichkeit, dies auszuführen, sodass nur die Symbologie und Beschriftungen angewendet werden, die Punkte jedoch nicht an eine andere Stelle verschoben werden?
Tyler Spears
Nach welchen Funktionen würde ich suchen, um das zu tun? Ich bin mit Re-Sourcing nicht allzu vertraut. Ich schätze übrigens Ihre bisherige Hilfe.
Tyler Spears
Ich habe versucht, dies an meinen Code anzupassen. Es funktioniert über die UpdateLayer-Funktion, aber in Zeile 35: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]Es wird ein Fehler ausgegeben, der besagt, dass der Index außerhalb des Bereichs liegt.
Tyler Spears
Das bedeutet, dass die arcpy.mapping.ListLayersMethode im aktuellen mxd keine Ebene mit demselben Namen wie Ihr findet input_layer_file(ein Index für die [0]Rückgabe eines Index außerhalb des Bereichs bedeutet, dass die Liste keine Elemente enthält).
XIY
Ich habe es getan und ich denke, dass dies sehr nahe ist, aber das Problem ist, dass nach Abschluss des UpdateLayer-Teils der folgende Fehler ausgegeben wird: Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
Tyler Spears
6

Eine weitere Option besteht darin, den benutzerdefinierten Beschriftungsausdruck auf der Ebene (Ändern von Größe und Farbe usw.) mithilfe von Python festzulegen:

z.B

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

Erstellen von Label-Ausdrücken

Sie können eingestellt werden über:

LabelClass (arcpy.mapping)

BEARBEITEN:

Versuche dies:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

Sie können Ihre anderen Zeilenanweisungen entfernen (für loop, labClass und call to function). Außerdem muss die Funktion FindLabel heißen.

Artwork21
quelle
Ich habe versucht, etwas Ähnliches wie diese zu verwenden. Ich habe eine Definition mit dem Namen erstellt def getLabel (Code, Type)und nach dem Einrichten der if-else-Anweisungen für die verschiedenen von mir verwendeten Map-Codes 'lblClass.expression = getLabel ("[Map_Code]", "[Type]")' gesetzt, die gerade zurückgegeben wird Ein Fehler TypeError: unsupported operand type(s) for &: 'str' and 'str'Ich folge im Grunde den Beispielen der Esri-Website. Wenn ich einfach beweisen kann, dass ich die Schriftart ändern kann, kann ich die schwierigeren Aspekte (wie Form, Hintergrund und Farbe der Etiketten) anpassen.
Tyler Spears
@ Tyler Spears, versuchen Sie, die doppelten Anführungszeichen um die Feldnamen zu entfernen.
Artwork21
Wenn ich das mache, heißt es, dass die Parameter nicht definiert sind.
Tyler Spears
@ Tyler Spears, können Sie Ihren Code in Ihrer Frage posten? Sie haben ein einfaches Anführungszeichen außerhalb der Funktionsklammern.
Artwork21
Absolut, ich habe meine Frage aktualisiert, um meinen Code anzuzeigen.
Tyler Spears