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

在 ArcGIS 中我们可以通过两种方式来创建python工具:

一种是在标准工具箱下创建 脚本工具:

一种是创建 脚本工具箱

到这里,可能你会有和我一样的疑问,二者有什么 区别

第一种脚本工具需要我们首先在 ArcGIS 环境中创建一个工具箱,然后添加 Python脚本文件(*.py),并通过向导来精确配置参数。这种工具很适合脚本工具的初学者,通过前面说的三步就可以搭建出一个自定义工具。但是这种模式也有一些缺点,工具箱和源脚本是分离的,我们很难集中的去管理和维护它们。

相比于前者的难以集中管理的缺点,第二种的Python工具箱就体现出了它的优势。在 Python 工具箱中,参数定义、代码验证和源代码都在同一位置进行处理,因此Python 工具的创建和维护更加容易。此外,Python 工具箱支持脚本工具不支持的功能,例如值表、复合数据类型和自定义许可检查。

Python 工具箱是在 ArcGIS 10.1 之后的版本出现的。如果你熟悉 Python,就可以充分利用所掌握的 Python 技能来创建 Python 工具箱。

下面是一些更加具体的对比列表:

  自定义工具箱 Python 工具箱

组织

自定义工具箱中的脚本工具被组织成以下三个部分:

  1. 通过向导定义的工具和参数定义。
  2. 对参数行为提供额外控制的可选验证代码,其位于工具箱中。
  3. 在单独的文件中为每个工具维护的源代码,通常作为 Python 脚本 (.py)。

Python 工具箱是一个具有 .pyt 扩展名的 Python 脚本,其包含工具箱及其工具的所有方面:参数、验证和执行。通过以下 Python 类实现:一个类用于工具箱,一个类用于各工具。

编辑

可在任何编辑器中编辑源代码。

通过脚本工具向导编辑参数。

如果使用了验证代码,可在编辑器中通过向导编辑验证代码。

可在任何编辑器中编辑 Python 工具箱文件 (.pyt),而且可在同一位置编辑工具的所有部分(参数定义、验证代码和源代码)。

由于只能在编辑器中编辑 Python 工具箱,它们不支持在工具箱内或工具箱之间进行复制/粘贴。

使用其他工具

自定义工具箱支持各种工具类型,包括 Python 脚本工具、模型工具和内置工具(使用 ArcObjects 和 .NET 等编译型语言构建)。

Python 工具箱不直接支持其他工具类型;即,无法将模型工具或内置工具添加到 Python 工具箱中。但是,可在 Python 工具箱代码中调用其他工具箱的工具。

附加功能

n/a

Python 工具箱支持 isLicensed 方法,您可以根据设定的条件来控制工具的打开。

附加安全性

自定义工具箱中的脚本工具可以将其源代码嵌入工具箱中并使用密码锁定。

n/a

ArcGIS Help 中脚本工具的帮助过于枯燥,在这里,我以一个具体的实例来总结构建脚本工具的过程,我要实现的需求是做个快速实现羽化边界效果的小工具,预期得到如下的效果:

上面效果在ArcMap中完全可以手工运行几个工具实现,但是过程稍微繁琐,那么需求来了,如何做个自定的一键生成羽化边界的小工具?

1 准备Python脚本文件

第一步,先写好脚本工具的核心 —— python脚本文件。

脚本中我希望根据指定环间距自动生成一个9环的缓冲面,然后添加一个字段,用于存储给各个缓冲面的透明度百分比。

看下图就知道我想做什么了:

写一个py文件,将要用到的工具串联起来实现自己的需求,大致是下面的样子。这不是最终要做成脚本工具的版本,只是为了预先了解要如何实现,后面还要修改。

__author__ = 'kikita'# FileName: EasyFeathering.pyimport arcpy
# arcpy.env.workspace = "D:\something\Data.gdb"# Script Tool Parameters
InputFeature = "InterestArea"
OutputFeature = "OutFeathering"
SingleRingWidth = 10000# Some Predefined Parameters
distances = []
level = 9
bufferUnit = "meters"
NewField = "Percent"# My Easy Feathering function
for i in range(level):distances.append(SingleRingWidth*(i+1))i = i+1print  str(distances)
print  "Distance Complete!"arcpy.MultipleRingBuffer_analysis(InputFeature, OutputFeature, distances, bufferUnit, "", "ALL","OUTSIDE_ONLY")
print  "Success to execute Multi Ring Buffer."arcpy.AddField_management(OutputFeature,NewField,"double")
print "Success to add Transparency Percent Field."arcpy.CalculateField_management(OutputFeature, NewField, "!OBJECTID! *10", "PYTHON", "")
print "Success to Calculate Transparency Percent Field."
  • 1
  • 17

2 脚本工具参数配置

有了py文件之后,如何把它塞进工具箱里呢?

在ArcMap的Catalog窗口中,找一个自己喜欢的任意文件夹,新建一个Toolbox,然后右键 Add –> Script,进入向导,这些操作如果不了解,可以点这里 查查帮助,照着做即可,不赘述。

这里我主要说说参数传递。

我希望做好的工具中,我只去指定三个参数,分别是:输入的兴趣区域面(input Feature ),多环缓冲的环间距(Single Ring width ),输出结果(output Feature )。预览下工具界面:

那么问题又来了,这三个参数如何从工具界面传给真正执行工具的 python 脚本?我们需要对前面的脚本参数定义部分做个修改,使用 arcpy 提供的 GetParameterAsText()函数即可在工具界面和脚本之间传递参数。用下面的代码替换前面对这三个参数的替换:

# Script Tool Parameters
InputFeature = arcpy.GetParameterAsText(0)
SingleRingWidth = arcpy.GetParameterAsText(1)
OutputFeature = arcpy.GetParameterAsText(2)

对应的脚本工具参数配置:

为工具配置参数的时候,有2个原则需要遵守:

  • 工具对话框中的参数顺序必须与脚本中的参数顺序一致
  • 每个脚本工具参数都有关联的数据类型。ArcGIS的地理处理不会将值发送给数据类型不正确的脚本,从这点上看,脚本工具比下一篇要说到的脚本工具箱多了一个优势,就是,在参数值发送给脚本之前会有数据类型检验。

修改Python脚本文件后,现在就运行工具,发现可以得到预期的结果:

但是有点不完美,就是在工具的运行过程中,工具给我返回的信息并不充足,我只知道 “Running Script EasyFeathering …”,而不了解工具在做什么,执行到了哪个步骤。这不是好的体验。

3 消息

工具和用户之间的所有沟通均通过消息来实现。接着上一步提出的问题,如何在工具进度窗口中传递消息给用户?

虽然在开始调试脚本的时候,如开头代码所示,我加了些 Print 语句,方便我了解自己的脚本独立执行时的状态,但是如果运行脚本工具,这些print语句是看不到的。可以使用 ArcPy中提供的有关消息的函数,AddMessageAddWarningAddError等向工具进度条界面发送消息。这里我做了个简单的步骤的消息性提示,以及,如果结果没有记录输出,会提示警告。

__author__ = 'kikita'# FileName: EasyFeathering.pyimport arcpy#arcpy.env.workspace = "D:\IncidentSupport2015\something\Data.gdb"# Get the input values from tool UI
InputFeature = arcpy.GetParameterAsText(0)
SingleRingWidth = arcpy.GetParameterAsText(1)
OutputFeature = arcpy.GetParameterAsText(2)# Some Predefined Parameters
distances = []
level = 9
bufferUnit = "meters"
NewField = "Percent"# My Easy Feathering function
for i in range(level):distances.append(int(SingleRingWidth)*(i+1))i = i+1
arcpy.AddMessage("Step1 Distance list Complete!")arcpy.MultipleRingBuffer_analysis(InputFeature, OutputFeature, distances, bufferUnit, "", "ALL","OUTSIDE_ONLY")
arcpy.AddMessage("Step2 Success to execute Multi Ring Buffer.")arcpy.AddField_management(OutputFeature,NewField,"double")
arcpy.AddMessage("Step3 Success to add Transparency Percent Field.")arcpy.CalculateField_management(OutputFeature, NewField, "!OBJECTID! *10", "PYTHON", "")InputFeatureCount = int(arcpy.GetCount_management(OutputFeature).getOutput(0))
if InputFeatureCount == 0:arcpy.AddWarning("{0} has no features.".format(OutputFeature))
else:arcpy.AddMessage("Step4 Success to Calculate Transparency Percent Field.")
  • 2

这样在工具的执行过程中,我就收到了消息:

到这里,工具的功能部分就完成了。

4 显示结果图层

我进一步希望脚本工具运行之后,自动显示在当前的地图文档中,从而避免重复设置透明度的操作。

  1. 为输出参数配置模板图层。

  1. 在处理设置中,激活设置

这样在运行工具之后,结果即自动添加显示。

5 配置路径

如果是在本机使用脚本工具,一般我们会使用绝对路径,但是如果希望分享自己的工具给别人,就要考虑路径问题,也就是新用户运行脚本工具时,相关的脚本文件和其他用到的资源能否访问到。我的工具按照如下的结构组织:

在脚本工具的属性中,可以配置存储相对路径引用 py 文件:

PS:但是不要想太多,这个设置仅仅会将脚本文件所在位置按照相对路径存储,而不会将脚本内部的路径进行转换。

这个示例中我还需要用到一个图层文件作为模板,如果希望使用相对路径使用,就建议将符号化信息写在脚本内部,而不是在参数窗口中配置。所以,要继续修改下Python脚本文件。

在脚本文件的最后追加两行代码,我这里将获取与Python脚本文件在相同目录下的lyr文件:

# Layer files are located in same folder as the .py file
PythonFilePath = os.path.dirname(__file__)
params = arcpy.GetParameterInfo()
params[2].symbology = os.path.join(PythonFilePath, "FeatheringEffectTemplate.lyr")# Pass message
arcpy.AddMessage("Finding Feathering Effect Template Layer ..." +"/n"+ os.path.join(PythonFilePath, "FeatheringEffectTemplate.lyr"))

OK,路径的问题就解决了。

6 帮助文档

还可以进一步为工具添加帮助文档,让更多的人了解如何使用这个工具。

在ArcCatalog 或者ArcMap的Catalog 中,在脚本工具上右键,点击 Item Description 菜单,点击 Edit 就可以对工具的帮助文档进行编辑。

这样当别人打开你的工具时,就看到帮助喽。

好啦,关于ArcGIS 中使用脚本工具的过程就说到这里。

在ArcGIS中创建Python工具或者pyt工具箱相关推荐

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

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

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

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

  3. 第三章 ArcGIS Pro创建 python 脚本工具(五)

    其实整个第三章介绍的内容很少,真正的实验步骤,一节左右就可以概述处理,只是原书作者对于基础与一些信息都给了介绍,所以内容才会显得较多.关于新建自定义脚本工具,我觉得简单的来说,步骤就是创建脚本(如何写 ...

  4. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )

    文章目录 一.PyCharm 中创建 Python 程序 二.导入 ELFFile 依赖库 三. 解析 ELF 文件 四. 博客源码 一.PyCharm 中创建 Python 程序 在 PyCharm ...

  5. 【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )

    文章目录 一.下载 PyCharm 二.安装 PyCharm 三.在 PyCharm 中创建 Python 工程 一.下载 PyCharm 到 PyCharm 主页 https://www.jetbr ...

  6. Linux中创建python项目的虚拟环境virtual enviroment

    Linux中创建python项目的虚拟环境virtual enviroment Linux环境下创建Python项目的虚拟环境: 进入python的项目文件下 cd 你的项目路径 使用virtuale ...

  7. ArcGIS 中创建自定义python工具箱

    如果你觉得使用ArcGIS的Model Builder还无法满足你定制化的处理流程,可以考虑以下使用ArcGIS中带的python工具箱.通过它可以python代码的形式,调用ArcGIS 工具箱中的 ...

  8. Arcgis中创建自定义脚本工具

    前言 虽然说ArcGis中已经自带了大量的工具,但面对某些特殊应用场景时还是无法满足,这时就可以考虑下创建自定义工具.开发人员将自己的逻辑封装为一个工具,直接提供给其他电脑上安装ArcGIS的人员使用 ...

  9. 在ArcGIS中认识 Python工具箱

    认识 Python工具箱 python 工具箱 (.pyt) 是一个简单的文本文件,可以在任何文本编辑器中或者任何 Python IDE 中创建.查看和编辑.要确保 ArcGIS 正确识别 Pytho ...

  10. arcgis中创建逼真的三维视图

    源自arcgis10的在线帮助: 您是一位城市规划者,并且对构建邻近地区的逼真 3D 模型很感兴趣.规划和交通部门的员工已为这一区域的建筑物轮廓线.街灯.树木和样品车创建了 GIS 数据集.您还拥有这 ...

最新文章

  1. 第七届山东省省赛C Proxy(最短路)
  2. Java学习小程序(5)猜数字游戏
  3. ftp put 550 Access is denied
  4. 分布式技术一周技术动态 2016.07.10
  5. 计算机组成原理 微指令编码_计算机组成原理(指令)
  6. 好看的粉色树洞表白墙网站源码
  7. oracle 转成 mysql_oracle转mysql总结(转)
  8. JAVA Timer 定时器
  9. OpenCV配置及开发中遇到的问题
  10. JAVA:项目文档及编写目的汇总
  11. 拼多多商家有效评价是什么意思?拼多多的评价被屏蔽的原因有哪些呢?
  12. QQ浏览器微信版抢先玩!变QQ微信电脑版
  13. python分析报告怎么写_【总结】竞品分析报告撰写的方法
  14. 小刘同学的第七十四篇博文
  15. HDU-1253-胜利大逃亡
  16. 【学习笔记】第五章 线性规划
  17. Linux系统管理上机作业1
  18. 《孙子兵法》帮你找到不合格的管理者
  19. Mysql 中的 mvcc原理
  20. iPhone开发系列文章(四)-开发iPhone应用程序(一)

热门文章

  1. 服务器双路cpu装什么系统,双路服务器CPU是什么意思?双路CPU是什么?
  2. 【古代文学论文】酒文化传播中唐代文学的作用分析(节选)
  3. 2019年3月6日-KS103的使用
  4. C++ 实现小写金额转化为大写金额
  5. 【线性代数】n阶行列式
  6. 重做raid后,重启无法进入系统
  7. 探讨大数据时代如何规划智慧城市
  8. 2019年 电赛C题 全国大学生电子设计竞赛试题解析与总结
  9. 网络里面如何添加计算机,计算机如何添加网络协议
  10. golang 支付宝小程序 登陆