本篇文章首发在我的博客,可以点击阅读原文查看。 本文将介绍如何把Python脚本编写出脚本工具的过程,脚本工具可以集成到工作流中,使用软件的工具对话框作为独立工具运行,也可以在模型中使用。开发脚本工具相对容易,也方便其他用户的使用。
在创建Python工具箱之前,必须先创建脚本,当你熟悉编写Python脚本之后,制作工具箱就相当于交付产品到用户手上,用户可以根据工具提示访问该工具,并且可以在模型构建器使用,也可以作为脚本调用。
1.创建脚本工具的步骤
- 创建执行预期任务的 Python 脚本,并将其保存为
.py
文件。 - 创建可存储脚本工具的自定义工具箱(
.tbx
文件)。 - 将脚本工具添加到自定义工具箱
- 配置工具参数、工具说明
- 修改脚本,使其能够接收工具参数
- 测试您的脚本工具是否按预期工作。根据需要修改脚本和/或工具的参数,以使脚本工具正常工作。
2.创建工具箱的方式
方式一:独立工具箱
在 ArcGIS Pro 目录窗格的工程选项卡上创建新的自定义工具箱。导航到“工具箱”,右键单击它,然后单击“新建工具箱”。选择要保存工具箱的文件夹,并为工具箱命名。
方式二:在数据库中创建
右键单击文件夹或地理数据库,然后单击新建 > 工具箱。
3.脚本面板介绍
这里用裁剪图层
工具作演示,此工具可以从指定的多边形中提取输入要素。
在地图处理工具中找到裁剪图层工具,可以看到此工具的图标是一个脚本符号,说明此工具使用python编写的,本质上和我们自定义工具箱的脚本文件是一样的。
- 常规面板:用于填写工具名称、标注、描述等。
image-20230901201123917
- 参数面板:用于填写工具输入和输出参数。
image-20230901203637986
- 执行面板:脚本文件
python文件
。
image-20230901203740817
- 验证面板用来验证许可和输入参数的有效性。
image-20230901203805822
这里只讲两个重要的面板:
参数面板
重要的参数如下:
属性 | 描述 | 说明 |
---|---|---|
标注 | 显示在工具上的参数名称。 | 可以用中文,可以有空格。 |
名称 | 从另一 Python 脚本调用脚本工具作为函数时所使用的参数名称。 | 必须用英文名而且不能有空格。 |
数据类型 | 参数所接受的数据类型。 | 该类型确定工具所使用的控件。例如,如果您选择要素图层,则可以从活动地图中选择图层或浏览至要素类。 |
类型 | 参数可以是必选参数或可选参数。 | 如果是必选参数,则该参数必须具有值,否则工具将无法运行。如果是可选参数,则即使没有为该参数指定值,工具也可运行。 |
方向 | 参数可以是输入参数或输出参数。 输入参数表示待处理的现有数据或要在处理中使用的值。输出参数表示工具创建的数据或计算得出的值。 | 所有脚本工具都应具有输出参数,否则不适用于模型构建器。可以返回布尔值 |
过滤 | 过滤器可用于限制可作为工具输入的特定类型的数据集、文件、字段、特定值或某范围内的值。 | 可以通过自定义脚本工具的 ToolValidator 类,使用 Python 以编程方式设置过滤器。 |
其他的还有类别,依赖关系,默认值,环境,符号系统。
执行面板
将脚本导入工具箱之前,为了满足需求,需要保证脚本的变量是通过参数传入脚本的,如果有内容输出,最好让输出参数也可以调整。需要修改以下内容:
- 确定哪些值作为参数传入,我们需要在脚本中设置参数传入。最常见的参数为输入和输出数据集、字段名称和从选择列表中所选的字符串。
- (可选)脚本工具消息
- (可选)设置进度条
并非所有这些信息都必须一步完成。您可以输入一些基本信息并保存,稍后再返回编辑工具属性。
首先,我们要在脚本中传入参数,主要有两种方式:
- arcpy.GetParameterAsText将传入的参数作为字符串传入。
import arcpy
# Get the spatial reference from the tool dialog.
spatial_ref = arcpy.GetParameterAsText(0)
# Determine the shape type of the feature class.
describe = arcpy.Describe(spatial_ref)
# Display the Spatial Reference properties
arcpy.AddMessage("Name is: {0}".format(describe.name))
arcpy.AddMessage("Type is: {0}".format(describe.type))
arcpy.AddMessage("Factory code is: {0}".format(describe.factoryCode))
- 使用arcpy.GetParameter,将传入的参数以对象传入。
import arcpy
# Get the spatial reference from the tool dialog.
spatial_ref = arcpy.GetParameter(0)
# Display the Spatial Reference properties
arcpy.AddMessage("Name is: {0}".format(spatial_ref.name))
arcpy.AddMessage("Type is: {0}".format(spatial_ref.type))
arcpy.AddMessage("Factory code is: {0}".format(spatial_ref.factoryCode))
(可选)脚本工具消息
修改函数以便在工具界面能显示的清晰易读的输出。比如,将print
函数用AddMessage(message),将Python的报错用AddError(message) 表示。也可以用AddIDMessage(message_type, message_ID, add_argument1=None, add_argument2=None) 使用地理处理消息代码添加任意类型的消息。
(可选)设置进度条
默认进度条
默认进度条
步骤进度条
GUID-2719B74D-3AE1-4D3D-8CA8-EB495492635D-web
可使用四个功能来控制进度条。
功能 | 说明 |
---|---|
SetProgressor | 设置进度条类型(默认或步长);进度条标注;以及步长进度条的最小值、最大值和间隔值。 |
ResetProgressor | 重置进度条。 |
SetProgressorPosition | 按增量移动步长进度条。 |
SetProgressorLabel | 更改进度条的标注。 |
示例:设置进度条对象以在地理处理窗格中显示进度。
代码语言:javascript复制import os
import arcpy
# Allow overwriting of output
arcpy.env.overwriteOutput = True
# Set current workspace
arcpy.env.workspace = "c:/data"
# Get a list of shapefiles in folder
fcs = arcpy.ListFeatureClasses()
# Find the total count of shapefiles in list
fc_count = len(fcs)
# Set the progressor
arcpy.SetProgressor("step", "Copying shapefiles to geodatabase...",
0, fc_count, 1)
# Create a file gdb to contain new feature classes
arcpy.CreateFileGDB_management(arcpy.env.workspace, "fgdb.gdb")
# For each shapefile, copy to a file geodatabase
for shp in fcs:
# Trim the '.shp' extension
fc = os.path.splitext(shp)[0]
# Update the progressor label for current shapefile
arcpy.SetProgressorLabel("Loading {0}...".format(shp))
# Copy the data
arcpy.CopyFeatures_management(shp, os.path.join("fgdb.gdb", fc))
# Update the progressor position
arcpy.SetProgressorPosition()
arcpy.ResetProgressor()
4.在ArcPy导入Python
当创建自定义工具并将其存储在自定义工具箱中时,只需导入自定义工具箱即可在 Python 中访问这些工具。因此,即使自定义工具箱已添加到 ArcGIS Pro 中的工程中,Python 在导入之前也不会识别该工具箱。
代码语言:javascript复制arcpy.ImportToolbox("C:/Data/sampletools.tbx") # 引用磁盘上的实际文件,即工具箱 (.tbx) 文件,而不是工具箱的名称。
# 使用工具箱
arcpy.<toolname>_<toolboxalias>
练习:制作一个从DEM高程数据同时坡度、坡向分析图的工具。
此处不演示。DEM可从Alos免费下载12.5米DEM高程数据。