认识 Python工具箱

python 工具箱 (.pyt) 是一个简单的文本文件,可以在任何文本编辑器中或者任何 Python IDE 中创建、查看和编辑。要确保 ArcGIS 正确识别 Python 工具箱,工具箱类的名称必须是 Toolbox。在 Toolbox 类的 __init__ 方法中定义工具箱的属性,这些属性包括 alias、label 和 description,我们可以按照 帮助文档 中的模板构建 Python 工具箱模板。

如下代码中创建了包含一个工具(名为 Tool)的 Python 工具箱:

import arcpyclass Toolbox(object):def __init__(self):"""Define the toolbox (the name of the toolbox is the name of the.pyt file)."""self.label = "Toolbox"self.alias = ""# List of tool classes associated with this toolboxself.tools = [Tool]class Tool(object):def __init__(self):"""Define the tool (tool name is the name of the class)."""self.label = "Tool"self.description = ""self.canRunInBackground = Falsedef getParameterInfo(self):"""Define parameter definitions"""params = Nonereturn paramsdef isLicensed(self):"""Set whether tool is licensed to execute."""return Truedef updateParameters(self, parameters):"""Modify the values and properties of parameters before internalvalidation is performed.  This method is called whenever a parameterhas been changed."""returndef updateMessages(self, parameters):"""Modify the messages created by internal validation for each toolparameter.  This method is called after internal validation."""returndef execute(self, parameters, messages):"""The source code of the tool."""return

动手做做

下面我就依据这个模板,写一个简单的脚本工具箱。需求是批量裁剪,我希望我只提供一个文件夹或者数据库等这样的工作空间和一个裁剪区域面,就可以批量完成工作空间内全部数据的裁剪工作,并且无视栅格还是矢量,一并裁剪。

Let the scripting begin ……

1 创建工具箱

工具箱的name就是 .pyt 文件的名字,通常我们把工具添加到 ArcToolbox窗口中时会显示工具箱的 label。在 Toolbox 类的 __init__ 方法中定义属性,例如: aliaslabeldescription

工具作为被添加至 .pyt 中,工具箱的 tools 属性必须设置为包含定义的所有工具列表。比如,需要做ATool,ATool,CTool三个工具,不是写三个脚本,而是创建三个,然后将类名放入列表, self.tools = [ATool,ATool,CTool]

这里,我仅定义一个工具类 ClipWorkspace,来说明构建过程即可 :

'''
Source Name:   ClipWorkspace.pyt
Author:        Kikita
Description:   Python tool to clip spatial data in the same workspace by batch.
'''import arcpy# The class name must be "Toolbox" ...
class Toolbox(object):def __init__(self):self.label = "Clip Workspace Toolbox"self.alias = ""# List of tool classes associated with this toolboxself.tools = [ClipWorkspace]class ClipWorkspace(object):……

在 ArcGIS Desktop 中已经可以看到这个工具箱的雏形:

2 定义工具

下面就是完善工具内部的代码。我就以 ClipVectorWorkspace 为例。

每个工具类应至少包括 __init__execute 方法。此外,还可以选择使用 getParameterInfoisLicensedupdateParametersupdateMessages 方法向工具的行为中添加其他控制。

工具类中的 __init__ 方法是标准 Python 类初始化方法。对于 Python 工具箱中的工具,__init__ 方法用于设置该工具的属性,例如工具的标注、描述、是否允许在后台运行等。

下面的例子就创建了ClipVectorWorkspace这个工具:

class ClipWorkspace(object):def __init__(self):self.label = "Clip Workspace"self.description = "clip spatial data in the same workspace by batch."self.canRunInBackground = True

有了工具的构造函数,我们继续看如何给工具定义参数。在 Python 工具箱 (.pyt) 中,可在工具类的 getParameterInfo 方法中创建 Parameter 对象,并设置对象的属性来定义工具参数。Parameter的属性中datatype
包含的类型可以在帮助文档中查询,点这里

此示例中的参数就是输入工作空间(inWorkspace)、裁剪区域面(ClipArea)、输出工作空间(outWorkspace)。

    def getParameterInfo(self):# Parameter Definitions# First parameter - Input Workspaceparam0 = arcpy.Parameter(displayName="Input Workspace",name="inWorkspace",datatype="DEWorkspace",parameterType="Required",direction="Input")# Second parameter - Clip Areaparam1 = arcpy.Parameter(displayName="Clip Area",name="CLipArea",datatype="DEFeatureClass",parameterType="Required",direction="Input")# Third parameter - Output Workspaceparam2 = arcpy.Parameter(displayName="Output Workspace",name="outWorkspace",datatype="DEWorkspace",parameterType="Required",direction="Input")params = [param0,param1,param2]return params   
  • 1

PS : 在代码中,如果仔细看,或许你会疑惑,为何输出工作空间的方向是 input ,而不是 output? 因为工具最终输出的为 Feature Class 或 Raster,输出工作空间也是作为输入参数传入工具使用的。如果不关心,也可以不在意这些细节…… 继续向下了解工具的构建过程。

下面就是工具的具体执行部分了,当然里面还加了些辅助了解工具执行状态的消息:

    def execute(self, parameters, messages):"""The source code of the tool."""# Get tool parametersinWorkspace = parameters[0].valueAsTextarcpy.AddMessage("###Input Workspace is {0}".format(inWorkspace))ClipArea = parameters[1].valueAsTextarcpy.AddMessage("###Clip Area is {0}".format(ClipArea))outWorkspace =  parameters[2].valueAsTextarcpy.AddMessage("###Out Workspace is {0}".format(outWorkspace))# Clip Feature by Batcharcpy.env.workspace = inWorkspace# Clip VectorFeatureClasses = arcpy.ListFeatureClasses()arcpy.AddMessage("Input Workspace contains {0}".format(FeatureClasses))for fc in FeatureClasses:arcpy.AddMessage(">> Clipping  {0}".format(fc))arcpy.Clip_analysis(fc,ClipArea, os.path.join(outWorkspace,fc))arcpy.AddMessage("{0} has been clipped.".format(os.path.join(outWorkspace,fc)))# Clip RasterRasters = arcpy.ListRasters()arcpy.AddMessage("Input Workspace contains {0}".format(Rasters))for Raster in Rasters:arcpy.AddMessage(">> Clipping  {0}".format(Raster))arcpy.Clip_management(in_raster = Raster,rectangle = "",out_raster = os.path.join(outWorkspace,Raster),in_template_dataset = ClipArea,nodata_value = "",clipping_geometry = "ClippingGeometry",maintain_clipping_extent = "NO_MAINTAIN_EXTENT")arcpy.AddMessage("{0} has been clipped.".format(os.path.join(outWorkspace,Raster)))return

到这里,工具的核心部分已经完成,执行下试试。

OK,应该是预期的结果:

3 完善

我们发现不像标准工具箱中的脚本工具和脚本文件本身是散列存储的,python工具箱以及其中的所有工具的代码都在这一个pyt文件中,维护起来便利了不少。如果想在工具箱中继续添加工具,只要继续增加一个工具类即可。

经过前两步的过程,工具已经可以拿去使用。如果为了工具更友好,还可以继续调整下代码,以便遇到异常的时候,让用户了解更详细的原因,这里就再往下进行了。工具分享给别人,最后只差要丰富下工具文档了,同样在 Python 工具的 Item Description 中编辑。

参考:http://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/creating-tools/a-template-for-python-toolboxes.htm

在ArcGIS中认识 Python工具箱相关推荐

  1. 在ArcGIS中创建Python工具(一)

    ArcGIS Desktop 自带有大量的工具,可以执行各种各样的地理处理任务.通过 python 我们可以灵活地调用这些工具,把工具组织成自己的工作流,甚至创建一些新的工具.今天就说说在 ArcGI ...

  2. 在ArcGIS中创建Python工具(三)

    从 ArcGIS 10.1 版本开始,我们可以创建 python工具箱 来自定义脚本工具,这种工具箱相比较上一篇提到的标准工具箱.有着独特的优势,具体二者的区别总结过,看这一篇. 认识 Python工 ...

  3. arcpy 批量投影_怎样用arcgis中的python进行批量投影

    展开全部 接到的需求是对文件62616964757a686964616fe4b893e5b19e31333363393638夹下包括子目录所有影像进行投影变换,在网上找了找,大家的代码好像和需求不太一 ...

  4. arcgis的python脚本-在ArcGIS中写python脚本读取shapefile

    ArcGIS帮助中的相关代码并不能直接运行,进行了小幅修改,现在就可以直接运行了. python代码的大致思路是: (1)先获得描述shp的相关信息,获得存储图形信息的字段名: (2)然后获得游标: ...

  5. arcgis中的python字符串比较

    字段类型为字符串 jj为int类型 在使用python的ifelse时对字符串进行比较时并赋值,输出结果全部为1 正确代码如下 # -*- coding: utf-8 -*- z=0 def a(td ...

  6. 使用Python在ArcGIS中编程杂谈

    原文:使用Python在ArcGIS中编程杂谈 作为一名GISer,编程能力是必不可少的.学习编程说起来容易做起来难,特别是不知道从哪里开始.本文主要是指引你开始使用针对GIS的Python编程. 在 ...

  7. arcgis支持python3吗_常见问题解答:ArcGIS 中使用的 Python 是什么版本?

    常见问题解答:ArcGIS 中使用的 Python 是什么版本? 问题 常见问题解答:ArcGIS 中使用的 Python 是什么版本? 答案 Python 编程语言用于自 9.0 起的各版本 Arc ...

  8. [转载] 使用Python在ArcGIS中编程杂谈

    参考链接: 使用Python中的元类进行元编程 原文:使用Python在ArcGIS中编程杂谈 作为一名GISer,编程能力是必不可少的.学习编程说起来容易做起来难,特别是不知道从哪里开始.本文主要是 ...

  9. arcgis下的python编程-基于ArcGIS的Python编程秘笈(第2版)

    基于ArcGIS的Python编程秘笈(第2版) 译者简介 审阅人简介 1 面向ArcGIS的Python语言基础 1.1 使用IDLE进行Python脚本开发 1.1.1 Python Shell窗 ...

最新文章

  1. [云炬创业基础笔记]第四章测试20
  2. 有种欢迎叫“来了就是深圳人”
  3. PHP Mysql-创建数据表
  4. Java中抽象类和接口的区别?
  5. javacript 布尔型
  6. python 插入排序,选择排序
  7. jQuery中click事件多次触发解决方案
  8. 细思恐极 天价房都被谁买去了?——如何操作?
  9. Windows下安装 Apache 步骤
  10. OXY OPENCART 商城自适应主题模板 ABC-0020-01
  11. ECCV 2022最佳论文奖公布!两位华人学者摘得桂冠!本科来自清华、浙大
  12. java.sql.SQLException: is unrecognized or represents more than one time zone. You must configure
  13. thinkphp创建临时表
  14. 计算机网课计划,计算机基础课程授课计划表.docx
  15. 印欧语系及文化(Indo-European and Culture)英汉双语本(中译本,中文版)
  16. 智能机器人为什么连接不上服务器,战争机器人无法连接服务器是什么原因
  17. kuix教程1:我的第一Kuix应用
  18. 自动泊车(之三)车位线定位(视觉定位)
  19. 基于Java开发的数据大屏展示程序
  20. [darknet源码系列-2] darknet源码中的cfg解析

热门文章

  1. 计算机系统的主存主要是由()构成的。【最全!最详细分析!】
  2. 43行代码AC——例题6-8 树(Tree,UVa 548)——解题报告
  3. python 列表比较不同物质的吸热能力_飘着雪花的冬天
  4. laravel8 模型自定义方法_Laravel 8.14.0 发布,PHP Web 开发框架
  5. strstr函数_[LeetCode] 28. 实现strStr()
  6. 内网通免广告_3D打印进军广告发光字领域,成为名副其实的智能打印工厂
  7. python aiohttp_aiohttp
  8. linux父设备,linux 设备模型---学习记录(二)
  9. poi报空指针_POI 导出文件 报空指针异常 --Docker 中
  10. win10系统要求配置_酒店智能化集成系统设计要素、系统功能要求和配置标准