本文为本站站长张继文原创,首发在张继文个人网站(熠其华网),版权归张继文所有。
根据中华人民共和国版权法,任何未经许可传播及洗稿重制等行为将被起诉。
经过上一篇的操作你应该可以做到以脚本的方式来进行一项字段计算的功能。
这一篇将会利用它来打包成一个工具,你可以自用也可以分发,总之你把它做出来,以后你再也不需要在想执行这样的操作的时候而点开属性表右键字段计算了。
学东西要懂得举一反三,这次是前面加0,下次是去掉中间的横线,在下次是让字段A等于字段B的一部分……
你会算法,我教你用法,这样你什么都能做得出来(差不多吧)。
加深一下印象,那个代码怎么写来着??
忘了的话回头翻看或者再照着做一遍。
进入正题。
这次我想做一个这样的工具:
打开工具后,弹出一个窗口,会让我选择:表、包括0一共有多少位、要加在哪个字段——一共三个选项。
那么我们在代码中就要先定义一下三个变量:
- Shuxingbiao——这是属性表的拼音,按照通用的方式我应该用fc来代替,但是由于是初学者也为了看着方便,还是用母语来定义吧,反正也就你自己看;
- ziduan——这是字段的拼音;
- zongchangdu——这是总长度的拼音。意思是你要使你的字段值在加完0之后一共是多长,比如666加三个0是000666,一共就是6位。
现在打开你的编辑器,比如记事本或者notepad++或者别的什么,新建一个空白的页面。
在第一行,手动录入:import arcpy
这句的意思是你这个代码要用到arcgis python了,几乎每个脚本都要有它。
在第二行,你输入你的第一个变量shuxingbiao,用这样的方式:
GetParameterAsText是什么,按照官方的描述是”按照参数在参数列表中的索引位置以文本字符串的形式获取指定参数。”,官方的说明是”无论参数的数据类型是什么,所有值都将作为字符串返回;”
说人话就是这个界面中的那三个选择框:
看到图面中我给你标的0-2三个数字吗,它们分别代表三个变量。
按照这个规律,你把三个变量都在你的代码页上定义好如下:
好了,现在你有三个变量了,这三个变量的值取决于用户输入的内容。接下来把我上一篇教给你的字段计算的函数用上,写好加到第五行:
源代码如下:
import arcpy
shuxingbiao = arcpy.GetParameterAsText(0)
zongchangdu = arcpy.GetParameterAsText(1)
ziduan = arcpy.GetParameterAsText(2)
arcpy.CalculateField_management(shuxingbiao,ziduan,”string({0}-len([{1}]),\”0\”)&[{1}]”.format(zongchangdu,ziduan),”VB”)
我希望你全部都亲自手敲,养成习惯也便于记忆。你手敲的东西出错了,你把错误找出来下次你就不会忘了。
接下来是稍微有点进阶的内容,其实上一步你就算是完成了工具的源代码录入了,但是做为一个工具你要考虑很多因素,不想步子迈太大的话可以不看下面的,直接跳过去看如何打包(部署)成一个可用的工具。
进阶内容:
你应该知道arcgis属性表可能会出乱码的问题吧,这个问题出现的原因大多数就是高版本和低版本的编码问题。在arcgis10.2以下的版本,使用的字符编码是gbk2312,而10.3以上的字符编码是utf-8.两种编码混用在英文环境下一般不会有太大问题,但是如果出现中文的情况就会出现乱码的问题。
Python中英文混用的话,这个又是可以单开一堂课,不信你看看那些付费python课程,一般都会有一节来说明,而且还不是免费试看的部分。这里你感兴趣的话可以找一些通用教程自学了解一下,我不会在教程里详细说明,就根据这次的实例中会出现的问题我来简单讲一下如何处理:
考虑到字段这个变量ziduan ,字段名有可能是英文的也有可能是中文的,这就遇到了上面我说的问题,变量的值是中文,有可能你的软件识别成乱码,软件按照乱码处理,而你的属性表里又没有这个乱码对应的字段,所以工具运行就会出错。一般在部署到arcgis10.2以下的时候会很常见,而在10.3以上就用不着。我用的是10.2,所以我需要进行编码指定。
我新定义一个变量,叫做 ziduan1:
ziduan1 = ziduan.encode(“gb2312”)
意思是ziduan1的值是ziduan的值,以gb2312编码的形式。
接下来,在”核心算法”字段计算器函数中要使用的ziduan变量,统统改成ziduan1然后在头部加个coding:
这样一下就不用担心遇到字段名是中文的时候了。
好了,进阶内容结束,下面是部署方法。
保存你的脚本,起个名字,保存格式为py,这样你得到了一个py文件:
回到arcmap,在目录中找到我的工具箱,右键新建一个工具箱,起个名,就叫”我很厉害”吧:
这个工具箱是空的,你在上面右键-添加-脚本:
选择你刚刚制作的py文件:
到这里的时候不要急着点完成:
还记得前面那三个变量吗,我们需要在这里将那三个变量设好参数,你最好照我的来,你有你的想法的话可以在之后自己改:
你要每一个步骤每一个选项都照我的来,不然出问题我可不管。
点确定后,你会看到这样的:
这就是你的工具了!迫不及待地点开吧,我知道你早就这么干了!
拿个自己的数据试一下:
运行后:
刷新一下表:
成功了,第二节到此为止。
方法你学会了,剩下的发挥你的想象力,做一个其它功能工具吧。
这种简单的实现方法在接下来的文章中将会越来越复杂,其中用到多种算法以及在源代码中需要注意的地方,请关注更新吧。
下面是整个源代码的注释版:
#coding = gbk
import arcpy
shuxingbiao = arcpy.GetParameterAsText(0)
#输入’属性表’路径,为了你能看懂,我用了汉语拼音做变量名。
zongchangdu = arcpy.GetParameterAsText(1)
#输入’总长度’,你加上0以后一共是多长,在这里设定好。为了你能看懂,我用了汉语拼音做变量名。
ziduan = arcpy.GetParameterAsText(2)
#输入’字段’,你要改的字段是哪个字段,在这里选好。为了你能看懂,我用了汉语拼音做变量名。
ziduan1 = ziduan.encode(“gb2312”)
#把输入的字段转码,转成gb2312,因为我要部署的arcgis版本是10.2,如果遇到中文字段名,不进行转码就会报错。
#你要是觉得以后都不会遇到中文字段名,那么这一行可以不加。
arcpy.CalculateField_management(shuxingbiao,ziduan1,”string({0}-len([{1}]),\”0\”)&[{1}]”.format(zongchangdu,ziduan1),”VB”)
#把前面三个变量写到字段计算器函数里,这里用的是你熟悉的VB的写法。
