Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Merging multiple rasters in R

I've been trying to find a time-efficient way to merge multiple raster images in R. These are adjacent ASTER scenes from the southern Kilimanjaro region, and my target is to put them together to obtain one large image.

This is what I got so far (object 'ast14dmo' representing a list of RasterLayer objects):

# Loop through single ASTER scenes for (i in seq(ast14dmo.sd)) {   if (i == 1) {     # Merge current with subsequent scene     ast14dmo.sd.mrg <- merge(ast14dmo.sd[[i]], ast14dmo.sd[[i+1]], tolerance = 1)   } else if (i > 1 && i < length(ast14dmo.sd)) {     tmp.mrg <- merge(ast14dmo.sd[[i]], ast14dmo.sd[[i+1]], tolerance = 1)     ast14dmo.sd.mrg <- merge(ast14dmo.sd.mrg, tmp.mrg, tolerance = 1)   } else {     # Save merged image     writeRaster(ast14dmo.sd.mrg, paste(path.mrg, "/AST14DMO_sd_", z, "m_mrg", sep = ""), format = "GTiff", overwrite = TRUE)   } } 

As you surely guess, the code works. However, merging takes quite long considering that each single raster object is some 70 mb large. I also tried Reduce and do.call, but that failed since I couldn't pass the argument 'tolerance' which circumvents the different origins of the raster files.

Anybody got an idea of how to speed things up?

like image 650
fdetsch Avatar asked Apr 08 '13 10:04

fdetsch


People also ask

Can you merge rasters?

Overview. The Merge Rasters function groups or merges a collection of rasters. Use this function when you have multiple rasters that you want treated as a single item, such as calculating the same statistics for all images, or when color balancing so you don't need to color balance each image separately.

How do I merge raster tiles?

Yes, if you have 2 or more individual raster tiles, you can use the Raster > Merge command to merge the tiles into one new image. In the Input Layers panel choose the tiles to Merge, by ticking them one by one or choosing Select All. Once you have chosen the tiles, choose Run.


2 Answers

You can use do.call

ast14dmo.sd$tolerance <- 1 ast14dmo.sd$filename <- paste(path.mrg, "/AST14DMO_sd_", z, "m_mrg.tif", sep = "") ast14dmo.sd$overwrite <- TRUE mm <- do.call(merge, ast14dmo.sd) 

Here with some data, from the example in raster::merge

r1 <- raster(xmx=-150, ymn=60, ncols=30, nrows=30) r1[] <- 1:ncell(r1) r2 <- raster(xmn=-100, xmx=-50, ymx=50, ymn=30) res(r2) <- c(xres(r1), yres(r1)) r2[] <- 1:ncell(r2)  x <- list(r1, r2) names(x) <- c("x", "y") x$filename <- 'test.tif' x$overwrite <- TRUE m <- do.call(merge, x) 
like image 182
Robert Hijmans Avatar answered Oct 14 '22 19:10

Robert Hijmans


The 'merge' function from the Raster package is a little slow. For large projects a faster option is to work with gdal commands in R.

library(gdalUtils) library(rgdal) 

Build list of all raster files you want to join (in your current working directory).

all_my_rasts <- c('r1.tif', 'r2.tif', 'r3.tif') 

Make a template raster file to build onto. Think of this a big blank canvas to add tiles to.

e <- extent(-131, -124, 49, 53) template <- raster(e) projection(template) <- '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' writeRaster(template, file="MyBigNastyRasty.tif", format="GTiff") 

Merge all raster tiles into one big raster.

mosaic_rasters(gdalfile=all_my_rasts,dst_dataset="MyBigNastyRasty.tif",of="GTiff") gdalinfo("MyBigNastyRasty.tif") 

This should work pretty well for speed (faster than merge in the raster package), but if you have thousands of tiles you might even want to look into building a vrt first.

like image 42
Matthew Bayly Avatar answered Oct 14 '22 18:10

Matthew Bayly