前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ArcGIS Pro创建python脚本工具

ArcGIS Pro创建python脚本工具

作者头像
GIS指北
发布2022-11-14 10:57:27
1.4K0
发布2022-11-14 10:57:27
举报
文章被收录于专栏:GIS指北

脚本工具能整合代码脚本到工作流中并扩展ArcGIS Pro的功能。

ArcGIS Pro提供了Model builder和python脚本两种方式自动化工作流,相比较而言,python脚本既能独立运行,又可以嵌入ArcGIS Pro作为工具运行。

01

创建过程

创建脚本工具步骤:

  • 创建.py文件;
  • 创建自定义工具箱,向工具箱添加脚本;
  • 修改脚本接受参数,配置工具属性和参数;
  • 自定义工具行为,消息与错误处理;
  • 测试脚本是否正常运行。

02

创建python文件

以下面脚本为例进行说明,该脚本随机选择特定数量的要素几何来创建新的要素类。

代码语言:javascript
复制
'''
随机选择特定数量的要素几何来创建新的要素类
'''

import arcpy
import random
 
# 设置输入输出变量,输入可以是shpfile或者要素类,输出数字不能超过输入要素几何数量
inputfc = "E:/Temp/data.gdb/city"
outputfc = "E:/Temp/data.gdb/random"
outcount = 5

# 创建输入要素所有几何的ID列表
inlist = []
with arcpy.da.SearchCursor(inputfc, "OID@") as cursor:
    for row in cursor:
        id = row[0]
        inlist.append(id)

# 创建指定个数的随机ID列表
randomlist = random.sample(inlist, outcount)

desc = arcpy.Describe(inputfc)
fldname = desc.OIDFieldName
# 用随机ID创建新要素
sqlfield = arcpy.AddFieldDelimiters(inputfc, fldname)
sqlexp = "{} IN {}".format(sqlfield, tuple(randomlist))
arcpy.Select_analysis(inputfc, outputfc, sqlexp)

03

创建自定义工具箱

在catalog中新建toolbox,会在Toolboxes文件下生成.tbx后缀工具箱。

再在工具箱上右键创建脚本工具,在脚本工具属性中导入.py文件,并且可以设置工具以下属性。

04

配置脚本工具参数

配置过程包括了修改代码接收参数,工具属性中配置参数。由于以上脚本是硬编码的,工具没有交互界面,需要修改代码配置参数。

Arcpy提供的GetParameterAsText()和GetParameter()函数可以在工具与脚本之间传递参数,需要以0开始传递数值指定参数的顺序。

同样,python系统模块sys.argv[]也能传递参数,不过从1开始,因为sys.argv[0]会返回脚本文件路径和名称。修改代码如下接收参数:

代码语言:javascript
复制
inputfc = arcpy.GetParameterAsText(0) 
outputfc = arcpy.GetParameterAsText(1) 
outcount = arcpy.GetParameter(2)

工具属性界面添加参数,代码中的索引顺序必须与参数设置界面顺序一致,必须在属性界面添加参数才能在工具界面显示。参数可以更细粒度的控制参数属性,比如数据类型、过滤器、参数分类、依赖、默认值、环境、符号化等。

设置完成后,脚本工具的简单创建基本完成,打开工具后,界面能正常显示参数。

以上基本完成脚本工具创建,输入参数并运行即可。以下是对工具参数,运行界面更细粒度的设置。

05

自定义工具行为,消息与错误处理

工具属性界面Validation可以使用ToolValidation类自定义工具行为,比如启用和禁用参数,设置默认值,脚本工具是否具有执行许可等,代码已嵌入到脚本工具中,这是一个ArcGIS自身完成的内部验证过程。

脚本工具可以在工具处理界面和地理处理历史中打印消息,主要使用以下几个函数,提供了代码与工具的交互。

通过AddMessage()可以打印执行步骤,比如:

代码语言:javascript
复制
# 用随机ID创建新要素
arcpy.AddMessage("正在创建新要素类")
sqlfield = arcpy.AddFieldDelimiters(inputfc, fldname)
sqlexp = "{} IN {}".format(sqlfield, tuple(randomlist))
arcpy.Select_analysis(inputfc, outputfc, sqlexp)

通过AddError()可以处理错误。比如:

代码语言:javascript
复制
fcount = arcpy.GetCount_management(inputfc)[0]
if outcount > int(fcount):
    arcpy.AddError("所选数字超过输入要素记录最大数.")

通过AddWarning()可以打印警告消息,比如:

代码语言:javascript
复制
fcount = arcpy.GetCount_management(inputfc)[0]
if outcount == int(fcount):
    arcpy.AddWarning("所选数字等于输入要素记录数.")

通过AddIDMessage()可以打印系统级消息,比如:

代码语言:javascript
复制
import arcpy
infc = arcpy.GetParameterAsText(0)
outfc = arcpy.GetParameterAsText(1)
if arcpy.Exists(outfc):
    arcpy.AddIDMessage("ERROR", 12, outfc)
else:
    arcpy.CopyFeatures_management(infc, outfc)

错误代码12指系统级消息错误000012:<值>已存在。

自定义行为,消息与错误处理配合使用能增强代码逻辑和可执行性。

06

处理进度

使用SetProgressor()来显示处理进度,可选Default和Step两种类型,前者只显示左右移动的进度条,后者会显示处理进度比例。

SetProgressorLabel()可以根据步长完成比例更新进度标签。

SetProgressorPosition()依赖任务的增量移动step类型的进度对象,可以在循环任务中与其他函数配合更新进度标签和自动更新进度比例。示例:

代码语言:javascript
复制
import arcpy
arcpy.env.workspace = arcpy.GetParameterAsText(0)
outworkspace = arcpy.GetParameterAsText(1)
fclist = arcpy.ListFeatureClasses()
fcount = len(fclist)
arcpy.SetProgressor("step", "Copying shapefiles to geodatabase...",
                    0, fcount, 1)
for fc in fclist:
    arcpy.SetProgressorLabel("Copying " + fc + "...")
    fcdesc = arcpy.Describe(fc)
    outfc = os.path.join(outworkspace, fcdesc.baseName)
    arcpy.CopyFeatures_management(fc, outfc)
    arcpy.SetProgressorPosition()

07

总结

根据以上再对代码做调整如下,添加一个错误处理增强代码可执行能力:

代码语言:javascript
复制
'''
随机选择特定数量的要素几何来创建新的要素类
'''

import os
import arcpy
import random
import sys 
# 设置输入输出变量,输入可以是shpfile或者要素类,输出数字不能超过输入要素几何数量
inputfc = arcpy.GetParameterAsText(0) 
outputfc = arcpy.GetParameterAsText(1) 
outcount = arcpy.GetParameter(2)
fcount = arcpy.GetCount_management(inputfc)[0]

if outcount > fcount:
    arcpy.AddError("所选数字超过输入要素记录最大数")

    sys.exit(1)

else:
    # 创建输入要素所有几何的ID列表
    inlist = []
    with arcpy.da.SearchCursor(inputfc, "OID@") as cursor:
        for row in cursor:
            id = row[0]
            inlist.append(id)

    # 创建指定个数的随机ID列表
    randomlist = random.sample(inlist, outcount)

    desc = arcpy.Describe(inputfc)
    # 获取OID字段名
    fldname = desc.OIDFieldName
    # 用随机ID创建新要素
    arcpy.AddMessage("正在创建新要素类")
    sqlfield = arcpy.AddFieldDelimiters(inputfc, fldname)
    sqlexp = "{} IN {}".format(sqlfield, tuple(randomlist))
    arcpy.Select_analysis(inputfc, outputfc, sqlexp)

以上是ArcGIS Pro创建python脚本工具的过程,更详细的信息参考技术文档。

参考

https://pro.arcgis.com/zh-cn/pro-app/latest/arcpy/geoprocessing_and_python/a-quick-tour-of-creating-script-tools.htm

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

本文分享自 GIS指北 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档