前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >九、自定义工具箱【ArcGIS Python系列】

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

作者头像
renhai
发布2023-11-24 16:25:20
2540
发布2023-11-24 16:25:20
举报

本篇文章首发在我的博客,可以点击阅读原文查看。 本文将介绍如何把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高程数据。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 renhailab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.创建脚本工具的步骤
  • 2.创建工具箱的方式
    • 方式一:独立工具箱
      • 方式二:在数据库中创建
      • 3.脚本面板介绍
        • 参数面板
          • 执行面板
            • (可选)脚本工具消息
              • (可选)设置进度条
              • 4.在ArcPy导入Python
                • 练习:制作一个从DEM高程数据同时坡度、坡向分析图的工具。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档