# 前言
使用键盘输入值并不是编辑表中值的唯一方式。在某些情况下,为了设置字段值,可能要对单条记录甚至是所有记录执行数学计算。您可以对所有记录或选中记录执行简单计算和高级计算。
此外,还可以在属性表中的字段上计算面积、长度、周长和其他几何属性。
简单计算
计算字符串
如内容为数值(字符串中可以存储数值,相反则不可以),直接输入即可。
如内容为字符串,要使用英文双引号引起来。
涉及到字符串的连接,将多个字段使用&连接即可,例如想要将SHENG和XIAN两个字段连接,同时中间以“-”隔开(Python状态下字段名用!引起,连接使用+):
[SHENG]&"-"&[XIAN]
计算数值
简单的加减乘除运算,如计算男人MEN和女人WOMEN的总数:
[MEN]+[WOMEN]
使用内置函数
VBScript 函数
字符串操作
Asc 返回指定字母的ASCII代码
Chr 根据ASCII代码返回对应的字符
String(数目,字符串) 返回具有指定长度的、重复字符组成的字符串,(重复字符取字符串的第一位)例:
MyString = String(5,"*") '返回"*****"
MyString = String(5,"ABC") '返回"AAAAA"
Lcase 英文字符转为小写
MyString = Lcase("BIGHEAD") '返回"bighead"
Ucase 英文字符转为大写
MyString = Ucase("bighead") '返回"BIGHEAD"
Ltrim 去除左端空格
MyString = Ltrim(" BIGHEAD") '返回"BIGHEAD"
Rtrim 去除右端空格
MyString = Rtrim("BIGHEAD ") '返回"BIGHEAD"
Trim 去除左右端空格
MyString = Trim(" BIGHEAD ") '返回"BIGHEAD"
Left([字段名],length) 自左侧取length个字符
MyString = Left("BIGHEAD",3) '返回"BIG"
Right([字段名],length) 自右侧取length个字符
MyString = Right("BIGHEAD",4) '返回"HEAD"
Mid([字段名],起始字符序号,长度) 自第几个字符向右取指定长度的字符(索引从1开始,包含起始字符,长度参数可以省略),例:
MyString = "Mid Function Demo" '创建一个字符串
FirstWord = Mid(MyString, 1, 3) ' 返回 "Mid"
LastWord = Mid(MyString, 14, 4) '返回 "Demo"
MidWords = Mid(MyString, 5) '返回 "Function Demo
Len([字段名]) 获取字段长度
Len("BIGHEAD") '返回7
Space(空格个数) 返回指定个数的空格(可与连字符结合使用在字符串前面或者后面加固定个数的空格)
MyString = Space(3) & "BIGHEAD" '返回 " BIGHEAD"
Replace([字段名],"替换前的字符","替换后的字符")
MyString = Replace("ABC","B","C") '返回 "ACC"
拓展一下
结合上面函数,组合一个:字段前面补零成为固定长度字符串
String(目标长度-Len([目标字段]),"0") & [目标字段]
数值操作
ABS([字段名]) 取绝对值
ATN ([字段名]) 反正切值
SIN COS TAN 三角函数
FIX([字段名]) 返回数的整数部分
FIX(-8.4) '返回 -8
FIX(8.4) '返回 8
INT ([字段名]) 返回数的整数部分
Int(-8.4) '返回 -9
Int(8.4) '返回 8
SQR ([字段名]) 返回数的平方根
SQR(4) '返回 2
LOG EXP 对数,不常用
Python函数
Python 计算表达式字段将使用惊叹号 (!!) 括起。
字符串切片
此模式综合了VBScript里的left、right和mid函数,但又具有自己独特优点,如截取除前几位或者后几位的字符,不用函数组合。
!字段名![起始位置下标:结束位置下标]
索引从0开始;
表示截取字符串起始位置的字符到结束位置的字符;
包含起始字符但不包含结束字符;
截取的字符长度为结束位置下标-起始位置下标;
冒号前面为空或者0表示从第一位开始截取;
冒号后面为空表示截取起始位置字符到字符结束,并包含结束字符。
截取除前几位的字符:!字段名![字符长度:]
字段名为XIANG 内容为:123456大东方乡 公式:!XIANG![6:] 结果:大东方乡
截取除后几位的字符:!字段名![:-字符长度]
字段名为XIANG 内容为:大东方乡123456 公式:!XIANG![:-6] 结果:大东方乡
截取前几位字符: !字段名![:字符长度]
字段名为XIANG 内容为:123456大东方乡 公式:!XIANG![:6] 结果:123456
截取后几位字符: !字段名![-字符长度:]
字段名为XIANG 内容为:大东方乡123456 公式:!XIANG![-6:] 结果:123456
数值计算
Python 提供了处理数字的工具。Python 也支持一些数值和数学函数,包括 math、cmath、decimal、random、itertools、functools 和 operator。
Python 具有多个可用的内置函数,包括 max、min、round 和 sum。
这里介绍一下取余符号 %,在获取单行或者获取等高线计曲线(加粗的那根)时会用到
5 % 2 '返回 1
使用代码块
代码块的使用方式取决于表达式类型参数。计算字段工具支持将 PYTHON、PYTHON_9.3 和 VB 作为表达式类型。此处只介绍Python代码块,了解即可,如需更深学习,请先行熟悉Python语法。
各 Python 函数可通过 def 关键字定义,关键字后为函数的名称以及函数的输入参数。函数名称可由您自行选取(不得使用空格,也不得以数字开头)。
可编写 Python 函数,使 Python 函数能够接受任何数量的输入参数(也可以没有任何参数)。函数将通过 return 语句返回值。
随机值
解析程序:
Python
表达式:
getRandomValue()
代码块:
import numpy
def getRandomValue():
return numpy.random.random()
根据某间隔值计算顺序 ID 或数字
解析程序:
Python
表达式:
autoIncrement()
代码块:
rec=0
def autoIncrement():
global rec
pStart = 1 #设置起始值
pInterval = 1 #设置间隔值
if (rec == 0):
rec = pStart
else:
rec = rec + pInterval
return rec
按照字段值进行分类
解析程序:
Python
表达式:
Reclass(!WELL_YIELD!)
代码块:
def Reclass(WellYield):
if (WellYield >= 0 and WellYield <= 10):
return 1
elif (WellYield > 10 and WellYield <= 20):
return 2
elif (WellYield > 20 and WellYield <= 30):
return 3
elif (WellYield > 30):
return 4
获取最大值字段名称
解析程序:
Python
表达式:
getMaxFieldName(!GT_YLD!, !GT_GMLD!, !GT_QTLD!, !GT_GD!)
代码块:
def getMaxFieldName(GT_YLD, GT_GMLD, GT_QTLD, GT_GD):
dic = {"GT_YLD": GT_YLD, "GT_GMLD": GT_GMLD, "GT_QTLD": GT_QTLD, "GT_GD": GT_GD}
return max(dic, key=dic.get)
计算几何属性
“计算几何”工具可以访问图层的要素几何。根据输入图层的几何,此工具可以计算坐标值、长度和面积。这些计算都可以在字段计算器中计算,而且字段计算器支持更多的几何属性计算。
以下皆基于Python解析程序,请不要选择与要素类型不匹配的属性。
指定计算几何属性的单位
几何字段的面积和长度属性可通过表示为带有 @ 符号的单位类型进行修改。
面积测量单位
HECTARES 公顷
SQUAREMETERS 平方米
SQUAREKILOMETERS 平方公里
!shape.area@hectares!
线性测量单位
METERS 米
ILOMETERS 公里
!shape.length@meters!
指定小数位数
round(!shape.area@hectareas!,4) 以公顷为单位,保留四位小数
计算几何属性
计算面积
!shape.area!
计算周长
!shape.length!
计算最大或最小 x,y 坐标
!shape.extent.xmax!
!shape.extent.xmin!
!shape.extent.ymax!
!shape.extent.ymin!
计算内部中心点坐标
(等同于面要素转点,同时要求内部)
!shape.centroid.x!
!shape.centroid.y!
计算质心点坐标
!shape.truecentroid.x!
!shape.truecentroid.y!
计算是否为多部件
!shape.ismultipart!
计算多部件个数
!shape.partcount!
计算折点个数
!shape.pointcount!