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