Skip to content

Specify merging mode

5 messages · Etienne Bellemare Racine, Robert J. Hijmans

#
Dear Etienne,

This is not in raster (as a single function) but it is a good idea
that I'll look at (and merge needs to be improved for speed also). A
function that would blend overlapping layers based on distance to
their edges would also be useful.

Here are two ways in which you can accomplish what you asked for:

r <- raster()
r1 <- crop(r, extent(-10, 10, -10, 10))
r2 <- crop(r, extent(0, 20, 0, 20))

r1[] <- 1:ncell(r1)
r2[] <- 1:ncell(r2)

# the trick, first merge with empty RasterLayers
r1 <- merge(r1, raster(r2))
r2 <- merge(raster(r1), r2)

# Now combine with a function
rm = mean(r1, r2, na.rm=TRUE)
plot(rm)


# alternative solution:

r <- raster()
r1 <- crop(r, extent(-10, 10, -10, 10))
r2 <- crop(r, extent(0, 20, 0, 20))
r1[] <- 1:ncell(r1)
r2[] <- 1:ncell(r2)

x = (r1 + r2) / 2   # this returns the spatial intersection or r1 & r2
rm = merge(x, r1, r2)
plot(rma)

Robert


On Mon, Mar 29, 2010 at 1:39 PM, Etienne Bellemare Racine
<etiennebr at gmail.com> wrote:
#
Thanks Robert,

 From what you showed, I tried to wrap the operations in a generic 
function for my own purpose, but I don't know why, I can only apply some 
functions e.g. a mean function is ok, but not a max function. Could you 
point what's wrong ? What's the better way to apply a function to a 
raster list ? My problem is that I have a variable number of rasters to 
merge.

r <- raster()
r1 <- crop(r, extent(-10, 10, -10, 10))
r2 <- crop(r, extent(0, 20, 0, 20))
r3 <- crop(r, extent(10, 30, 10, 30))

r1[] <- 1:ncell(r1)
r2[] <- 1:ncell(r2)
r3[] <- 1:ncell(r3)

fmerge <- function(rasters, fun, ...){
    ex <- raster(unionExtent(rasters))
    res(ex) <- res(rasters[[1]])
    ex[] <- NA
   
    for( i in 1:length(rasters) )
        rasters[[i]] <- merge(rasters[[i]], ex)
   
    do.call( fun, c(rasters, ...) )
}

rfm <- fmerge(rasters, mean, na.rm=T)  #ok
rfx <- fmerge(rasters, max, na.rm=T)   #wrong

Etienne

Robert J. Hijmans wrote :
#
A correction to my previous example, a line was missing :

Thanks (again) Robert,

 From what you showed, I tried to wrap the operations in a generic 
function for my own purpose, but I don't know why, I can only apply some 
functions e.g. a mean function is ok, but not a max function. Could you 
point what's wrong ? What's the better way to apply a function to a 
raster list ? My problem is that I have a variable number of rasters to 
merge.

r <- raster()
r1 <- crop(r, extent(-10, 10, -10, 10))
r2 <- crop(r, extent(0, 20, 0, 20))
r3 <- crop(r, extent(10, 30, 10, 30))

r1[] <- 1:ncell(r1)
r2[] <- 1:ncell(r2)
r3[] <- 1:ncell(r3)
rasters <- list(r1, r2, r3)

fmerge <- function(rasters, fun, ...){
   ex <- raster(unionExtent(rasters))
   res(ex) <- res(rasters[[1]])
   ex[] <- NA
     for( i in 1:length(rasters) )
       rasters[[i]] <- merge(rasters[[i]], ex)
     do.call( fun, c(rasters, ...) )
}

rfm <- fmerge(rasters, mean, na.rm=T)  #ok
rfx <- fmerge(rasters, max, na.rm=T)   #wrong

Etienne
1 day later
#
Etienne,

This is an interesting problem. I do not know what is going on, but
have insufficient time to study this right now.

This slightly adjusted code works in unexpected ways:

fmerge <- function(rasters, fun, ...){
	ex <- raster(unionExtent(rasters))	
	res(ex) <- res(rasters[[1]])
	for( i in 1:length(rasters) )
		rasters[[i]] <- merge(rasters[[i]], ex)
	fun(rasters[[1]], rasters[-1], na.rm=TRUE)  # to force the first
argument to be a RasterLayer object
}

rfmn <- fmerge(rasters, fun=mean, na.rm=T) ? #works
rfx <- fmerge(rasters, fun=max, na.rm=T) ? #wrong
fun = max
rfx <- fmerge(rasters, fun=max, na.rm=T) ? #works
rfn <- fmerge(rasters, fun=min, na.rm=T) ? #works, but still returns max !
fun = min
rfn <- fmerge(rasters, fun=min, na.rm=T) ? #works

So something or other that is different in the environment of the
function fmerge...  I suspect it has something to do with mean being a
normal generic while min and max are primitive functions and part of a
group-generic.


This is an alternative approach that I believe does work:

fmerge <- function(rasters, fun, ...){
	ex <- raster(unionExtent(rasters))
	res(ex) <- res(rasters[[1]])
	for( i in 1:length(rasters) )
	? 	rasters[[i]] <- merge(rasters[[i]], ex)
	rasters <- stack(rasters)
	fun(rasters, ...)
}

rfm <- fmerge(rasters, mean, na.rm=T) ?#ok
rfx <- fmerge(rasters, max, na.rm=T) ? #wrong


Also, I have now added a function 'mosaic' in raster (version 1.0.0-6)
that does this (merging with a function). mosaic() should make the
above functions redundant, but I would like to figure out what's going
on nevertheless. Ideas, anyone?

Robert







1.0.0-6

On Tue, Mar 30, 2010 at 8:32 AM, Etienne Bellemare Racine
<etiennebr at gmail.com> wrote: