解析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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM