Last active
July 6, 2018 05:09
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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