zoukankan      html  css  js  c++  java
  • 解析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交流群:ArcGis交流群
    Blog:https://www.cnblogs.com/yzhyingcool/


    获取图斑(面要素)面积:

    面积值是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.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函数处理后挂接回来。

    2、 取整

    取整一般有两种,一种是直接取整数位,一种是舍入取整。

    第一种在VBScript或者Python里都可以使用int函数实现

    第二种使用round函数,这时候就有比较大的差距了。

    题外话,再来点随机凑数

    vb的随机数函数是rnd,它返回一个小于1,大于等于0的数

    如果生成2-10之间的数,可以用 rnd()*2+8   不过有一个问题是它永远取不到10。

  • 相关阅读:
    如何在SQL/400中计算两日期间的天数
    委托、事件与Observer设计模式
    C# 杂项
    泛型学习(二)
    委托
    操作符重载 (operator)
    一个解决方案多个项目
    将方法绑定到委托
    事件
    密封方法 密封类(sealed)
  • 原文地址:https://www.cnblogs.com/yzhyingcool/p/10071154.html
Copyright © 2011-2022 走看看