4.1 介绍
python 工具箱中包含多个工具。在用户角度来讲,Python 工具箱中的工具就像是常规地理工具一样,脚本工具中许多优点同样适用于python工具箱中的工具。从开发角度来讲,python工具箱是用python编写的,这个章节描述了创建工具的步骤以及如何定义参数。
4.2 创建和编辑 Python 工具箱
python工具箱是一个.pyt文件拓展,arcgis pro自动将.pyt文件识别为python 工具箱。python工具箱直接在目录中右击新建python Toolbox即可。同时新建的python工具箱中会新建一个默认为tool的工具,这个工具没有任何参数,是一个空的工具。
创建新的python工具箱时,arcgis pro直接从头创建一个基本模板。单个脚本工具在编辑时,修改的是每个脚本工具的脚本文件。python 工具箱的所有的工具的代码都在一个单独的.pyt文件中。.pyt没有设置默认的编辑器,一般使用默认的.py文件的打开编辑器,如果要修改arcgis pro中的脚本编辑器,和前面一样,也是要在地理处理选项卡下修改脚本编辑器的路径:C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\Scripts\idle.exe.
在这里要认识到,代码其实存储在.pyt文件,不是常规的.py文件中。但是IDLE将.pyt文件默认是识别为python代码,但是spyder和pycharm并不是,使用其他的编辑器会无法对.pyt脚本高亮显示等。所以需要进行一些设置
---------------------------------------------------------------------------------------------------------------------------------------
在pycharm中将.pyt文件与python文件关联
在pycharm的Register New File Types Association对话框中,file pattern为*.pyt,选择的类型为python。之后.pyt文件就会被默认识别为python代码。
并且在pycharm中还可以通过单击file-settings-editor-file typrs查看和修改关联的文件类型。
但是不论是使用哪种IDE,都只能通过arcgis pro中工具箱中的工具测试代码,无法直接使用python编辑器。
----------------------------------------------------------------------------------------------------------------------------------------------
关于python工具箱模板代码,包含了一个名为Toolbox的类,这个类定义了工具箱的特性,部分代码如下所示:
class Toolbox(object):
def __init__(self):
"""Define the toolbox (the name of the toolbox is the name of the .pyt file)."""
self.label = "Toolbox"
self.alias = ""
# List of tool classes associated with this toolbox
self.tools = [Tool]
要注意的是,这个python类不能修改名称,否则就会无法被识别。python工具箱的名称就是.pyt的名称。
Toolbox类包含了一个名为 __init__的方法,这个方法取消python 工具箱的属性,这个属性包括标签和别名。一个别名只能由字母和数字组成,不能有空格和其他字符。原书作者仍选用了第三章的random sample工具进行了说明。在通常情况下,并不会为了同一工具即开发脚本工具又开发工具箱,这里仍选用random sample是为了更好的进行说明。
class Toolbox(object):
def __init__(self):
self.label = "Random Sampling Tools"
self.alias = "randomsampling"
修改.pyt文件后,可以在arcgis pro中打开工具箱属性,查看是否发生了变化。
并在在arcgis pro中是无法修改这些属性的,只能在.Pyt文件中进行修改。并且修改后往往需要刷新一下catalog才能查看结果。如果输入的代码违背了属性的要求,往往也会成功,但是在工具箱的属性中会有提示。
工具箱的下一个属性很重要:
self.tools属性由一个列表组成,列表包含在当前工具箱中的所有的工具,当前的模板只是包含一个工具,因此被称为Tool,每个工具在.pyt文件中都被组成了一个类,第一部分如下所示:
类名必须和Toolbox类的self.tools属性中使用的工具的名称对应。这些类的命名遵循Python类常规的命名要求,没有空格。这个工具类包含了一个命名为__init__()的方法,这个方法定义了工具的属性。这些属性包含self.label和self.description。工具的名称由类本身的名称确定,这个标签是在arcgis pro中显示为工具的显示名称,而工具的名称是允许从另一个脚本或工具调用该工具的名称。
__init__方法有几个其他的属性,self.canRunInBackground属性是一个布尔属性,用于指定arcgis desktop 10.x中工具的后台处理,在arcgis pro中无效。self.category属性将工具组织到python工具箱内的工具集成称为可能,self.stylesheet属性允许更改样式表,在设置工具属性时,往往只对那些需要修改赋值的进行修改,其他的可以选用默认。
对于random sample工具,代码如下:
class Toolbox(object):
def __init__(self):
self.label = "Random Sampling Tools"
self.alias = "randomsampling"
self.tools = [RandomSample]
class RandomSample(object):
def __init__(self):
self.label = "Random Sample"
当然,如果代码里面有错误(多空格或多括号等),就有可能会在工具箱中不显示如下工具:
这个工具的类不仅仅不含__init__()方法,还有其他方法,需要对他们有一个简单了解即可,如果有用的到的,在原书后面有了介绍。
getParameterInfo()
——可选。定义工具参数,类似于脚本工具的参数面板。
isLicensed()
——可选。允许您设置工具是否被许可执行。
updateParameters()
——可选。用于工具参数的内部验证。
updateMessages()
——可选。用于通过验证工具参数创建的消息。
execute()
必需。是执行实际任务的工具的源代码,如脚本工具中的脚本文件。
在 Python 工具箱中创建一个函数式工具需要以下三种方法: (1) __init__()
,去定义工具的属性; (2) getParameterInfo()
,对工具参数进行定义; (3) execute()
,执行工具的实际任务。从技术上讲,工具可以不使用getParameterInfo()方法运行(即可选),但不使用该方法意味着工具对话框没有参数,意义不大。 下一节将详细介绍如何设置 getParameterInfo() 和 execute() 方法 其他功能提供附加功能,但不是工具工作所必需的。
示例到目前为止仅使用一种工具。一个 Python 工具箱可以包含多个工具。要创建多个工具,需要为 self.tools 属性分配一个工具列表,并为每个工具重复 Tool 类。基本结构如下:
class Toolbox(object):
def __init__(self):
self.label = "My Cool Tools"
self.alias = "mycooltools"
self.tools = [CoolTool1, CoolTool2]
class CoolTool1(object):
def __init__(self):
self.label = "Cool Tool 1"
def getParameterInfo(self)
# Parameter definition
def execute(self, parameters, messages):
# Source code
class CoolTool2(object):
def __init__(self):
self.label = "Cool Tool 2"
def getParameterInfo(self)
# Parameter definition
def execute(self, parameters, messages):
# Source code
这个结构说明了与脚本工具的另一个关键区别。在 Python 工具箱中,所有工具的代码都位于同一个 .pyt文件中,而在具有多个脚本工具的自定义工具箱中,每个脚本工具都与自己的 Python 脚本文件相关联。