I am a novice in Python as well has having minimal experience with ArcMap. Currently I am using a U.S. Census TIGER file, mapping roads in Harris County, TX. I want to add a new field called SPEED, which will return a speed associated with the MTFCC string (MTFCC is the column which classifies road type. e.g. S1400, S1200, etc.).
I opened my attributes table, added a new field called SPEED, clicked on the Field Calculator of the speed column, and inserted my own Python code. I made sure to click Python (not VB), and have my return value be a number. My code is as follows...
def SpeedCalc(MTFCC):
if MTFCC == "S1400":
return 25
elif MTFCC == "S1200":
return 45
elif MTFCC == "S1100":
return 65
elif MTFCC == "S1630":
return 25
elif MTFCC == "S1730":
return 15
else:
return 9999
I made sure below where 'SPEED = ' is to have "SpeedCalc(!MTFCC!) written. No errors were thrown, but all my columns were listed as 0. I do not have administrative rights to my working computer or else I would insert my code in to Python first and see what is wrong. As far as I'm aware, my syntax is correct and the statement executes but nothing is done. MTFCC are listed as strings in the properties tab.
-
1Perhaps there are leading/trailing spaces, or maybe a case problem (python is case sensitive so 'S000' != 's000') try MTFCC = MTFCC.strip().upper() on the first line of your codeblock, like in stackoverflow.com/questions/1185524/…Michael Stimson– Michael Stimson2017年11月05日 21:42:47 +00:00Commented Nov 5, 2017 at 21:42
-
2Do you use SDE geodatabase? if your answer is Yes, do you have edit permission for this layer?BBG_GIS– BBG_GIS2017年11月05日 21:44:13 +00:00Commented Nov 5, 2017 at 21:44
-
1See if this feature class sits inside environment extent.FelixIP– FelixIP2017年11月05日 22:03:37 +00:00Commented Nov 5, 2017 at 22:03
-
1Make sure you haven't got a selection in the layer if you're in ArcMap. It is possible to have 0 features selected in a layer, in which case the calculation is done against 0 rows.. but that doesn't sound likely if you're getting 0 calculated into your values. Is your SPEED field numeric? If it is TEXT then you will need to quote the return values. I can see you've managed to avoid all the common traps for field calculations and it's still not working, is there any error messages in your results tab? If SDE and versioned are you in an edit session? Can you manually enter a value for one row?Michael Stimson– Michael Stimson2017年11月05日 22:40:43 +00:00Commented Nov 5, 2017 at 22:40
-
Welcome to GIS SE! As a new user please take the tour to learn about our focused Q&A format.Midavalo– Midavalo ♦2017年11月06日 15:24:20 +00:00Commented Nov 6, 2017 at 15:24
1 Answer 1
I have found that sometimes I need to include a single return
rather than in each if
/elif
/else
(I do not know why this is the case, but it has happened enough to now be my go to). Try setting a variable and returning just that variable at the end.
Codeblock:
def SpeedCalc(MTFCC):
x = 9999
if MTFCC == "S1400":
x = 25
elif MTFCC == "S1200":
x = 45
elif MTFCC == "S1100":
x = 65
elif MTFCC == "S1630":
x = 25
elif MTFCC == "S1730":
x = 15
return x
Expression:
SpeedCalc(!MTFCC!)
Alternatively create a python dictionary to store your lookup and return values, and return the values from that.
Codeblock:
def SpeedCalc(MTFCC):
myDict = {'S1400': 25, 'S1200': 45, 'S1100': 65, 'S1630': 25, 'S1730': 15}
x = 9999
if MTFCC in myDict:
x = myDict[MTFCC]
return x
Expression:
SpeedCalc(!MTFCC!)
A user tried to edit the answer with the following - I am including this as an additional option, however in my experience some python functions just don't work right in field calculator (as with the single vs multiple return
values above). Also I often prefer to have the additional lines, particularly for those new to python, as it's easier to read and understand what is actually happening in the code when learning.
def SpeedCalc(MTFCC):
myDict = {'S1400': 25, 'S1200': 45, 'S1100': 65, 'S1630': 25, 'S1730': 15}
return myDict.get(MTFCC, 9999)
Explore related questions
See similar questions with these tags.