2011-07-27 92 views
0

我試圖做一個簡單的計算領域在ArcGIS 9.3:如何將列字段轉換成一個列表

New field = Old field - Old field(first value) 

這在計算域與Python代碼應該是

表達:!Old field! - first

代碼塊:list= [AngOriz] first = list[0]

的錯誤是

ERROR 000539: Runtime error : name 'AngOriz' is not defined Failed to execute (Calculate Field). 

如何將列字段轉換爲列表?


我已經試過這樣

表達:

makeCalc(!AngOriz!, !AngOriz!) 

代碼塊:

def makeCalc(x, y): 
    first_value = y.split(' , ')[0] 
    return x-first_value 

,但我仍然得到:

錯誤000539:運行表達式時出錯:makeCalc(43.01841,43.01841):'float'對象沒有屬性'split'無法執行(計算字段)。

我需要計算的列的值,並且在同一列中的第一個值(值浮動點)之間的差異。 目的是計算滑坡上不同測點的位移。

回答

0

我沒有得到整個圖片,你是什麼意思由舊領域(第一值)?是舊字段的文本字段上有多個值的逗號或類似的東西分隔?如果是這樣,那麼在此之前如何使用Old Field?

但無論如何,你得到的錯誤是因爲在代碼塊中你還沒有定義AngOriz ...做你想做的事情的最好方法是在一個函數內部,它獲得必要的值與作爲參數的工作,並將其值返回到外地,這裏是一個例子:

在表達式字段:

my_function(!Old field!, !some_other_field!) 

並在代碼塊:

def my_function(old_field, other_field): 
    # supposing other_field is a list of int-values in a string = "1, 23, 5" 
    first_value = int(other_field.split(', ')[0]) 
    return old_field - first_value 
0
小號

因爲需要很長時間才能回答。有一個忙碌的一週:-)好吧,我以爲你的意思是一個字符串字段,而不是一個浮動字段,所以忘記拆分的東西。我在上面留下了答案,因爲它可以幫助其他人尋找如何將(字符串)字段轉換爲列表並將其值用於字段計算。

如果我現在得到這個,你的意思是AngOriz第一列的值,對不對?所以,如果這個值不改變,那麼就用它「硬編碼」在這樣的功能:

的表達式字段:

my_function(!AngOriz!) 

,並在代碼塊:

def my_function(old_field):   
    return old_field - 34.123 # just type the value of the first row here 

如果你不想「硬編碼」的第一行的值,那麼你就必須以某種方式獲取,但我不知道你怎麼能做到這一點在球場上的計算器。可能你必須以完全不同的方式解決這個問題。使用arcpy左右的腳本。

更新: 也有使用領域內的計算器全局變量的可能性 - 這意味着,在函數調用之間的持久變量。因爲該函數被字段計算器調用,每個行都有函數調用,通常函數內的所有變量在調用之間「死亡」,所以不可能在局部變量上「記住」某些東西。但是您可以使用全局變量來保存第一行的值,並將其用於其他以下調用。我還沒有嘗試過,但也許像這樣的工作:

firstValue = None 
def my_function(old_field): 
    global firstValue 
    if firstValue == None: # this will be true only if this is the first call/row ... 
     firstValue = old_field # ... save the value on the global variable 
    return old_field - firstValue