4.3 定义一个工具和工具参数

就像是脚本工具一样,python工具箱中的工具也必须有参数是可用的。在python工具箱,工具参数试用getParameterInfo()方法定义。每个参数都被创建为一个Parameter对象。Parameter类的语法如下所示:

Parameter({name}, {displayName}, {direction}, {datatype},{parameterType}, {enabled}, {category}, {symbology}, {multiValue})

Parameter类中的每个参数对应工具参数中的一个属性。虽然说没有任何一个参数是必需的,但是在逻辑上来讲需要创建的工具参数有意义。除了enabled和multiValue是布尔型,其他类参数均是字符串类型。实际使用过程中,一个典型的工具参数需要这些类中的几个,并且他们的值都很长,所以经常使用如下的语法表示(以下是single-input工具参数的示例):

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

实际使用过程中,不需要特定的参数的顺序。作者提到在这里:The preceding notation relies on implicit line continuation. implicit line continuation隐式续行就是上面的续行方法,一条代码虽然在不同的行,但是是一次性执行的。括号内的代码都被读取为单行代码。效果其实和如下所示一样。

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

使用隐式续行不是必须,但是为了容易读代码,大多数都是这种风格。

Parameter 类创建Parameteer对象,并且将该对象分配给一个变量。变量可以称为任何名字,但是经常使用param0,param1,等。编号从0开始,容易进行索引。另一种常用的替代方式是使用与参数的名称属性相似或相同的变量。

一旦一个参数对象被定义,附加的属性就被定义。例如,前面创建脚本工具时,对于Filter属性,应用于要素图层时,过滤器属性可以设置允许的要素类型,比如点、线和多边形等。在python工具箱中定义工具参数时,使用类似的方法。Filters使用Parameter类的Filter属性设置,这个属性使用ArcPy中的Filter类,允许使用和创建脚本工具时一样的过滤器。过滤器的两个选项是list和type。例如以下代码设置了一个过滤器,选择折线类型。

param0.filter.value = ["Polyline"]

总之,通过对某些参数类提供值来创建Parameter对象,这些参数是使用类的语法的一部分。使用对象的属性创建对象后,可以为其他属性分配一个值。这些属性在对象一开始被创建时不会被赋值。

除了filter属性,其他属性还包括:displayOrder(在对话工具框中显示工具的顺序)、parameterDependencies(指示参数之间的依赖关系)、value(参数的值),除了属性之外,Parameter对象还有其他几个方法,主要是用于messages。

一旦工具参数被定义,getParameterInfo()方法的最后一步是将参数作为列表返回,如下所示:

parameters = [parm0, param1, …]
return parameters

回到Random Sample工具示例

python3解释param python中param_ArcPy

第一个参数如下所示:

def getParameterInfo(self):
    input_features = arcpy.Parameter(
        name="input_features",
        displayName="Input Features",
        datatype="GPFeatureLayer",
        parameterType="Required",
        direction="Input")
    parameters = [input_features]
    return parameters

定义参数的属性不足以使参数显示在工具对话框中,参数必须被返回,因此必须添加最后两行代码。

这仅仅是第一个参数,但是它有助于确认代码目前正在运行。在arcgis pro中,双击random sample 工具,显示工具对话框。

python3解释param python中param_python3解释param_02


同样能够和以前一样打开属性来检查参数属性。

python3解释param python中param_arcgis_03


这个结果看起来与创建脚本工具时的结果看起来是相似的。但是工具箱是所有的属性由python代码完成,不是使用工具属性对话框进行,只能在python代码中对工具进行更改。

随机采样工具的第二个参数是输出要素层或要素类,代码如下所示:

output_features = arcpy.Parameter(
    name="output_features",
    displayName="Output Features",
    datatype="GPFeatureLayer",
    parameterType="Required",
    direction="Output")

第三个参数是选择特征数:

no_of_features = arcpy.Parameter(
    name="number_of_features",
    displayName="Number of Features",
    datatype="GPLong",
    parameterType="Required",
    direction="Input")

要识别工具的参数,必须返回他们的值,所以要对最后两行代码进行更新。

python3解释param python中param_ArcGIS Pro_04

python3解释param python中param_ArcPy_05


接下来还需要添加一个过滤器,设置输入的要素数必须是大于1的,使用Paramater对象的filter属性,首先设置过滤器的类型为Range,之后再是值的范围。

no_of_features.filter.type = "Range"
no_of_features.filter.list = [1, 1000000000]

python3解释param python中param_ArcPy_06


打开属性,可以看到过滤器类型已经更改。但是这里没有办法查看设置的具体的range。

python3解释param python中param_python_07


在上面的过程中,一个重要的问题是注意代码的缩进。完整的代码如下所示:

python3解释param python中param_ArcGIS Pro_08


到现在为止还有一个问题没有解决,就是datatype属性如何设置为GPFeatureLayer和GPLong。尽管数据类型的含义很直观,但是他们的名称和创建脚本工具时数据类型属性的选项列表中使用的名称不同,可能会产生一些混乱。创建脚本工具时,可以使用下列列表选想要的数据类型,但是在python工具箱中必须为数据类型设置正确的value。有150多种数据类型,作者为我们提供了一些常用的类型的样本,第一列是创建脚本工具时的值,第二列是在python工具箱中的数据类型属性值。

python3解释param python中param_python_09


python3解释param python中param_arcgis_10


python3解释param python中param_ArcPy_11


python3解释param python中param_ArcPy_12


python工具箱中的大多数数据类型类似于脚本工具中的数据类型下拉列表中的术语,但是没有空格键和前缀DE(data element)和 GP(geoprocessing)。完整的列表在本书的帮助页面中。