I've been unable to get a simple block of code and am hoping someone can spot what is wrong. I feel like I'm blind.
1) I create a new short integer field called "SpeedLimit" in my ArcGIS attribute table that signifies the speed limit for a road type.
2) The road type is a string found in the field "fclass" in the same table.
I open the field calculator for the SpeedLimit field and fill the following:
Pre-Logic Script Code:
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
SpeedLimit =
Speed(!fclass!)
Can anyone spot what I'm doing wrong to receive a syntax error?
Edit in response to the comments: I am receiving the error from running a shorter and simpler code:
def Speed(road):
if (road == 'secondary'):
return 70
else:
return 30
** THE ANSWER** I simply did not select the "Python" radio button... Thank you all for your assistance.
You probably wanted this:
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))
but in Python is more elegant this:
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))
Note that instead elif
I used if
as every your branch returns a value (so the next statements are skipped).