ArcGIS中的Python - 使用文本字段计算字段

0 投票
1 回答
2983 浏览
提问于 2025-04-17 20:47

我正在尝试在一个属性表中创建并计算一个叫做“得分”的字段。这个得分会根据另外两个字段来决定,分别是“宽度”和“类别”。“宽度”是整数值,而“类别”是文本。得分字段应该根据这两个字段的值来分配一定的分数。

我已经写了一个Python脚本,可以根据“宽度”的值来给得分赋值。但是,当我尝试把“类别”作为一个参数添加进去时,总是出现错误信息,提示参数无效。

下面的代码只使用了“宽度”,运行是成功的:

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()失败”

***“类别”字段已经完全填充(要么是'红色',要么是'蓝色')

1 个回答

0

在ArcMap的字段计算器中,使用表达式和代码块的方法是必须的,但在写Python脚本时就不需要这样做了。

可以试试UpdateCursor。 这样写起来更容易理解,也更容易找出问题。

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)

撰写回答