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