1.自定义工具箱是什么就像名字一样,自定义工具箱是由个人创建的工具箱,就像下面这样,可以理解成一个 .tbx 后缀的压缩包,每一个工具箱中都可以添加多个工具集、脚本工具甚至模型构建器工具。 1.1如何添加自定义工具箱(熟悉可跳过)第一步:右键点击 ArcToolbox -> 添加工具箱 第二步:在打开的添加工具箱窗口中选中需要添加的工具,然后点击右下角的打开即可。 1.2如何创建自定义工具箱点击右上角的红色工具箱符号,可以新建并重命名一个工具箱。 我们这里新创建了一个海怪工具箱,用于之后的教程演示。 1.3添加一个脚本工具新创建的工具箱就像一个大箱子,箱子呢是用来装工具的,你可以直接在工具箱中右键,然后点击添加,再点击脚本,进而创建一个脚本工具; 亦或是右键,点击新建,再点击工具集,创建一个可以自定义名称的工具集,然后在工具集里新建一个脚本工具。 这里添加的脚本工具只是一个空壳,我们后面会继续完善。 新建的工具箱位于 ../Chapter7/海怪工具箱.tbx。 2.工具箱的封装工具箱由三部分组成,其中有两部分需要我们来控制:
所以下面的重点就是输入界面和 Python 源代码。 2.1工具箱输入界面工具箱输入界面,或者说图形交互界面(GUI),就像下面的几张图一样,从该界面我们可以控制工具的行为,自定义输入界面然后配合 Python 脚本,可以实现多种客制化的功能。 简单来说,你可以认为输入界面是依托于 Arcmap 的“前端”,脚本代码就是负责运行的“后端”。 导入导出工具: 为方便演示,制作一个非常简单的工具箱,它的功能呢就是把输入的要素类(数据库或者 shp )再导出来而已,是完全没有用的导入导出功能啦,不过作为演示还是非常不错的。 第一步: 在工具箱中,右键点击添加,再点击脚本,然后修改名称,修改成你想要的名字,勾选存储相对路径名,然后点击下一页。 第二步: 然后添加脚本文件,添加该脚本文件 ../Chapter7/toolscript/input_and_output.py,读者可以在最后的下载包中找到该文件。 然后点击下一页。 第三步: 控制用户交互界面。ArcGIS 在这里内置了一整套简单但是实用的图形控件,比如输入菜单、下拉框、多选框、单选等,借由这些图形控件我们可以控制脚本工具的图形交互界面。 我们这里使用的脚本功能非常简单,上面也有说到:输入一个矢量要素类,不做任何处理,然后输出一个矢量要素类。 为了匹配这个脚本,我们需要设置一个输入图层的控件,同时为了能顺利的输出,也需要一个输出图层的控件,注意一个是输入一个是输出。 从下图可以看到,左边(左边的橙色框)是显示名称,其中输入输出控件的名称以及输入控件的名称,这里命名为输入要素和输出要素;然后在右边(右边的橙色框)的数据类型下拉框中,我们选择要素图层,这里只能做选择,不能任意输入。 那么输入输出是如何区分的呢? 选中输入要素(变成蓝色),然后可以看到下方(下方橙色框)的参数属性设置选项卡,这里可以对参数进行调整。 ① 类型:有三种,一般只会用到 Required 和 Optional,表示必须和可选,用于控制参数是否可以忽略不填; ② 方向:两种,Input 和 Output,表示输入和输出,大部分情况都是使用 Input 来获得参数,Output 用于获得最后的成果数据,像是矢量、栅格或者图表; ③ 多值:Yes 或者 No,用于输入多个相同类型的数据,工具打开后就是下面这样,在输入要素中可输入多个要素类; ④ 默认:设置一个控件的默认值,直接输入即可。可配合多值一同使用,使用 ; (英文的分号)分开, 结果如下,可以看到一打开该工具就已经填充上了预设的多个默认值(报错是因为数据类型不是要素图层); ⑤ 环境:工具箱的环境设置,比如掩膜、容差范围、默认数据库位置等,一般不预先设置; ⑥ 过滤器:选择文件类型可以在选择文件时只显示特定格式的文件; ⑦ 获取自:指定数据的获取源。这是个什么意思呢?比如我们想要获取图层A的某个字段,获取源就是图层A。 以下面这种图作为例子,新增名为字段的控件(上方的橙色框),数据类型也是字段,然后参数属性中获取自选择输入要素(下方橙色框)。 点击完成后,打开脚本工具。在输入要素框中选择一个图层,然后再点击获取字段,如下就可以选择图层中的字段了。 ⑧ 符号系统:在最下面还有一个符号系统,通常只能作用于输出的矢量图层(方向:Output),可为输出图层指定设置好的 lyr 文件样式。 第四步: 点击右下方的完成,那么脚本工具的输入界面就完成了。 2.2 Python 脚本工具箱输入界面和 Python 代码要相互配合才行,工具箱界面中的输入、输出以及各种各样的参数,在 Python 脚本文件中都得一一对应上,将输入界面中的各个参数传给 Python 脚本,这样才能让 Python 脚本按照预期的效果正常运行。 看上去有点麻烦,但实际上 arcpy 中提供了现成的函数就可以直接获得参数。 ①参数对接(获取) 至于如何对接参数,我们使用刚刚的那个脚本文件举例: ../Chapter7/toolscript/input_and_output.py ▶1◀:arcpy 提供了 如果有更多参数,以此类推。 ②参数对接中应该注意的情况 如果你只是输入输出地址这种,那么没有问题,因为地址本来就是字符串,但是如果你设置了一个选择长度范围的长整型的控件、亦或是某种布尔值选择,最后输入到 python 脚本这里都会变成字符串。
③更好的参数获取写法 上面例子是一个一个的获取参数,但是如果参数很多呢?10个参数难道写10遍 ▶2◀:使用 使用这种方法可以显得比较厉害,同时精简代码。 ④信息输出 难免想要在代码中打 print,不管是作为临时的“断点”检查一下,还是作为长期的信息输出。 那么在工具箱中如何向外面输出信息呢? arcpy 提供了 ▶3◀:我们在这里使用 ⑤导入脚本 到这里基本上工具就完成了,只不过 Python 脚本和自定义工具箱是分开,创建的工具在运行的时候会根据相对路径位置(如果你一开始勾选了存储相对路径名)寻找 Python 脚本,找到并运行。 不过你愿意的话,也可以把 Python 脚本文件导入到工具箱中,这样带着一个工具箱就行了。 3. 工具箱的各种错误和注意事项3.1“限定”的错误让我如此苦恼、如此害怕的,就是把写好的 Python 脚本封装成 ArcGIS 的工具箱。 每次我把程序代码写好,也能正常的运行,然后将其导入自定义工具箱中,点击运行之前还得沐浴更衣好好的祈祷一番,愿天公助我。 然而事与愿违,刚刚还好好的程序报错了,错误可谓是千奇百怪,大部分时候都在说谜语,明明显示第100行有什么什么错,结果一看,100行是空行... 显然,ArcGIS 工具箱有一些特别的魔法,拥有一些专属自己的“限定”错误,这种错误只有在这里才能品味到。 还不快跟着我尝一尝新鲜的魔法shit。
3.2工具箱名字导致的错误我们先从最简单的错误开始。 工具箱名称导致的错误: 由于输出路径会自动填入工具箱的名字,中间有特殊符号的话,比如:“-”,就会报错。 3.2缩进错误诡异的错误来了,报错显示如下。我都不知道是说的什么鬼话,怎么还有缩进错误? 锁定到报错提示的地方,是这样的: 看上去非常正常,100%正常,开始我不信是这里的问题,我开始折腾,狂写 print 语句,使劲打断点,使劲测试,最后机缘巧合之下,我把中文注释移到了上方,然后就顺利运行了。 好吧,由于把 else 和中文注释写到一行,导致 else 被莫名其妙被跳过了,所以导致错误。 3.3两种“变量”错误第一种: global name xx is not defined 第二种: name xx is not defined 这个错是缠绕我最久的,每次出这种错误我都到处测试,偶尔莫名其妙就好了,但是一直不知道原因,直到后来我怀疑是不是也是中文字符造成的错误,结果发现,嘿,还真是! 比如错误处的代码是这样的,在变量 pta2 的上面是一行中文注释: 我们使用空行将报错的变量和中文注释隔开: 于是乎,程序顺利运行了,原来如果在变量的上一行是中文注释,有可能会导致下面那一行被工具箱里面的神奇魔法规则跳过。 自此,困扰我很久、经常让我折腾到深夜的各种暗坑终于有了解决方法。 个人的经验,希望能对你有所帮助和启发。 4.最后和总结总结:
使用版本:
源代码、教学文档离线小册子下载: |
|