2011-07-27 89 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