九、自定义工具箱【ArcGIS Python系列】
在创建 Python 工具箱之前,必须先创建脚本,熟悉 Python 脚本编写后,制作工具箱便等同于将成品交付给用户。用户可以根据工具提示访问该工具,并且可以在模型构建器使用,也可以作为脚本调用。
1.创建脚本工具的步骤
-
创建执行预期任务的 Python 脚本,并将其保存为
.py
文件。 -
创建可存储脚本工具的自定义工具箱(
.tbx
文件)。 -
将脚本工具添加到自定义工具箱
-
配置工具的参数设置和详细说明
-
修改脚本,使其能够接收工具参数
-
进行脚本工具的功能测试,包括参数验证、执行结果准确性检查等。
2.创建工具箱的方式
方式一:独立工具箱
**在 ArcGIS Pro 目录窗格的工程选项卡上创建新的自定义工具箱。**导航到“工具箱”,右键单击它,然后单击“新建工具箱”。选择要保存工具箱的文件夹,并为工具箱命名。
方式二:在数据库中创建
右键单击文件夹或地理数据库,然后单击新建 > 工具箱。
3.脚本面板介绍
这里用裁剪图层
工具作演示,此工具可以从指定的多边形中提取输入要素。
在地图处理工具中找到裁剪图层工具,可以看到此工具的图标是一个脚本符号,说明此工具使用 python 编写的,本质上和我们自定义工具箱的脚本文件是一样的。
-
常规面板:用于填写工具名称、标注、描述等。
-
参数面板:用于填写工具输入和输出参数。
-
执行面板:脚本文件
python文件
。 -
验证面板用来验证许可和输入参数的有效性。
这里只讲两个重要的面板:
参数面板
重要的参数如下:
属性 | 描述 | 说明 |
---|---|---|
标注 | 显示在工具上的参数名称。 | 可以用中文,可以有空格。 |
名称 | 从另一 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) 使用地理处理消息代码添加任意类型的消息。
(可选)设置进度条
默认进度条
步骤进度条
可使用四个功能来控制进度条。
功能 | 说明 |
---|---|
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 Pro 和
Arcpy
过程中的总结,记下来方便回看,最新版本会优先发布在我的博客和GITHUB。
【ArcGIS Python 系列】教程部分:
- 一、Arcpy 介绍和安装【ArcGIS Python 系列】
- 二、ArcGIS Pro 和 ArcMap 的区别【ArcGIS Python 系列】
- 三、Arcpy 基础【ArcGIS Python 系列】
- 四、探索空间数据【ArcGIS Python 系列】
- 五、处理地理数据异常【ArcGIS Python 系列】
- 六、处理几何数据【ArcGIS Python 系列】
- 七、处理栅格数据【ArcGIS Python 系列】
- 八、制图模块【ArcGIS Python 系列】
- 九、自定义工具箱【ArcGIS Python 系列】
- 十、ArcGIS_Pro 常见问题【ArcGIS Python 系列】
- 利用 ArcGIS Python 批量处理地理数据的坐标系
- 使用 ArcGIS Python 检测洪水影像的区域
- 利用 ArcGIS_Python 制作考虑路况的交通等时圈
- 利用 ArcGIS Pro 制作弧线 OD 图【ArcGIS Python 系列】
- 使用 ArcGIS Pro 对卫星图进行建筑轮廓识别和车辆检测
- ArcGIS_Pro 官方课程整理
- 持续更新…
【ArcGIS Python 系列】jupyter notebook:
- 4.2.3-arcpy 基础(代码练习).ipynb
- 4.2.4-探索空间数据(代码练习).ipynb
- 4.2.5-示例 1:使用 Arcpy 进行 GIS 人口空间分布数据探索.ipynb
- 4.2.7-处理几何数据代码练习和示例 2.ipynb
- 4.2.8-栅格数据(代码练习).ipynb
- 4.2.9-制图模块.ipynb
- 4.2.12-实操 1-利用 Python 批量处理地理数据的坐标系.ipynb
- 4.2.13-实操 2-使用 Python 对图像中的洪水进行分类.ipynb
- 4.2.14-实操 3-制作考虑路况的交通等时圈.ipynb
如果你觉得本系列文章有用,欢迎关注博客,点赞 👍 和收藏,也欢迎在评论区讨论,也欢迎访问我的爱发电支持我,或者对此文章进行赞赏。