I'm trying to get this short con statement to work. In the comments was the previous author's code, but that didn't work for me so I changed it, and am getting an error (below). Any help is appreciated!
File "<string>", line 32, in <module>
File "C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\sa\Functions.py", line 1631, in Con
where_clause)
File "C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\sa\Utils.py", line 53, in swapper
result = wrapper(*args, **kwargs)
File "C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\sa\Functions.py", line 1615, in Wrapper
["IfThen", in_conditional_raster, in_true_raster_or_constant])
RuntimeError: The parameter is incorrect.
outcon = Con((Newflowdir ==1,1, Con(Newflowdir == 64,1, Con(Newflowdir ==16,1, Con(Newflowdir ==4,1)))),1.41421356237)
outcon.save(r'E:\NC Lidar NEW 03052021\SARP_NCGS_Data_Share_cms20210305\LiDar\knickpoints\dxraster.tif')
Solved! Go to Solution.
Hello,
I can suggest different approach to your question, but firstly, one error is comming from that you are trying to assign float (1.43...) and your raster might accept only integer...
as, your con expresion is quite complex, how about using 'raster-cell-iterator' and raster_info.
For example sth like this:
from arcpy.sa import *
myRas = Raster(r"C:\Temp\flow_direction_raster")
#get raster information
rasInfo = myRas.getRasterInfo()
#get pixel type
print(rasInfo.getPixelType())
#in rasinfo object change one parameter - pixel type
rasInfo.setPixelType("F32")
# now create new, empty raster, but with defined extent, pixel type...
new_raster = Raster(rasInfo)
#run calculation to update values to new raster
with RasterCellIterator({'rasters':[myRas, new_raster]}) as rci:
for i,j in rci:
if myRas[i,j] in [1, 64, 16, 4]:
new_raster[i,j] = 1
else:
new_raster[i,j] = 1.41421356237
# save new raster to your disk
new_raster.save(r'C:\Temp\test')
Quick look
# Newflowdir == A
Con( A == 1, 1, Con(A == 64, 1, Con(A ==16, 1, Con(A == 4, 1.41421356237))))
Too many brackets... Were you just adding them until syntax errors vanished?
Lol maybe I was..... my hangup is that I need the 1.41 to be the false value for all of them. So then when I do this, I get another error.
outcon = Con(Newflowdir ==1,1,1.41421356237, Con(Newflowdir == 64,1,1.41421356237, Con(Newflowdir ==16,1,1.41421356237, Con(Newflowdir ==4,1,1.41421356237))))
outcon.save(r'E:\NC Lidar NEW 03052021\SARP_NCGS_Data_Share_cms20210305\LiDar\knickpoints\dxraster.tif')
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\sa\Functions.py", line 1631, in Con
where_clause)
File "C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\sa\Utils.py", line 53, in swapper
result = wrapper(*args, **kwargs)
File "C:\Program Files\ArcGIS\Pro\Resources\ArcPy\arcpy\sa\Functions.py", line 1618, in Wrapper
["IfThenElse", in_conditional_raster, in_true_raster_or_constant, in_false_raster_or_constant])
RuntimeError: The parameter is incorrect.
Are you using the Con tool in arctoolbox or trying it in code? (use the toolbox)
It also looks like you would be probably be better off reclassing the flow direction values that equal (1, 4, 16, 64) to 1 and everything else as 1.41421....)
Hello,
I can suggest different approach to your question, but firstly, one error is comming from that you are trying to assign float (1.43...) and your raster might accept only integer...
as, your con expresion is quite complex, how about using 'raster-cell-iterator' and raster_info.
For example sth like this:
from arcpy.sa import *
myRas = Raster(r"C:\Temp\flow_direction_raster")
#get raster information
rasInfo = myRas.getRasterInfo()
#get pixel type
print(rasInfo.getPixelType())
#in rasinfo object change one parameter - pixel type
rasInfo.setPixelType("F32")
# now create new, empty raster, but with defined extent, pixel type...
new_raster = Raster(rasInfo)
#run calculation to update values to new raster
with RasterCellIterator({'rasters':[myRas, new_raster]}) as rci:
for i,j in rci:
if myRas[i,j] in [1, 64, 16, 4]:
new_raster[i,j] = 1
else:
new_raster[i,j] = 1.41421356237
# save new raster to your disk
new_raster.save(r'C:\Temp\test')