九、自定义工具箱【ArcGIS Python系列】

2023-11-24 16:25:20 浏览数 (2)

本篇文章首发在我的博客,可以点击阅读原文查看。 本文将介绍如何把Python脚本编写出脚本工具的过程,脚本工具可以集成到工作流中,使用软件的工具对话框作为独立工具运行,也可以在模型中使用。开发脚本工具相对容易,也方便其他用户的使用。

在创建Python工具箱之前,必须先创建脚本,当你熟悉编写Python脚本之后,制作工具箱就相当于交付产品到用户手上,用户可以根据工具提示访问该工具,并且可以在模型构建器使用,也可以作为脚本调用。

1.创建脚本工具的步骤

  1. 创建执行预期任务的 Python 脚本,并将其保存为 .py 文件。
  2. 创建可存储脚本工具的自定义工具箱(.tbx 文件)。
  3. 将脚本工具添加到自定义工具箱
  4. 配置工具参数、工具说明
  5. 修改脚本,使其能够接收工具参数
  6. 测试您的脚本工具是否按预期工作。根据需要修改脚本和/或工具的参数,以使脚本工具正常工作。

2.创建工具箱的方式

方式一:独立工具箱

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

方式二:在数据库中创建

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

3.脚本面板介绍

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

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

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

image-20230901201123917

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

image-20230901203637986

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

image-20230901203740817

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

image-20230901203805822

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

参数面板

重要的参数如下:

属性

描述

说明

标注

显示在工具上的参数名称。

可以用中文,可以有空格。

名称

从另一 Python 脚本调用脚本工具作为函数时所使用的参数名称。

必须用英文名而且不能有空格。

数据类型

参数所接受的数据类型。

该类型确定工具所使用的控件。例如,如果您选择要素图层,则可以从活动地图中选择图层或浏览至要素类。

类型

参数可以是必选参数或可选参数。

如果是必选参数,则该参数必须具有值,否则工具将无法运行。如果是可选参数,则即使没有为该参数指定值,工具也可运行。

方向

参数可以是输入参数或输出参数。 输入参数表示待处理的现有数据或要在处理中使用的值。输出参数表示工具创建的数据或计算得出的值。

所有脚本工具都应具有输出参数,否则不适用于模型构建器。可以返回布尔值

过滤

过滤器可用于限制可作为工具输入的特定类型的数据集、文件、字段、特定值或某范围内的值。

可以通过自定义脚本工具的 ToolValidator 类,使用 Python 以编程方式设置过滤器。

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

执行面板

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

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

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

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

  • arcpy.GetParameterAsText将传入的参数作为字符串传入。
代码语言:javascript复制
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,将传入的参数以对象传入。
代码语言:javascript复制
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高程数据。

0 人点赞