import arcpy
from arcpy import env
env.workspace = r"C:\temp\python\test.gdb"
lstFCs = arcpy.ListFeatureClasses("*")
for fc in lstFCs:
rows = arcpy.UpdateCursor(fc)
try:
for row in rows:
if row.Value >= 0.0 and row.Value <= 0.2:
row.Class = 1
if row.Value > 0.2 and row.Value <= 0.4:
row.Class = 2
if row.Value > 0.4 and row.Value <= 0.6:
row.Class = 3
if row.Value > 0.6 and row.Value <= 0.8:
row.Class = 4
if row.Value > 0.8 and row.Value <= 1.0:
row.Class = 5
if row.Value > 1.0 and row.Value <= 1.2:
row.Class = 4
if row.Value > 1.2 and row.Value <= 1.4:
row.Class = 3
if row.Value > 1.4 and row.Value <= 1.6:
row.Class = 2
if row.Value > 1.6 and row.Value <= 2.0:
row.Class = 1
rows.updateRow(row)
except RuntimeError:
pass
del row, rows
Pre-Logic Script Code: classBreaks = [0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 2] # defines where the values for the breaks are classVals = [1, 2, 3, 4, 5, 4, 3, 2, 1] # what should be returned - corresponds to the position of the value in classBreaks def calc(x): # function that does the calculation '''calc(x) iterates through the classBreaks until it finds the bounding values of the input number, then returns the corresponding value from classVals ''' for i in xrange(len(classBreaks)-1): if classBreaks <= x < classBreaks[i+1]: return classVals elif x == classBreaks[-1]: # x equals the last value - wouldn't work above, as it is less than... return classVals[-1] return None # return something if the value isn't within the range, can be whatever you want - None will be converted to Arc NULL, but you could have 'No Class' or something like that, if you wanted... ClassField= calc(!Value!)
import arcpy
classBreaks = [0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 2] # defines where the values for the breaks are
classVals = [1, 2, 3, 4, 5, 4, 3, 2, 1] # what should be returned - corresponds to the position of the value in classBreaks
def calc(x): # function that does the calculation
'''calc(x) iterates through the classBreaks until it finds the bounding values of the input number, then returns the corresponding value from classVals
'''
for i in xrange(len(classBreaks)-1):
if classBreaks <= x < classBreaks[i+1]:
return classVals
elif x == classBreaks[-1]: # x equals the last value - wouldn't work above, as it is less than...
return classVals[-1]
return None # return something if the value isn't within the range, can be whatever you want - None will be converted to Arc NULL, but you could have 'No Class' or something like that, if you wanted...
arcpy.env.workspace = r"C:\temp\python\test.gdb"
listFCs = arcpy.ListFeatureClasses("*")
for fc in listFCs:
rows = arcpy.UpdateCursor(fc)
for row in rows:
row.ClassField = calc(row.Value)
rows.updateRow(row)
del row, rows
del row, rows
try: del row except NameError: pass del rows
# presumably you are bringing in other variables, you only mentioned 0 then jumped to 3 - the parameter numbers must go up in order... classBreaks_str = gp.GetParameterAsText(3) # Break values (comma separated values) classValues_str = gp.GetParameterAsText(4) # Classes (comma separated values) to be returned, must correspond with the Break values valueField = gp.GetParameterAsText(5) # Field to be calculated on classField = gp.GetParameterAsText(6) # Field for results to go in
classBreaks_str = '[' + classBreaks_str + ']' # add square brackets, so they look like lists
classValues_str = '[' + classValues_str + ']'
try: classBreaks = eval(classBreaks_str)
except SyntaxError: arcpy.AddError('Class Breaks was entered incorrectly; values must each seperated by a comma.')
except NameError: arcpy.AddError('Class Breaks was entered incorrectly; values must either be numbers or, if strings, within quotes.')
try: classValues = eval(classValues_str) # I called this classVals in the previous post
except SyntaxError: arcpy.AddError('Class Values was entered incorrectly; values must each seperated by a comma.')
except NameError: arcpy.AddError('Class Values was entered incorrectly; values must either be numbers or, if strings, within quotes.')
if len(classBreaks) != len(classValues):
arcpy.AddError('Class Values and Class Breaks must be the same length.')
# rest of processing (previous posts) goes here...
import arcpy
import arcgisscripting
gp = arcgisscripting.create()
Feature_Class = gp.GetParameterAsText(0) # Location of Geodatabase
classBreaks_str = gp.GetParameterAsText(1) # Break values (comma separated values)
classValues_str = gp.GetParameterAsText(2) # Classes (comma separated values) to be returned, must correspond with the Break values
valueField = gp.GetParameterAsText(3) # Field to be calculated on
classField = gp.GetParameterAsText(4) # Field for results to go in
classBreaks_str = '[' + classBreaks_str + ']' # add square brackets, so they look like lists
classValues_str = '[' + classValues_str + ']'
try: classBreaks = eval(classBreaks_str)
except SyntaxError: arcpy.AddError('Class Breaks was entered incorrectly; values must each seperated by a comma.')
except NameError: arcpy.AddError('Class Breaks was entered incorrectly; values must either be numbers or, if strings, within quotes.')
try: classValues = eval(classValues_str) # I called this classVals in the previous post
except SyntaxError: arcpy.AddError('Class Values was entered incorrectly; values must each seperated by a comma.')
except NameError: arcpy.AddError('Class Values was entered incorrectly; values must either be numbers or, if strings, within quotes.')
if len(classBreaks) != len(classValues):
arcpy.AddError('Class Values and Class Breaks must be the same length.')
def calc(x): # function that does the calculation
'''calc(x) iterates through the classBreaks until it finds the bounding values of the input number, then returns the corresponding value from classVals
'''
for i in xrange(len(classBreaks)-1):
if classBreaks <= x < classBreaks[i+1]:
return classValuess
elif x == classBreaks[-1]: # x equals the last value - wouldn't work above, as it is less than...
return classValues[-1]
return None # return something if the value isn't within the range, can be whatever you want - None will be converted to Arc NULL, but you could have 'No Class' or something like that, if you wanted...
listFCs = arcpy.ListFeatureClasses("*")
for fc in listFCs:
rows = arcpy.UpdateCursor(fc)
for row in rows:
row.classField = calc(row.valueField)
rows.updateRow(row)
try: del row
except NameError: pass
del rows
<type 'exceptions.RuntimeError'>: Row: Field valueField does not exist Failed to execute (Classify)
import arcpy
def calc(x): # function that does the calculation
'''calc(x) iterates through the classBreaks until it finds the bounding values of the input number, then returns the corresponding value from classVals
'''
for i in xrange(len(classBreaks)-1):
if classBreaks <= x < classBreaks[i+1]:
return classValues
elif x == classBreaks[-1]: # x equals the last value - wouldn't work above, as it is less than...
return classValues[-1]
return None # return something if the value isn't within the range, can be whatever you want - None will be converted to Arc NULL, but you could have 'No Class' or something like that, if you wanted...
Geodatabase = arcpy.GetParameterAsText(0) # Location of Geodatabase
classBreaks_str = arcpy.GetParameterAsText(1) # Break values (comma separated values)
classValues_str = arcpy.GetParameterAsText(2) # Classes (comma separated values) to be returned, must correspond with the Break values
valueField = arcpy.GetParameterAsText(3) # Field to be calculated on
classField = arcpy.GetParameterAsText(4) # Field for results to go in
classBreaks_str = '[' + classBreaks_str + ']' # add square brackets, so they look like lists
classValues_str = '[' + classValues_str + ']'
try: classBreaks = eval(classBreaks_str)
except SyntaxError: arcpy.AddError('Class Breaks was entered incorrectly; values must each seperated by a comma.')
except NameError: arcpy.AddError('Class Breaks was entered incorrectly; values must either be numbers or, if strings, within quotes.')
try: classValues = eval(classValues_str)
except SyntaxError: arcpy.AddError('Class Values was entered incorrectly; values must each seperated by a comma.')
except NameError: arcpy.AddError('Class Values was entered incorrectly; values must either be numbers or, if strings, within quotes.')
if len(classBreaks) != len(classValues):
arcpy.AddError('Class Values and Class Breaks must be the same length.')
arcpy.env.workspace = Geodatabase # set the workspace
listFCs = arcpy.ListFeatureClasses('*')
for fc in listFCs:
rows = arcpy.UpdateCursor(fc)
for row in rows:
row.setValue(classField, calc(row.getValue(valueField))) # looks complex, but is just getting the value from valueField, passing it to CALC then writing the output to the classField
rows.updateRow(row)
try: del row
except NameError: pass
del rows