解析ArcGis的字段計算器(一)——數值型數據計算,從「面積計算」開始

先來點兒背景知識鋪墊: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交流羣: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。

相關文章
相關標籤/搜索