Merging multiple rasters in R

后端 未结 7 1256
傲寒
傲寒 2021-02-01 19:43

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 pu

相关标签:
7条回答
  • 2021-02-01 19:53

    You can use Reduce like this for example :

    Reduce(function(...)merge(...,tolerance=1),ast14dmo.sd)
    
    0 讨论(0)
  • 2021-02-01 19:56

    I was faced with this same problem and I used

    #Read desired files into R
    data_name1<-'file_name1.tif' 
    
    r1=raster(data_name1)
    
    data_name2<-'file_name2.tif'
    
    r2=raster(data_name2)
    
    #Merge files
    new_data <- raster::merge(r1, r2)
    

    Although it did not produce a new merged raster file, it stored in the data environment and produced a merged map when plotted.

    0 讨论(0)
  • 2021-02-01 19:57

    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.

    0 讨论(0)
  • 2021-02-01 20:01

    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)
    
    0 讨论(0)
  • 2021-02-01 20:07

    I have tested the solution using gdalUtils as proposed by Matthew Bayly. It works quite well and fast (I have about 1000 images to merge). However, after checking with document of mosaic_raster function here, I found that it works without making a template raster before mosaic the images. I pasted the example codes from the document below:

    outdir <- tempdir()
    gdal_setInstallation()
    valid_install <- !is.null(getOption("gdalUtils_gdalPath"))
    if(require(raster) && require(rgdal) && valid_install)
    {
    layer1 <- system.file("external/tahoe_lidar_bareearth.tif", package="gdalUtils")
    layer2 <- system.file("external/tahoe_lidar_highesthit.tif", package="gdalUtils")
    mosaic_rasters(gdalfile=c(layer1,layer2),dst_dataset=file.path(outdir,"test_mosaic.envi"),
        separate=TRUE,of="ENVI",verbose=TRUE)
    gdalinfo("test_mosaic.envi")
    

    }

    0 讨论(0)
  • 2021-02-01 20:09

    I ran into the following problem when trying to mosaic several rasters on top of each other

    In vv[is.na(vv)] <- getValues(x[[i]])[is.na(vv)] :
      number of items to replace is not a multiple of replacement length 
    

    As @Robert Hijmans pointed out, it was likely because of misaligned rasters. To work around this, I had to resample the rasters first

    library(raster)
    
    x  <- raster("Base_raster.tif")
    r1 <- raster("Top1_raster.tif")
    r2 <- raster("Top2_raster.tif")
    
    # Resample
    x1 <- resample(r1, crop(x, r1))
    x2 <- resample(r2, crop(x, r2))
    
    # Merge rasters. Make sure to use the right order
    m <- merge(merge(x1, x2), x)
    
    # Write output
    writeRaster(m,
                filename = file.path("Mosaic_raster.tif"),
                format = "GTiff",
                overwrite = TRUE)
    
    0 讨论(0)
提交回复
热议问题