[R-sig-Geo] How to apply this function on each raster stack layer?

Dutrieux, Loic loic.dutrieux at wur.nl
Fri Feb 6 09:06:55 CET 2015


Hi Thiago,

The approach you took seems correct. See example below.

library(raster)
fn <- system.file("external/test.grd", package="raster")
s  <- stack(fn, fn)

# And these are sample coefficients:
mult <- c(0.0003342, 0.0005534) 
add  <- c(0.1, 0.2) 

# define calc function
fun <- function(x) {
    y <- x * mult + add
    return(y)
}

out <- calc(x = s, fun = fun)

# For each band individually
s2 <- s
s2[[1]] <- (s2[[1]] * mult[1]) + add[1]
s2[[2]] <- (s2[[2]] * mult[2]) + add[2]

all.equal(out, s2)


Best regards,
---
Loïc Dutrieux
PhD student
Laboratory of Geo Information Science and Remote Sensing
Wageningen University
The Netherlands
________________________________________
From: R-sig-Geo <r-sig-geo-bounces at r-project.org> on behalf of Frede Aakmann Tøgersen <frtog at vestas.com>
Sent: Friday, February 6, 2015 7:25 AM
To: Thiago V. dos Santos; R-SIG list
Subject: Re: [R-sig-Geo] How to apply this function on each raster stack layer?

Hi Thiago

I think that the forceapply argument of calc() is what you need; see ?calc. Here is the relevant part from the man:

     The intent of some functions can be ambiguous. Consider:

     'library(raster)'

     'r <- raster(volcano)'

     'calc(r, function(x) x * 1:10)'

     In this case, the cell values are multiplied in a vectorized
     manner and a single layer is returned where the first cell has
     been multiplied with one, the second cell with two, the 11th cell
     with one again, and so on. But perhaps the intent was to create 10
     new layers ('x*1, x*2, ...')? This can be achieved by using
     argument 'forceapply=TRUE'

     'calc(r, function(x) x * 1:10), forceapply=TRUE'


Yours sincerely / Med venlig hilsen


Frede Aakmann Tøgersen
Specialist, M.Sc., Ph.D.
Plant Performance & Modeling

Technology & Service Solutions
T +45 9730 5135
M +45 2547 6050
frtog at vestas.com
http://www.vestas.com

Company reg. name: Vestas Wind Systems A/S
This e-mail is subject to our e-mail disclaimer statement.
Please refer to www.vestas.com/legal/notice
If you have received this e-mail in error please contact the sender.


> -----Original Message-----
> From: R-sig-Geo [mailto:r-sig-geo-bounces at r-project.org] On Behalf Of
> Thiago V. dos Santos
> Sent: 5. februar 2015 19:22
> To: R-SIG list
> Subject: [R-sig-Geo] How to apply this function on each raster stack layer?
>
> Hi all,
>
> I am trying to write an efficient script to calibrate hundreds of Landsat 8
> images. At a certain point of the calibration steps, I need to apply some
> coefficients in each layer of a raster stack.
>
>
> This is one sample stack:fn <- system.file("external/test.grd",
> package="raster")
>
> s  <- stack(fn, fn)
>
> And these are sample coefficients:
> mult <- c(0.0003342, 0.0005534)
> add  <- c(0.1, 0.2)
>
>
> What I need to is to apply each index of the coefficients to the
> correspondent index of the stack layer, like in this example:
>
> s[[1]] <- (s[[1]] * mult[1]) + add[1]
> s[[2]] <- (s[[2]] * mult[2]) + add[2]
>
> This is my poor attempt, which obviously does not work:
>
> cal.fun <- function(x) {
> x <- (x * mult) + add
> }
>
> s.cal <- calc(s, cal.fun, progress='text')
>
>
> Any ideas on how to do that?
>
> Many thanks,
> --
> Thiago V. dos Santos
> PhD student
> Land and Atmospheric Science
> University of Minnesota
> http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSa
> ntos/index.htm
> Phone: (612) 323 9898
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo

_______________________________________________
R-sig-Geo mailing list
R-sig-Geo at r-project.org
https://stat.ethz.ch/mailman/listinfo/r-sig-geo



More information about the R-sig-Geo mailing list