ArcGIS中欄位計算器的問題

2021-07-31 20:56:17 字數 2165 閱讀 8832

這幾天在給同門師兄處理乙個土地利用資料,需要將原先的分類轉換為另一種新的分類,其實就是根據乙個已經存在土地利用**生成新的字段,這個欄位是按照新的分類標準來組織,國內的的土地利用**有好幾套,比如二調的**體系和中科院的**體系,師兄由於研究的需要在此基礎還自己發展了一套新的地類編碼。所以有時候就需要在這幾套編碼之間進行轉換,師兄的資料是二調資料,就需要將編碼轉為自己發展的地類編碼,這裡就需要用到字段計算器。

傳統的方法是新增字段之後,選擇相應的**,在屬性表中,將其批量修改。這種方法適合於比較小的資料,不然速度很慢,尤其是二調資料這種乙個縣有幾十萬各圖斑的資料來說,選中和顯示對計算機的效能是乙個考驗。

當然arcgis的字段計算器的功能就是在這裡發揮出來,它支援vb和python兩種編碼語言,非常方便,對於熟悉excel和word巨集編寫的大神們來說使用vb就很便利,而arcgis的指令碼都是python,相信包括筆者在內的很多小夥伴都是用python吧,畢竟通用性最高。對於本文的問題,使用的是python的條件if函式,通過條件控制語句分別賦值,具體**如下:

> def

cal(x):

if x == "011":

return

"c1"

elif x == "013":

return

"c1"

elif x == "033":

return

"t1"

elif x == "031":

return

"t1"

elif x == "032":

return

"t1"

elif x == "021"

or x == "022"

or x == "023":

return

"t1"

elif x == "041"

or x == "042"

or x == "043":

return

"t1"

elif x == "101"

or x == "102"

or x == "103"

or x == "104"

or x == "105"

or x == "107":

return

"c2"

else:

return

"cc"

cal(!你的欄位名稱!)

這種條件賦值語句的用處很多,比如向量資料的重分類,各位小夥伴們可以盡情發揮自己聰明才智。然而,問題並沒有結束,而本文重點也就來了,在**執行過程中,出現了乙個前所未料的問題。 我們使用**先行轉換了其中一類(有林地),然後再去轉換其他類(水田)時,發現之前計算的有林地的結果消失了,屬性表中之前的計算部分顯示為空。幾次試驗發現,後一次計算時前一次的計算結果就會消失。如圖:

之前計算好的其他林地或者有林地就會消失,先計算水田,再計算其他類i,水田的計算結果也會消失,於是筆者開始腦補各種可能的問題,包括檔案格式,放在個人地理資料庫和檔案資料庫的區別,是否開啟編輯器,是否欄位太多,是否欄位名為中文或者太長,是否是軟體版本問題或者是電腦快取問題,逐一排除,結果仍未能找到問題所在。最後只有使出終極大殺招,在**中一次寫完所有的型別轉換,雖然**長度大幅增加,但問題解決了。

在此也希望看到部落格的小夥伴們能夠給出比較好的解決辦法或者指出問題的原因所在,如果有時候我們只需要對其中一部分要素進行重新賦值,不知怎麼解決。

文末提醒初學字段計算器python的小夥伴們,**塊的寫法和我們平時寫python稍有不同,**塊中不能出現欄位名稱,因為arcgis中欄位名稱用!!標註,而這不符合python語法,只能在計算語句中出現。還有就是結果變數不需要在**塊中定義,因為計算語句中就已經為結果變數定義啦。關於字段計算器的更多幫助可以看arcgis的官方幫助文件,裡面有很多案例,可以極大簡化我們工作量,提高工作效率!

arcgis欄位計算器例項

用python來寫arcgis的字段計算器,根據行政區劃來給字段賦值,python 要注意格式的問題,1.python與其他語言最大的區別就是,python的 塊不使用大括號 來控制類,函式以及其他邏輯判斷。python最具特色的就是用縮進來寫模組。縮排的空白數量是可變的,但是所有 塊語句必須包含相...

ArcGIS 柵格計算器

規定 表示此為可選引數 用 標識 未完 示例函式名稱 例子con con elevation 2000,elevation elevation 2000保留原值,不滿足條件為nodata isnull isnull raster setnull setnull raster raster value...

ArcGIS柵格計算器

柵格計算器能用好的話真的也是很強大 一,arcgis中柵格計算常用表示式 我自己遇到的差不多就這些 1 將特定值 9999 賦值為0 con raster 9999,0,raster 2 將某一範圍內 如小於0 賦值為0 con raster 0,0,raster 3 將特定的柵格值 如1 賦值為空...