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。

  • 相关阅读:
    HDU 2236 无题Ⅱ
    Golden Tiger Claw(二分图)
    HDU 5969 最大的位或 (思维,贪心)
    HDU 3686 Traffic Real Time Query System (图论)
    SCOI 2016 萌萌哒
    Spring Boot支持控制台Banner定制
    构建第一个Spring Boot程序
    Spring Boot重要模块
    Java fastjson JSON和String互相转换
    BCompare 4 Windows激活方法【试用期30天重置】
  • 原文地址:https://www.cnblogs.com/yzhyingcool/p/10071154.html
Copyright © 2011-2022 走看看