先来点儿背景知识铺垫:python
ArcMap的字段计算器提供了两种脚本语言的支持用以计算,两种脚本语言是VBScript与Python。编程
多数人选择使用前者,由于它的基本函数和Excel的函数貌似同样。注意我这里用了一个“貌似”,虽然Excel函数与VB函数有着千丝万缕的关系,但它毕竟不是VB函数(ArcMap里用VBScript),把Excel函数照搬进ArcMap的计算器,许可能是不能够运行的。使用VBScript函数正确的打开方式应该是查询VBScript帮助。至于VB、VBA、VBScript啥关系,不讲。编程语言
在ArcMap的字段计算器里,VBScript语句中字段(Field)应该用“[field_Name]”的样式输入,Python语句中字段应该用“!field_Name!”的样式输入。(提醒“新来的”,①不要把这玩意儿“”抄过去,②全部符号应为英文的)。函数
Tip:数值型与字符串型拼接的常见错误spa
不论在VBScript仍是Python,"面积:"+1.2 这样的写法都是错误的。code
+适用于字符串类型的链接,在VB中,字符串与数值链接可使用 & ;而在Python中, "面积:"+str(1.2) 这样一个转换是必要的。orm
做者:yzhyingcool
ArcGis交流群:
Blog:https://www.cnblogs.com/yzhyingcool/blog
获取图斑(面要素)面积:ip
面积值是double型的,因此要放到Double型字段计算。字符串
方法一:经常使用的,是在字段标题上右键——计算几何(Calculate Geometry)
方法二:使用Python语句的方式,在字段计算器中“解析语言”勾选Python,在语句块输入框填 !shape.area!
方法二中使用Python语句,在ArcMap中要素的一些几何(Geometry)属性,能够经过“!shape.?!”的方式进行计算,这个咱们之后继续分解。
有“新来的”可能会遇到面积不能计算的状况,这通常是由于数据的空间参考没有设置好,至于“空间参考”是神马玩意,不知道的请百度或者发红包给做者,包教不会。
面积的单位转换(平方米转亩): 直接[MJ]*0.0015
面积的舍入与取整:
一、舍入
通常咱们会采用四舍五入的方式进行小数舍入,下面咱们来贴图
VBScript,使用round( [MJ],3)对面积字段的值取小数后3位,结果如图:
Python(ArcGis10.1使用Python2.7),使用round( !MJ! ,3)对面积字段的值取小数后3位,结果就不贴图了,和上边同样。
有点意思吧?和你想的结果同样吗?通常使用中这样不会有问题,下面部分是闲扯扩展,有兴趣可读。
在编程语言中小数舍入通常采用“四舍六入五凑双”的方式,说的通俗点就是看舍入位数以后的数
距离哪一个近就进位位给谁:
保留1位的话2.449是2.4 2.451是2.5
若是同样远(5),那就凑双数:
若是取3位,第4位是末位值为5,进位后第3位不是双数就不进,因此2.2325是2.232,而2.2315也是2.232。
那么,怎么实现四舍五入呢?
①VBScript用 FormatNumber( [MJ],3)试试;
②Python用下面的函数试试:
def getRound(val,n): """ :function:替换内置round函数,实现保留n位小数的精确四舍五入 :param val: 类型string或数值型 :param n: 须要保留小数的位数,要求大于0 :return: 四舍五入后的数据,类型string """ n = int(n) f = '{:.%sf}'%n return f.format(round(float(val) * pow(10,n)) / pow(10.0,n))
不知道怎么使用?给你个见下图
③肯定没问题的方法——Excel函数处理后挂接回来。
二、 取整
取整通常有两种,一种是直接取整数位,一种是舍入取整。
第一种在VBScript或者Python里均可以使用int函数实现
第二种使用round函数,这时候就有比较大的差距了。
题外话,再来点随机凑数
vb的随机数函数是rnd,它返回一个小于1,大于等于0的数
若是生成2-10之间的数,能够用 rnd()*2+8 不过有一个问题是它永远取不到10。