Python ArcGIS 字段计算器中的语法错误

Python Syntax error in ArcGIS field calculator

我一直无法获得一个简单的代码块,希望有人能找出问题所在。我觉得我瞎了。

1) 我在我的 ArcGIS 属性 table 中创建了一个名为 "SpeedLimit" 的新短整型字段,表示道路类型的速度限制。

2) 道路类型是在table 字段"fclass" 中找到的字符串。

我打开 SpeedLimit 字段的字段计算器并填写以下内容:

预逻辑脚本代码:

def Speed(class):
    if (class == ‘secondary’ or class == ‘tertiary’ or class == ‘trunk’ or class == ‘motorway’ or class == ‘primary’):
        return 70
    elif (class == ‘secondary_link’ or class == ‘tertiary_link’ or class == ‘trunk_link’ or class == ‘motorway_link’ or class == ‘primary_link’):
        return 45
    elif (class == ‘service’ or class == ‘track_grade1’ or class == ‘track_grade2’ or class == ‘track_grade3’ or class == ‘track_grade4’ or class == ‘track_grade5’):
        return 15       
    else:
        return 30

限速 =

Speed(!fclass!)

任何人都可以发现我做错了什么以收到语法错误吗?

编辑回复评论: 我收到来自 运行 更短更简单代码的错误:

def Speed(road):
    if (road == 'secondary'):   
        return 70
    else:
        return 30

** 答案** 我根本没有 select "Python" 单选按钮... 谢谢大家的帮助。

class 是 Python 中的保留字,因此您应该为参数选择一个不同的名称,例如 cls。此外,我不确定这是您的代码中的真正问题还是只是复制粘贴到 SO 的问题,引号字符是 ',而不是 。如果我们把它们放在一起,这段代码应该可以正常工作:

def speed(cls):
    if (cls == 'secondary' or cls == 'tertiary' or cls == 'trunk' or cls == 'motorway' or cls == 'primary'):
        return 70
    elif (cls == 'secondary_link' or cls == 'tertiary_link' or cls == 'trunk_link' or cls == 'motorway_link' or cls == 'primary_link'):
        return 45
    elif (cls == 'service' or cls == 'track_grade1' or cls == 'track_grade2' or cls == 'track_grade3' or cls == 'track_grade4' or cls == 'track_grade5'):
        return 15       
    else:
        return 30

你可能想要这个:

def speed(aClass):
    if (aClass == 'secondary' or aClass == 'tertiary' or aClass == 'trunk' or aClass == 'motorway' or aClass == 'primary'):
        return 70
    elif (aClass == 'secondary_link' or aClass == 'tertiary_link' or aClass == 'trunk_link' or aClass == 'motorway_link' or aClass == 'primary_link'):
        return 45
    elif (aClass == 'service' or aClass == 'track_grade1' or aClass == 'track_grade2' or aClass == 'track_grade3' or aClass == 'track_grade4' or aClass == 'track_grade5'):
        return 15       
    else:
        return 30

fclass = 'tertiary_link'

print(speed(fclass))

但在 Python 中更优雅:

def speed(aClass):
    if aClass in ['secondary', 
                  'tertiary', 
                  'trunk', 
                  'motorway', 
                  'primary']:
        return 70

    if aClass in ['secondary_link', 
                  'tertiary_link', 
                  'trunk_link', 
                  'motorway_link', 
                  'primary_link']:
        return 45

    if aClass in ['service',
                  'track_grade1', 
                  'track_grade2',
                  'track_grade3',  
                  'track_grade4', 
                  'track_grade5']:
        return 15 

    else:
        return 30


fclass = 'tertiary_link'    # Only for testing

print(speed(fclass))

请注意 elif 我使用 if 作为每个分支 returns 的值(因此跳过下一个语句)。