I am trying to reclassify a raster object of altitude, in order for values >= 2300 to become 1 and < 2300 to become 0. (the object is Worldclim elevation 30s) I tried it on QGIS Raster calculator
"wc2.1_30s_elev@1" >= 2300
and the map it yielded was strange (strange negative numbers, and no apparent differentiation between > or < 2300. However, when I manually customized the labels to be 0 or 1, the map appeared to be correct. Also, the "Identify features" tool showed the correct values. But when I used this layer for an operation in Raster Calculator (my next step), the resulting layer showed the same problems.
So, I tried to do it in R. At first I tried
r[r < 2300] <- 0
r[r >= 2300] <- 1
But the same problem came up. So I tried raster::reclassify
reclass_df <- c(0, 2300, 0,
2301, 6651, 1)
reclass <- matrix(reclass_df,
ncol = 3,
byrow = TRUE)
r_reclassif <- reclassify(r, reclass)
And the strange values were not there anymore, but still the map showed no apparent differentiation between > or < 2300.
At first, it was only a visual problem. Plotting with a specified sequence of breaks seemed to do the task.
plot(r, col = color_palette, breaks = seq(0, 0.0109, length.out = 101))
But I need to do another step: a terra::xyFromCell using the raster as a probability argument. Then, the strange values and lack of discrimination between altitudes become a problem.
Could somebody help? I have no idea what's going on.
Example data
library(terra)
r <- rast(system.file("ex/elev.tif", package="terra"))
Which areas are higher than 400m? All you have to do is
x <- r > 400
plot(x)
Note that TRUE is equivalent to 1 and FALSE is equivalent to 0.
Alternatively, you can do
y <- classify(r, rbind(c(-Inf, 400, 0), c(400, Inf, 1)))
# or
z <- ifel(r < 400, 0, 1)
I note that in your use of raster::reclassify, you assume that zero is the lowest possible elevation. That is not correct.