4.4 使用源代码
创建好工具对话框之后,工具还不能运行,还要添加执行任务的代码,这些代码被称为源代码 source code 或者是工具的主体——定义工具和工具参数,并且去自定义工具行为。回顾python脚本工具,脚本工具必须使用GetParameterAsText和 GetParamater函数去修改脚本,以便于接收用户在工具对话框中输入的参数。
python工具箱中的工具的源代码可以在execute方法中找到。这个方法参数可以处理参数和消息。
def execute(self, parameters, messages):
parameters
指的是getParameterInfo
方法定义的参数列表。使用Parameter对象的valueAsText或value属性来从此列表中获取每个参数的值。下面的代码说明了一个带有两个参数的通用示例。
def execute(self, parameters, messages):
in_fc = parameters[0].valueAsText
out_fc = parameters[1].valueAsText
变量的名称不必须与getParameterInfo方法中分配给参数的名称一样。在第三章中random sample脚本,执行感兴趣的任务的原始独立脚本如图所示:
后来修改成了如下所示。
脚本工具完整的代码就代表 了源代码,并且使用execute方法复制。一开始代码是必须修改变量的硬编码值(如下代码),修改输入输出和随机采样的数目。
inputfc = "C:/Random/Data.gdb/points"
outputfc = "C:/Random/Data.gdb/random"
outcount = 5
然后修改后:
inputfc = parameters[0].valueAsText
outputfc = parameters[1].valueAsText
outcount = parameters[2].value
修改后的输入输出参数值,使用valueAsText
作为字符串接收;第三个参数使用value
作为整数接收。
原始脚本中的一些元素可以放在python工具箱文件的顶部,包括导入模块和设置环境属性,现在的.pyt文件的顶部如下所示:
import arcpy
import random
原本的脚本的剩余部分,包括已经修改过的部分,成为了execute方法中的源代码。在去掉空行和注释后,这部分代码如下:
def execute(self, parameters, messages):
inputfc = parameters[0].valueAsText
outputfc = parameters[1].valueAsText
outcount = parameters[2].value
inlist = []
with arcpy.da.SearchCursor(inputfc, "OID@") as cursor:
for row in cursor:
id = row[0]
inlist.append(id)
randomlist = random.sample(inlist, outcount)
desc = arcpy.da.Describe(inputfc)
fldname = desc["OIDFieldName"]
sqlfield = arcpy.AddFieldDelimiters(inputfc, fldname)
sqlexp = f"{sqlfield} IN {tuple(randomlist)}"
arcpy.Select_analysis(inputfc, outputfc, sqlexp)
方法结束时不需要返回,因为结果已经包含在了输出参数中。即:工具将结果保存到新要素类并将其作为active map的一个要素图层返回。一些工具可能需要指定返回的值,如果这些工具没有保存任何内容到磁盘或没有返回任何对象到map中。
至此,工具箱中的random sample工具就可以使用了。
这里使用要明白一点,正在运行的不是random sample的脚本代码,是.pyt工具箱代码中的execute()
方法中的代码。
在Tool类包含几个没有使用的方法
在这三个方法中,updataParameters()方法最为重要,他提供了对工具参数的行为和参数如何交互的额外控制。关于详细的介绍,要在arcgis pro帮助文档(“Customizing Tool Behavior in a Python Toolbox)中。
4.5 脚本工具与工具箱的对比
两种方法都能创建自定义工具,但是还是存在一些不同。首先,两种方法都产生了集成到地理地理框架中的工具,这些工具都可以像是标准工具一样在脚本和模型中使用。
第二,在组织方面,脚本工具是自定义工具箱.tbx的一部分,每个脚本工具都有一个单独的脚本文件.py,工具对话框的设计是使用Pro的可视化界面就可以万从哼,并且信息存储到代码中。python工具箱下面的多个工具公用一个.pyt文件,完全只能使用代码编程完成。
第三,脚本文件和python工具箱都可以使用python编辑器进行编辑,但默认情况下,.pyt文件不会被识别为python文件,有时候edit .pyt文件可能不会默认idle打开,。
第四,python脚本和.pyt文件都可以使用密码进行保护。
第五,脚本工具和 Python 工具箱都以类似的方式记录。在第 5 章讨论了这个主题。
Points to remember
Python 工具箱提供了创建 Python 脚本工具的替代方法。从用户的角度来看,Python 工具箱中的工具就像常规地理处理工具一样工作。 从开发人员的角度来看,最大的不同是 Python 工具箱完全是用 Python 编写的。 这个特性使 Python 工具箱成为那些在开发工具方面有更多经验的人的首选方法。
Python 工具箱是具有 .pyt 扩展名的 Python Ale,ArcGIS Pro 会自动识别它。一个 Python 工具箱可以包含一个或多个工具。 ArcGIS Pro 中 Python 工具箱的后缀名称是 .pyt 。
新 Python 工具箱提供的基本模板是开始编写代码的有用方式。在 Python 工具箱中,所有工具的代码都驻留在一个 .pyt 中。
包括 PyCharm 在内的一些 Python IDE 可以配置为将 .pyt Ale 识别为 Python 代码,这有助于编写正确的语法。但是,您无法从 IDE 运行 .pyt ,并且只能使用 ArcGIS Pro 中 Python 工具箱中的工具来测试代码。
Python 工具箱的代码包括一个 Toolbox
类,它定义了工具箱的特性,包括工具列表。 还包含每个工具的 Tool
类,类的名称对应于特定工具。
每个 Tool 类都包含几个方法,包括 __init__()
用于定义工具的属性,getParameterInfo()
用于设置工具参数,以及 execute() 用于执行工具的实际任务。设置工具参数需要仔细考虑,尤其是每个参数的数据类型。
脚本工具和 Python 工具箱都可用于使用 Python 创建自定义工具。