
在某些情况下,为了设置字段值,可能要对单条记录甚至是所有记录执行数学计算。字段计算器可以对所有记录或选中记录执行简单计算和高级计算。
计算可以通过【Python】或【VBScript】执行。建议使用【Python】,字段计算器的使用,其实主要就是【Python】基础语法的简单应用。
注意,在代码框里输入的符号都必须是在英文状态下输入。

字段计算器的使用方法
在任一要素类或者表上右击【打开属性表】,再找到要计算的字段上右击【字段计算器】,即可打开字段计算器。

打开窗口如上图。
1)选择脚本语言。默认是【VB】,需要手动改成【Python】。
2)要素或表的字段名,可以双击,会自己在(5)或者(6)的代码里自动生成字段名的代码。
3)python的一些简单函数和方法,同样可以双击自动生成。
4)如果勾选【显示代码块】,则会出现代码框(6)。默认是不勾选的,如果计算脚本比较复杂,需要多行,就勾选,在代码框(5)中定义方法,再在代码框(6)中进行引用。
5)主代码框。
6)引用方法的时候用到的代码框,默认是不开启的。

使用方法示例
1、四则运算
简单的加减乘除运算,例如:
!数值01! * !数值02!

2、字符串叠加
!字符串01! + !字符串02!

3、字符串切片
如字符串的前3位:
!字符串01![:3]

类似的情况还有,取字符串的后3位:
!字符串01![-3:]
取字符串的2到4位。
!字符串01![1:4]
取关键字及前面或后面的文字,如,取“市”及前面的字。
注意,要查找的如果是中文,需要在前面加u,这是python2.*版本的问题。如果是ArcgisPro就不用加。
!字符串01! [:!字符串01!.find(u'市')+1]

如果要考虑“市”和“县”2个关键字,情况就稍微复杂一些。可以勾选【显示代码块】,写一个方法再引用。
def ss(a):list_str = [u'市', u'县']index = -1for s in list_str:if a.find(s) != -1:index = a.find(s)return a [:index+1]

4、英文转大写、小写、首字母大写等
全部转大写:
!字符串01!.upper()
全部转小写:
!字符串01!.lower()
首字母大写,其余字母小写:
!字符串01!.capitalize()

5、字符串替换
如:要把“县”替换成“市”,注意这里不是在新字段里生成结果,而是修改原字段,要小心。
!字符串01!.replace(u'县', u'市')
引申一下,如果要去取字符串中的空格,则可以如下计算:
!字符串01!.replace(' ', '')
6、在字符串的每个字符中插入一个指定字符
如:要把【福州市】计算成【福_州_市】,字符也可以是空格。
'_'.join( !字符串01! )

7、保留2个小数
如果要把一个小数类型的字段,保留2个小数,可以如下:
round(!Shape_Area!,2)

8、计算椭球面积
注意,要计算的字段必须是float或是double类型。要素也不能没有定义坐标系。
!shape.geodesicarea!
9、提取中文、英文、数字、特殊符号
这里有用到正则表达式。如,提取汉字:
import redef ss(a):va = re.findall(u'[\u4e00-\u9fa5]+',a)if len(va) == 0:result = ''else:result = ''for i in range(0, len(va)):result += va[i]return result

如果是提取英文,则上面第3行代码替换成:
va = re.findall(r'[a-zA-Z]', a)
如果是提取数字:
va = re.findall(r'\d', a)
特殊符号:
va = re.findall(r'\W', a)
10、if-else语句的运用
例如:通过建筑结构和层数来简单判断建筑质量。
def ss(a,b):if a == u'混' and b>2:return '质量较好'elif a == u'混' and b<=2:return '质量一般'else:return '质量较差'

11、计算要素的四至、部件数等
# 东!shape.extent.XMax!# 西!shape.extent.XMin!# 北!shape.extent.YMax!# 南!shape.extent.YMin!# 部件数!shape.PartCount!# 是否是多部件!shape.isMultipart!
12、字段值前面补齐0
例如:在OID前补0,补到8位。注意要计算的字段必须是字符串类型。
(8-len(str(!数值01!))) * '0' + str( !数值01! )

13、度分秒转十进制度
这个例子算是一个综合运用,代码较长。
def ss(a):index1 = a.find(u'°')index2 = a.find(u'′')index3 = a.find(u'″')degree = float(a[0:index1])minutes = float(a[index1 + 1:index2])seconds = float(a[index2 + 1:index3])result = degree + minutes / 60 + seconds / 3600return result

14、数字前填充0
一般用在编号中, 例如取【OBJECTID】的数字并在前面填充0至5位,注意计算的字段必须是字符串型。因为【OBJECTID】的值是数字,所以要加str()转成字符串:
str(!OBJECTID!).zfill(5)

15、小数点后保留固定位数,不足部分用0填充
正常情况下用round()函数可以保留固定位数,但是因为生成的是数值型,所以如果最后位是0会自动消掉。如果想要实现不足部分用0填充,则需要字段为字符串型,并如下计算:
format(!TBMJ!, '.5f')

16、文本居中,两端填充
再整点活,如果想在文本两端都进行填充。例如要在文本前后都填充【0】至文本长度为8:
!JQDLMC!.center(8,"0")

17、文本左右对齐,另一端填充
例如文本左对齐,右侧填充至8位:
!JQDLMC!.ljust(8,"%")

相反的话则是:
!JQDLMC!.rjust(8,"%")
18、获取特定字符在字符串的位置
例如获取字符串中【8】的位置,注意是从左开始获取第一个【8】的位置:
!BSM!.find("8")
如果是从右开始获取:
!BSM!.rfind("8")
19、获取多个数字型字段值中的最大值或最小值
取最大值:
max(!TBMJ!,!Shape_Area!)

取最小值:
min(!TBMJ!,!Shape_Area!)
20、获取随机数
例如要获取0至10之间的随机整数:
random.randrange(0,10)
在代码块中输入:
import random

21、赋空值
空值不是空格:
None
22、计算数字的百分比变化
例如计算图斑的面积变化,以百分比的方式表达:
PercentChange(!TBMJ!)
在代码块中输入:
lastValue = 0def PercentChange(arg):newValue = argglobal lastValueif lastValue:percentage = (float(newValue - lastValue) / lastValue) * 100else:percentage = 0lastValue = newValuereturn percentage

23、计算数字的累积值
例如逐个累积图斑的面积之和:
AccumulateValue(!TBMJ!)
在代码块中输入:
total = 0def AccumulateValue(arg):value = argglobal totalif total:total += valueelse:total = valuereturn total

24、给图斑顺序编号
结果输入:
SequentialNumber()
在代码块中输入:
rec=0def SequentialNumber():global recpStart = 1pInterval = 1if (rec == 0):rec = pStartelse:rec = rec + pIntervalreturn rec

25、获取面要素的折点数
可以获取面要素折点线,需注意获取的折点数包括首末点,比你看上去的要多一个。选择一个整型字段进行计算:
getVertexCount(!shape!)
在代码块中输入:
def getVertexCount(feat):partnum = 0partcount = feat.partCountpntcount = 0while partnum < partcount:part = feat.getPart(partnum)pnt = part.next()while pnt:pntcount += 1pnt = part.next()if not pnt:pnt = part.next()partnum += 1return pntcount
26、移动点要素
在【shape】字段上点击计算字段,实现点要素x坐标增加100:
shiftXCoordinate(!SHAPE!)
在代码块中输入:
:= 100= shape.getPart(0)= shiftValuereturn point

- END -
EPS房屋和宗地图绘制、数据检查、成果输出
ArcMap出图小技巧:主图设计、图例、比例尺、指北针、标题



