修改时间:2023年11月27日

在创建Python工具箱之前,必须先创建脚本,熟悉Python脚本编写后,制作工具箱便等同于将成品交付给用户。用户可以根据工具提示访问该工具,并且可以在模型构建器使用,也可以作为脚本调用。

1.创建脚本工具的步骤

  • 创建执行预期任务的 Python 脚本,并将其保存为 .py 文件。

  • 创建可存储脚本工具的自定义工具箱(.tbx 文件)。

  • 将脚本工具添加到自定义工具箱

  • 配置工具的参数设置和详细说明

  • 修改脚本,使其能够接收工具参数

  • 进行脚本工具的功能测试,包括参数验证、执行结果准确性检查等。

2.创建工具箱的方式

方式一:独立工具箱

image-20230830225845650

**在 ArcGIS Pro 目录窗格的工程选项卡上创建新的自定义工具箱。**导航到“工具箱”,右键单击它,然后单击“新建工具箱”。选择要保存工具箱的文件夹,并为工具箱命名。

方式二:在数据库中创建

右键单击文件夹或地理数据库,然后单击新建 > 工具箱。

3.脚本面板介绍

这里用裁剪图层工具作演示,此工具可以从指定的多边形中提取输入要素。

在地图处理工具中找到裁剪图层工具,可以看到此工具的图标是一个脚本符号,说明此工具使用python编写的,本质上和我们自定义工具箱的脚本文件是一样的。

  • 常规面板:用于填写工具名称、标注、描述等。

    image-20230901201123917

  • 参数面板:用于填写工具输入和输出参数。

    image-20230901203637986

  • 执行面板:脚本文件python文件

    image-20230901203740817

  • 验证面板用来验证许可和输入参数的有效性。

    image-20230901203805822

这里只讲两个重要的面板:

参数面板

重要的参数如下:

属性描述说明
标注显示在工具上的参数名称。可以用中文,可以有空格。
名称从另一 Python 脚本调用脚本工具作为函数时所使用的参数名称。必须用英文名而且不能有空格。
数据类型参数所接受的数据类型。该类型确定工具所使用的控件。 例如,如果您选择要素图层,则可以从活动地图中选择图层或浏览至要素类。
类型参数可以是必选参数或可选参数。如果是必选参数,则该参数必须具有值,否则工具将无法运行。 如果是可选参数,则即使没有为该参数指定值,工具也可运行。
方向参数可以是输入参数或输出参数。 输入参数表示待处理的现有数据或要在处理中使用的值。 输出参数表示工具创建的数据或计算得出的值。所有脚本工具都应具有输出参数,否则不适用于模型构建器。可以返回布尔值
过滤过滤器可用于限制可作为工具输入的特定类型的数据集、文件、字段、特定值或某范围内的值。可以通过自定义脚本工具的 ToolValidator 类,使用 Python 以编程方式设置过滤器。

其他的还有类别依赖关系默认值环境符号系统

执行面板

将脚本导入工具箱之前,为了满足需求,需要保证脚本的变量是通过参数传入脚本的,如果有内容输出,最好让输出参数也可以调整。需要修改以下内容:

  1. 确定哪些值作为参数传入,我们需要在脚本中设置参数传入。最常见的参数为输入和输出数据集、字段名称和从选择列表中所选的字符串。
  2. (可选)脚本工具消息
  3. (可选)设置进度条

并非所有这些信息都必须一步完成。您可以输入一些基本信息并保存,稍后再返回编辑工具属性。

首先,我们要在脚本中传入参数,主要有两种方式:

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))
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更改进度条的标注。

示例:设置进度条对象以在地理处理窗格中显示进度。

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 在导入之前也不会识别该工具箱。

arcpy.ImportToolbox("C:/Data/sampletools.tbx") # 引用磁盘上的实际文件,即工具箱 (.tbx) 文件,而不是工具箱的名称。
# 使用工具箱
arcpy.<toolname>_<toolboxalias>

练习一:制作一个从DEM高程数据同时坡度、坡向分析图的工具。

此处不演示。DEM可从Alos免费下载12.5米DEM高程数据。

练习二:制作使用ArcGIS Python检测洪水影像的区域的工具箱

见:使用ArcGIS Python检测洪水影像的区域


文章索引

【ArcGIS Python系列】系列笔记为学习ArcGIS Pro和Arcpy过程中的总结,记下来方便回看,最新版本会优先发布在我的博客GITHUB

【ArcGIS Python系列】教程部分:

【ArcGIS Python系列】jupyter notebook:


如果你觉得本系列文章有用,欢迎关注博客,点赞和收藏,也欢迎在评论区讨论:

更多账号