定义 Python 工具箱中的参数

几乎所有工具都具有参数,您可在工具对话框或脚本中设置参数值。执行工具时,会将参数值发送到该工具的源代码。工具将读取这些值,然后继续执行操作。

要了解有关参数的详细信息,请参阅了解脚本工具参数

在 Python 工具箱 (.pyt) 中,通过创建 Parameter 对象并设置其属性在工具类 getParameterInfo 方法中定义工具参数。

Parameter 对象具有多个读写属性,但应为每个参数设置的属性如下所示:

属性说明

displayName

工具对话框中显示的参数名称。

name

Python 中的工具语法中显示的参数名称。

datatype

每个 Python 工具箱的工具参数都有关联的数据类型。打开脚本工具对话框后,地理处理使用数据类型检查参数值。

数据类型也可用于浏览数据 - 只有与参数数据类型匹配的数据才会显示在浏览对话框中。

要获取参数数据类型的列表,请参阅在 Python 工具箱中定义参数数据类型

parameterType

提供三种 parameterType 选项:

  • 必选 - 必须提供值才能执行工具。
  • 可选 - 不需要为参数提供值。
  • 派生 - 该参数只适用于输出参数(请参阅下文的方向参数)。派生的输出参数不会显示在工具对话框中。

direction

该属性定义参数是工具的输入参数还是工具的输出参数。

如果将 parameterType 设置为“派生”,则应将参数 direction 设置为“输出”。

以下示例为工具定义了三个参数:一个用于接受要素图层的输入参数、一个用于接受新字段名称的输入参数以及一个基于第一个输入参数的派生输出参数。对于要反映在工具中的参数,将在 getParameterInfo 方法的结尾处返回这些参数。

def getParameterInfo(self):
    #Define parameter definitions
    # First parameter
    param0 = arcpy.Parameter(
        displayName="Input Features",
        name="in_features",
        datatype="GPFeatureLayer",
        parameterType="Required",
        direction="Input")
    # Second parameter
    param1 = arcpy.Parameter(
        displayName="Sinuosity Field",
        name="sinuosity_field",
        datatype="Field",
        parameterType="Optional",
        direction="Input")
    param1.value = "sinuosity"
    # Third parameter
    param2 = arcpy.Parameter(
        displayName="Output Features",
        name="out_features",
        datatype="GPFeatureLayer",
        parameterType="Derived",
        direction="Output")
    param2.parameterDependencies = [param0.name]
    param2.schema.clone = True
    params = [param0, param1, param2]
    return params

使用派生的输出

以上示例中显示的最后一个参数是派生输出参数。派生的输出参数可用于下列五种工具:

  • 输出与输入相同的工具,例如计算字段或以上所示示例。计算字段可更改输入表中特定字段的值,但不会创建新表或修改输入的方案。可在编辑工具箱中找到的输出与输入相同的其他工具。
  • 用于修改输入方案的工具,例如添加字段添加字段可以向输入表中添加字段,但不会创建新的输出表。
  • 可使用其他参数中的信息创建输出的工具,例如创建要素类工具。使用创建要素类工具时,仅需指定工作空间及新要素类的名称即可创建要素类。
  • 可输出相对于数据集的标量值的工具。例如,获取计数,该工具可输出一个长整型值(记录数)。当工具输出标量值时,输出为“派生”类型。
  • 将在已知位置创建数据的工具。例如,在您的脚本中,可能将更新已知工作空间中的现有表。用户无需在对话框或脚本中提供此表。

创建多值参数

如果希望参数能够处理一组值而非单个值,可将 multiValue 属性设置为 True

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName="Input Features",
        name="in_features",
        datatype="GPFeatureLayer",
        parameterType="Required",
        direction="Input",
        multiValue=True)

多值控件的示例如下所示:

多值控件

创建值表参数

某些称作“值表”的参数,可用于指定多个条目。例如,可使追加联合及许多其他工具中的输入要素参数包括多个数据集,也可使融合汇总统计数据工具中的统计字段包括多个字段。

通过将 datatype 设置为 GPValueTable 来定义值表参数,并且设置一个 columns 属性以定义参数的数据类型和列标题。在以下示例中,通过接受统计类型 (GPString) 的字段名称和字符串值的两列来定义值表参数。通过使用 ValueList 过滤器和一组值,会在相应的 GPValueTable 列下生成下拉列表。要为值表参数设置默认值,可使用 values 属性并在值列表中提供参数值。

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName ='Input Features',
        name ='in_features',
        datatype ="GPFeatureLayer",
        parameterType ='Required',
        direction ='Input')
    param1 = arcpy.Parameter(
        displayName='Statistics Field(s)',
        name='stat_fields',
        datatype='GPValueTable',
        parameterType='Required',
        direction='Input')
    param1.parameterDependencies = [param0.name]
    param1.columns = [['Field', 'Field'], ['GPString', 'Statistic Type']]
    param1.filters[1].type = 'ValueList'
    param1.values = [['NAME', 'SUM']]
    param1.filters[1].list = ['SUM', 'MIN', 'MAX', 'STDEV', 'MEAN']

为参数设置默认值

可通过两种方法为参数设置默认值:直接通过 value 属性应用一个值或通过 defaultEnvironmentName 应用环境设置的值。

打开脚本的工具对话框时,默认值将是参数的内容。如果在脚本中为参数输入 #,则也是将要使用的值。如果没有指定 value,则在打开脚本对话框时,参数值将为空。

设置来自环境的默认值

通过将 defaultEnvironmentName 属性设置为环境设置的名称,可将参数的默认值设置为环境设置的值。选择环境设置后,将忽略 value 属性。

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName="Input Workspace",
        name="in_workspace",
        datatype="DEWorkspace",
        parameterType="Required",
        direction="Input")
    # In the tool's dialog box, the first parameter will show 
    #  the workspace environment's value (if set)
    param0.defaultEnvironmentName = "workspace"

定义参数方案

类型为要素类、表、栅格或工作空间的每个输出参数都具有 schema 对象。只有输出要素类、表、栅格和工作空间具有 schema,其他类型则没有。schema 对象通过地理处理进行创建。可以通过参数对象访问此方案,或者设置规则以便描述工具的输出。在设置方案规则之后,地理处理内部验证代码会检查设置的规则并更新输出的描述。

当输入参数 datatype 为“要素集”或“记录集”时,用户必须指定要输入的要素的 fieldsRulegeometryType

关于要素集和记录集

要素集和记录集的数据类型允许交互输入数据。要素集允许脚本的用户通过单击地图在 ArcMap 中交互创建要素。记录集允许用户在简单的表格中交互创建行。

通过将参数的 value 属性设置为要素类、表或图层文件 (.lyrx),可为要素集和记录集控件设置符号系统和方案(属性和几何类型)。

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName="Input Feature Set",
        name="in_feature_set",
        datatype="GPFeatureRecordSetLayer",
        parameterType="Required",
        direction="Input")
    # Use __file__ attribute to find the .lyr file (assuming the
    #  .pyt and .lyr files exist in the same folder)
    param0.value = os.path.join(os.path.dirname(__file__),
                                'Fire_Station.lyrx')

将过滤器应用于参数

将过滤器应用于参数,可以缩小用户对于参数的可用选择。例如,可设置仅限选择文本字段的字段过滤器。

地理处理将自动为字符串、长整型、双精度型、要素类、文件、字段和工作空间类型的参数创建过滤器。即使不为参数设置过滤器,参数仍会关联一个过滤器 - 只不过它是空的。空过滤器等同于没有过滤器。通过向空过滤器添加值可激活过滤器,而用户的选择会受到过滤器内容的限制:

  • 用户浏览数据时,过滤器仅提供有效的选择。如果设置的过滤器是针对点要素类的,那么用户浏览数据时仅会显示点要素类。如果设置的过滤器是针对文本字段的,则字段的下拉列表仅显示文本字段。
  • 如果由用户输入参数值(而不是从列表或文件浏览器中选择值),则会根据过滤器对值进行检查。如果用户输入无效值(例如不是文本字段,而是数值字段),则会自动给出警告或提示错误。

如果希望仅为参数输入特定的值或数据集类型,可以指定过滤器。将 filter type 设置为相应值。过滤器类型有七种,您可以根据参数的数据类型来选择过滤器的类型。

过滤器类型

值列表

字符串或数值的列表。采用字符串型、长整型、双精度型和布尔型参数数据类型。

范围

最小值和最大值。采用长整型和双精度型数据类型。

要素类

允许的要素类类型列表:点、多点、折线、面、多面体、注记和维度。可为过滤器提供多个值。

文件

文件后缀的列表,例如 ['zip', 'xml']

字段

允许的字段类型列表:短整型、长整型、单精度、双精度、文本、日期、OID、几何、Blob、栅格、GUID、GlobalID 和 XML。可为过滤器提供多个值。

工作空间

允许的工作空间类型列表:文件系统、本地数据库或远程数据库。可提供多个类型值。

出行模式单位类型

允许的出行模式的阻抗属性列表:时间、距离、其他。

过滤器类型和值

属性说明

type

过滤器的类型(ValueList、范围、要素类、文件、字段和工作空间)。在处理长整型参数和双精度型参数时,可设置过滤器的类型(请参阅下面的注释)。对于其他类型的参数,仅有一种有效的过滤器类型,所以可以忽略这些参数的类型设置。如果不想过滤值,可将列表属性设置为空列表。

list

过滤器的值列表。如果不想过滤值,可将列表属性设置为空列表。

filter 属性

通常,只可以选择一种过滤器类型。仅长整型和双精度有两种选择:值列表和范围。

值列表

值列表过滤器对提供一组关键字非常有利。许多工具都具有一组预定义的关键字,如添加字段中的字段类型参数,或叠加分析工具集中多个工具的连接属性参数。

值列表过滤器可用于长整型和双精度数据类型。对于这些类型,您可以输入允许的数值。

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName="Input value",
        name="in_value",
        datatype="GPLong",
        parameterType="Required",
        direction="Input")
    # Set a value list of 1, 10 and 100
    param0.filter.type = "ValueList"
    param0.filter.list = [1, 10, 100]

如果您希望用户可以选择多个值,请将 multiValue 属性设置为 True

值列表还可用于布尔数据类型。对于布尔数据类型,值列表将包含两个值:true 和 false。值 true 始终是列表中的最初值。在值列表中指定的值用于在 Python 中指定值。相关示例,请参阅添加字段和用于字段可为空参数的 NULLABLENON_NULLABLE 关键字。

范围

“长整型”或“双精度”参数可具有范围过滤器。范围过滤器有两个值:最小值和最大值。列表中的第一个值是最小值。包括范围边界值,这表示最小值和最大值也是有效数据。

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName="Input range",
        name="in_range",
        datatype="GPLong",
        parameterType="Required",
        direction="Input")
    # Set an acceptable range of 1 to 10
    param0.filter.type = "Range"
    param0.filter.list = [1, 10]

要素类

对于此过滤器,可以选择一个或多个过滤器值。将根据过滤器值检查输入要素类。例如,如果只将“点”选择为过滤器值,则用户只能将点要素类作为参数值进行输入。

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName="Input Features",
        name="in_features",
        datatype="GPFeatureLayer",
        parameterType="Required",
        direction="Input")
    param0.filter.list = ["Polygon"]

文件

文件 filter 包含文件可具有的文件后缀的列表,如 txt(简单文本文件)和 csv(逗号分隔值)。您可以提供任何后缀的文本,不必是 ArcGIS 可识别的后缀。后缀可为任意长度,且不包含句点。

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName="Input File",
        name="in_file",
        datatype="DEFile",
        parameterType="Required",
        direction="Input")
    # To define a file filter that includes .csv and .txt extensions,
    #  set the filter list to a list of file extension names
    param0.filter.list = ['txt', 'csv']

字段

字段 filter 定义了允许的字段类型:ShortLongFloatSingleDoubleTextDateOIDGeometryBlobRasterGUIDGlobalIDXML。可为过滤器提供多个值。

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName="Input Features",
        name="in_features",
        datatype="GPFeatureLayer",
        parameterType="Required",
        direction="Input")
    param1 = arcpy.Parameter(
        displayName="Field",
        name="field",
        datatype="Field",
        parameterType="Required",
        direction="Input")
    # Set the filter to accept only fields that are Short or Long type
    param1.filter.list = ['Short', 'Long']
    param1.parameterDependencies = [param0.name]

工作空间

工作空间 filter 用于指定允许的输入工作空间的类型。共有三个值:

工作空间过滤器说明

文件系统

系统文件夹,用于存储 shapefile、coverage、INFO 表和格网

本地数据库

个人地理数据库或文件地理数据库

远程数据库

企业级数据库连接

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName="Input Workspace",
        name="in_workspace",
        datatype="DEWorkspace",
        parameterType="Required",
        direction="Input")
    # Set the filter to accept only local (personal or file) geodatabases
    param0.filter.list = ["Local Database"]

出行模式单位类型

出行模式单位类型 filter 可用于基于出行模式的阻抗属性单位来设置允许的出行模式类型。有效选项为:时间、距离和其他。

def getParameterInfo(self):
    param1 = arcpy.Parameter(
        displayName="Travel Mode",
        name="travel_mode",
        datatype="NetworkTravelMode",
        parameterType="Required",
        direction="Input")
     # Set the parameter to be dependent on the Network Data Source parameter
     param1.parameterDependencies = [param0.name]
     # Set the filter to accept only time-based travel modes
     param1.filter.list = ["Time"]

parameterDependencies

parameterDependencies 属性有两种用途:

  • 对于派生的输出参数,parameterDependencies 设置为将通过工具修改的输入参数。
  • 对于输入参数,parameterDependencies 包含数据类型所使用的其他参数的名称。
# Third parameter
param2 = arcpy.Parameter(
    displayName="Output Features",
    name="out_features",
    datatype="GPFeatureLayer",
    parameterType="Derived",
    direction="Output")
param2.parameterDependencies = [param0.name]
param2.schema.clone = True

只能为特定输入参数设置 parameterDependencies,如下表中所示。

输入数据类型相关参数数据类型说明

字段或 SQL 表达式

含有字段的表

INFO 项目或 INFO 表达式

INFO 表

包含项目的 INFO 表

Coverage 要素类

Coverage

包含要素的 coverage

面积单位或线性单位

地理数据集

用于确定默认单位的地理数据集

坐标系

工作空间

用于确定默认坐标系的工作空间

Network Analyst 等级设置

网络数据集

包含等级信息的网络数据集

地统计值表

地统计图层

包含要用于 Geostatistical Analyst 工具的数据集和字段的表

parameterDependencies 数据类型

symbology

如果工具输出的是要素集、栅格、TIN 或 Network Analyst 图层,则可通过 symbology 属性指定图层文件 (.lyrx) 的位置。运行工具时,将输出添加到显示中,并将使用符号系统图层文件中定义的符号系统进行绘制。

def getParameterInfo(self):
    param0 = arcpy.Parameter(
        displayName="Input Raster",
        name="in_raster",
        datatype="DERasterDataset",
        parameterType="Required",
        direction="Input")
    param1 = arcpy.Parameter(
        displayName="Output Raster",
        name="out_raster",
        datatype="DERasterDataset",
        parameterType="Required",
        direction="Output")
    # Use __file__ attribute to find the .lyr file (assuming the
    #  .pyt and .lyr files exist in the same folder).
    param1.symbology = os.path.join(os.path.dirname(__file__), 
                                    'raster_symbology.lyrx')
注:

每次运行工具时都会读取图层文件。如果无法找到图层文件(已被移动或删除),则将使用默认的符号系统。

category

可以将参数分为不同的类别,从而最小化工具对话框的大小或将不常使用的相关参数分为一组。将 category 设置为相同字符串值的参数将分为一组。多个 ArcGIS Network Analyst extension 工具使用了各种类别,如下所示。

参数类别

类别始终显示在非类别化参数之后。不要将必选参数归类,因为这些参数在工具对话框中处于隐藏状态。

相关主题