我正在尝试使用ArcGIS 9.3进行简单的字段计算:
New field = Old field - Old field(first value)
在使用python代码的Calculate Field中的应该是
表达式:!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'执行失败(Calculate Field)。
我需要计算列值和同一列的第一个值之间的差值(值是浮点值)。 目的是计算滑坡上不同测量点的位移。
答案 0 :(得分:0)
我没有全面了解,Old field(第一个值)是什么意思?旧字段是一个文本字段,上面有多个值,用逗号或类似的东西分隔?如果是这样,你之前怎么使用Old field?
但是无论如何,你得到的错误是因为在代码块中你还没有定义AngOriz ...你想要做的最好的方法是在函数内部,它获得必要的值使用as参数,并将值返回到字段,这是一个示例:
表达式字段上的:
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
答案 1 :(得分: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