Skip to content

Instantly share code, notes, and snippets.

@scbrown86
Last active July 6, 2018 05:09
Show Gist options
  • Save scbrown86/795b51aaa8421439c75deb92f155906d to your computer and use it in GitHub Desktop.
Save scbrown86/795b51aaa8421439c75deb92f155906d to your computer and use it in GitHub Desktop.
Functions for rescaling a multiband rasterstack or raster layer to an arbitrary range
# Functions for rescaling layers/stacks
## Cleaned up/edited the source code for sdvmspecies library (https://cran.r-project.org/web/packages/sdmvspecies/index.html)
rescaleLayer <- function(raster.layer) {
new.min <- 0; new.max <- 1 ## change for different output range (e.g. 0-255)
min.value <- cellStats(raster.layer, min, na.rm = TRUE)
max.value <- cellStats(raster.layer, max, na.rm = TRUE)
raster.layer <- new.min + (raster.layer - min.value) * ((new.max - new.min) / (max.value - min.value))
return(raster.layer)
}
rescaleStack <- function(raster.stack) {
raster.name <- names(raster.stack)
raster.stack.list <- lapply(X = raster.name, FUN = function(name, raster.stack) {
return(rescaleLayer(raster.stack[[name]]))}, raster.stack)
result.stack <- stack(raster.stack.list)
names(result.stack) <- raster.name
return(result.stack)
}
rescale <- function(raster.object) {
if (!(class(raster.object) %in% c("RasterLayer", "RasterStack"))) {
stop("raster.object needs to be a RasterLayer or RasterStack object!\nraster.object is a ", class(raster.object)[1])
}
if (class(raster.object) %in% "RasterLayer") {
raster.object <- rescaleLayer(raster.object)
} else {
raster.object <- rescaleStack(raster.object)
}
return(raster.object)
}
## Example ##
# library(raster)
# slogo <- stack(system.file("external/rlogo.grd", package="raster"))
# plot(slogo, col = topo.colors(101))
#
# ## rescale a raster stack
# slogoRS <- rescale(slogo)
# plot(slogoRS, col = topo.colors(101))
#
# ## rescale a single layer
# slogo_1_rs <- rescale(slogo[[1]])
# plot(slogo_1_rs, col = topo.colors(101))
#
# ## fails
# slogoB <- brick(slogo)
# slogoB_RS <- rescale(slogoB)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment