在脚本中设置输出符号系统
使用脚本工具参数的符号系统属性可将单个图层文件 (.lyr) 与某个输出参数关联起来。运行脚本工具时,将使用在图层文件中找到的符号系统将输出添加到显示画面中。还可以在脚本的符号系统代码中设置符号系统的属性。
在这两种情况下,均可将一个且只能将一个图层文件与输出参数进行关联。如果明确定义了输出,则只能有一个图层文件正常工作。但如果未明确定义输出结果会如何呢?例如,您知道输出是一个要素类,但在运行工具之前您不知道它是包含点、折线 (polyline) 还是面要素。图层文件依赖于几何类型,这意味着要符号化多种要素类型时不能只有一个图层文件。在本例中,需要具有三个图层文件,一种几何类型一个,然后基于输出几何类型关联正确的图层文件。以下代码片段演示了这个示例。
# 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"
上述脚本中的逻辑相对比较简单:相应地测试了几何(形状)类型并设置了图层文件。即使具有更复杂的逻辑,模式也保持不变:
- 创建一个将对各个可能的输出进行符号化的图层文件。
- 基于脚本中的逻辑,确定应使用的图层文件并使用参数的符号系统属性对其进行设置。
在脚本与 ToolValidator 类中设置符号系统
如果您熟悉 ToolValidator 类中的编程工具验证逻辑,则会发现上述代码片段可能会被重新编写以供在 updateParameters 方法中使用。事实上,如果只需引用一个图层文件,则应在脚本工具的属性中或在 initializeParameters 方法中执行此操作。但是如果需要为多个图层文件中的任意一个设置符号系统,则应在脚本工具中执行此操作。将此类逻辑置于 ToolValidator 类中会使您的代码由于具有与工具验证无关的逻辑而变得臃肿,且在某些情况下,在执行工具之前您可能不知道要使用哪个图层文件。
脚本示例
下面的脚本将基于要素距波特兰市的公园的距离来创建要素。共有三个参数:输入要素、距离和输出要素。输出要素将被符号化以便在地图上可轻松地将其与其他要素(非默认符号系统内的对象,很难区分)区分开。由于输入要素可以是点、折线 (polyline) 或面,因此需要三个不同的图层文件。
此脚本还演示了多个可移植性的编码技巧。可移植性技巧用法如下:
- 使用 sys.argv[0] 检索脚本文件的完整路径
- 使用 Python os 模块创建数据的路径
- 使用 CreateScratchName 函数创建临时要素类
# 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))