解析ArcGis的字段计算器(⼀)——数值型数据计算,从“⾯积
计算”开始
先来点⼉背景知识铺垫:
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:数值型与字符串型拼接的常见错误
不论在VBScript还是Python,"⾯积:"+1.2 这样的写法都是错误的。
+适⽤于字符串类型的连接,在VB中,字符串与数值连接可以使⽤ & ;⽽在Python中, "⾯积:"+str(1.2) 这样⼀个转换是必要的。
作者:yzhyingcool
ArcGis交流:
Blog:
获取图斑(⾯要素)⾯积:int函数与round函数
⾯积值是double型的,所以要放到Double型字段计算。
⽅法⼀:常⽤的,是在字段标题上右键——计算⼏何(Calculate Geometry)
⽅法⼆:使⽤Python语句的⽅式,在字段计算器中“解析语⾔”勾选Python,在语句块输⼊框填 !shape.area!
⽅法⼆中使⽤Python语句,在ArcMap中要素的⼀些⼏何(Geometry)属性,可以通过“!shape.?!”的⽅式进⾏计算,这个我们以后继续分解。
有“新来的”可能会遇到⾯积不能计算的情况,这⼀般是因为数据的空间参考没有设置好,⾄于“空间参考”是神马玩意,不知道的请百度或者发红包给作者,包教不会。
⾯积的单位转换(平⽅⽶转亩):直接[MJ]*0.0015
⾯积的舍⼊与取整:
1、舍⼊
⼀般我们会采⽤四舍五⼊的⽅式进⾏⼩数舍⼊,下⾯我们来贴图
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.2
32。
那么,怎么实现四舍五⼊呢?
①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函数处理后挂接回来。
2、取整
取整⼀般有两种,⼀种是直接取整数位,⼀种是舍⼊取整。
第⼀种在VBScript或者Python⾥都可以使⽤int函数实现
第⼆种使⽤round函数,这时候就有⽐较⼤的差距了。
题外话,再来点随机凑数
vb的随机数函数是rnd,它返回⼀个⼩于1,⼤于等于0的数
如果⽣成2-10之间的数,可以⽤ rnd()*2+8  不过有⼀个问题是它永远取不到10。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。