Festlegen der Ausgabesymbologie in Skripten
Mit der Symbologieeigenschaft eines Skriptwerkzeugparameters können Sie eine einzelne Layer-Datei (.lyr) mit einem Ausgabeparameter verknüpfen. Wenn das Skriptwerkzeug ausgeführt wird, wird die Ausgabe anhand der Symbologie in der Layer-Datei zur Anzeige hinzugefügt. Sie können die Symbologieeigenschaft auch im Symbologie-Code des Skripts festlegen.
Auch in diesem Fall können Sie nur eine einzige Layer-Datei mit dem Ausgabeparameter verknüpfen. Eine einzige Layer-Datei funktioniert gut, sofern die Ausgabe wohl definiert ist. Was geschieht jedoch, wenn dies nicht der Fall ist? Beispiel: Sie wissen, dass es sich bei der Ausgabe um eine Feature-Class handelt. Ob die Feature-Class jedoch Punkt-, Polylinien- oder Polygon-Features enthält, wissen Sie erst, wenn das Werkzeug ausgeführt wird. Layer-Dateien sind vom Geometrietyp abhängig, das heißt, eine Layer-Datei kann nicht mehrere Feature-Typen symbolisieren. In diesem Fall müssen Sie mit drei Layer-Dateien arbeiten, d. h. mit einer für jeden Geometrietyp, und dann die richtige Layer-Datei anhand des Ausgabegeometrietyps zuweisen. Im folgenden Codeausschnitt wird dies demonstriert.
# Set the symbology of the output.
# output = the output value
# params[2] = the output parameter
#
params = arcpy.GetParameterInfo()
desc = arcpy.Describe(output)
if desc.shapeType == "Polygon":
params[2].symbology = "c:/Tools/Extractor/ToolData/polygon.lyr"
elif desc.shapeType == "Polyline":
params[2].symbology = "c:/Tools/Extractor/ToolData/polyline.lyr"
else:
params[2].symbology = "c:/Tools/Extractor/ToolData/point.lyr"
Die Logik im obigen Skript ist relativ einfach: Der Geometrietyp (Shape) wird geprüft und die Layer-Datei entsprechend festgelegt. Auch bei einer komplexeren Logik bleibt das Muster gleich:
- Sie erstellen eine Layer-Datei, mit der jede der möglichen Ausgaben symbolisiert wird.
- Anhand der Logik im Skript ermitteln Sie, welche Layer-Datei verwendet werden soll, und legen dann die Datei mit der Symbologieeigenschaft des Parameters fest.
Festlegen der Symbologie in einem Skript im Vergleich zur ToolValidator-Klasse
Falls Sie mit der Programmierung von Werkzeugvalidierungslogik in einer ToolValidator-Klasse vertraut sind, wissen Sie, dass der oben aufgeführte Codeausschnitt auch für die Verwendung in der updateParameters-Methode umgeschrieben werden kann. Wenn Sie nur auf eine Layer-Datei Bezug nehmen müssen, sollten Sie dies genau genommen in den Eigenschaften des Skriptwerkzeugs oder in der initializeParameters-Methode tun. Falls Sie jedoch Symbologie für eine von mehreren Layer-Dateien festlegen müssen, tun Sie dies im Skriptwerkzeug. Wenn Sie eine solche Logik in die ToolValidator-Klasse aufnehmen, wird Ihr Code mit Logik aufgebläht, die nichts mit der Werkzeugvalidierung zu tun hat. Außerdem können Sie manchmal erst bei Ausführung des Werkzeugs wissen, welche Layer-Datei verwendet werden muss.
Beispielskript
Das folgende Skript erstellt Features basierend auf ihrer Entfernung zu Parkanlagen in Portland (USA). Es gibt drei Parameter: die Eingabe-Features, die Entfernung und die Ausgabe-Features. Die Ausgabe-Features werden symbolisiert, sodass sie sich leicht von anderen Features auf der Karte unterscheiden lassen. (Es wird also eine weitere Symbologie neben der Standardsymbologie verwendet, die sich oft nur schwierig unterscheiden lässt.) Da es sich bei den Eingabe-Features um Punkt, Polylinie oder Polygon handeln kann, sind drei verschiedene Layer-Dateien erforderlich.
Dieses Skript veranschaulicht auch mehrere Kodierungstechniken für Portabilität. Folgende Vorgehensweisen werden verwendet, um Portabilität zu erzielen:
- Verwendung von sys.argv[0] zum Abrufen der vollständigen Pfadangabe zur Skriptdatei
- Verwendung des Python-Moduls os zum Erstellen von Pfadangaben zu Daten
- Verwendung der CreateScratchName-Funktion zum Erstellen einer Scratch-Feature-Class
# ExtractData.py
# Description: Script that will extract features from an input layer within a specified
# distance from a park.
# Parameters:
# 0 - input features
# 1 - distance from parks (linear units)
# 2 - output feature class
import arcpy
from arcpy import env
import os
import sys
env.overwriteOutput = True
try:
# This tool makes use of a system folder with a Scripts and ToolData subfolder.
# We can discover the pathname of this folder by examining the
# first argument to the script, which is the pathname to the script
# (example: "E:\examples\symbology\scripts\ExtractData.py".) We
# then use this toolSharePath variable to create pathnames to our
# shapefile data and layer files ("E:\examples\symbology\ToolData\points.lyr").
#
scriptPath = sys.argv[0]
toolSharePath = os.path.dirname(os.path.dirname(scriptPath))
dataPath = os.path.join(toolSharePath, "ToolData")
parkPath = os.path.join(dataPath, "PortlandParks.shp")
pointLyrPath = os.path.join(dataPath, "point.lyr")
polygonLyrPath = os.path.join(dataPath, "polygon.lyr")
polylineLyrPath = os.path.join(dataPath, "polyline.lyr")
# Buffer the parks by the specified distance. The output is a scratch
# feature class in the same workspace as the output feature class
#
arcpy.SetProgressorLabel("Buffering parks ...")
scrname = arcpy.CreateScratchName("xxx", "", "featureclass",
os.path.dirname(arcpy.GetParameterAsText(2)))
arcpy.Buffer_analysis(parkPath, scrname, arcpy.GetParameterAsText(1))
# Clip the defined layer with the buffered parks
#
arcpy.SetProgressorLabel("Clipping " + arcpy.GetParameterAsText(0) + " ..." )
output = arcpy.Clip_analysis(arcpy.GetParameterAsText(0), scrname,
arcpy.GetParameterAsText(2))
# Delete intermediate dataset
#
try:
arcpy.Delete_management(scrname)
except:
pass
# Set the symbology of the output.
#
params = arcpy.GetParameterInfo()
desc = arcpy.Describe(output)
if desc.shapeType == "Polygon":
params[2].symbology = polygonLyrPath
elif desc.shapeType == "Polyline":
params[2].symbology = polylineLyrPath
else:
params[2].symbology = pointLyrPath
except:
arcpy.AddError("An error occurred. " + arcpy.GetMessages(2))