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:

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.

Das Skript zeigt zudem verschiedene Programmiertechniken, die der Portabilität dienen und alle auf der ToolShare-Ordnerstruktur basieren.

Folgende Vorgehensweisen werden verwendet, um Portabilität zu erzielen:

Weitere Informationen zu Portabilität von Python-Skripten

# 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 the recommended toolshare folder structure,
    #  a system folder with a Scripts and ToolData subfolder. We can
    #  discover the pathname of this toolshare 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))
    

7/10/2012