我正在尝试在属性表中创建和计算名为Score的字段。分数取决于另外两个领域,宽度和类别。宽度包含整数值,类别包含文本。分数字段应根据这两个字段的值分配多个点。
我能够根据Width的值编写一个Python脚本为SCORE赋值。但是,一旦我尝试添加Category作为参数,我不断收到错误消息,说明参数无效。
以下代码有效(仅限宽度):
expression = "getClass(float(!Width!))"
codeblock = """def getClass(wd):
if wd<=450:
return 1
elif wd>450 and wd<900:
return 2
else:
return 3"""
arcpy.AddField_management("featurelayer", "Score", "SHORT")
此代码包含类别作为参数但不起作用:
expression = "getClass(!Width!,!Category!)"
codeblock = """def getClass(wd,cat):
if wd<=35:
return 1
elif wd<90 and cat=='RED':
return 2
else:
return 3"""
arcpy.AddField_management("featurelayer", "Score", "SHORT")
谢谢!
***我确实尝试在第二个代码中转换两个参数 - 我为它们尝试了float(),以及类别的str(),因为它是一个文本字段。两个都没有工作,并且错误消息不是非常具体:“未能执行getClass()”
***类别字段已完全填充(“红色”或“蓝色”)
答案 0 :(得分:0)
在ArcMap的字段计算器中使用表达式和代码块方法是必要的,但在编写Python脚本时则不需要。
Try an UpdateCursor instead.它更容易阅读,因此更容易调试。
arcpy.AddField_management("featurelayer", "Score", "SHORT")
updateFields = ["Width", "Category", "Score"]
with arcpy.da.UpdateCursor("featurelayer", updateFields) as cursor:
for row in cursor:
if row[0] <= 35:
row[2] = 1
elif row[0] < 90 and row[1] == 'RED':
row[2] = 2
else:
row[2] = 3
cursor.updateRow(row)