Mosaïquer des rasters dans R?

10

J'essaie de mosaïquer plusieurs rasters en un seul gros raster dans R. Utilisation d'un script publié dans /programming/15287807/how-can-i-create-raster-mosaic-using-list-of-rasters Mais, j'ai reçu un message d'avertissement et un message d'erreur.

rasters1 <- list.files("F:\\MOD15A2_LAI_1km\\MOD15A2_LAI_2009", 
                      pattern = "mod15a2.a2009001.*.005.*.img$", 
                      full.names = TRUE, recursive = TRUE)

mos1 <-mosaic(rasters1, fun=mean)

Il signalait une erreur comme ci-dessous

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘extent’ for signature ‘"character"

J'ai ensuite essayé une autre version.

rasters1.mosaicargs <- rasters1
rasters1.mosaicargs$fun <- mean

Mais voici un message d'avertissement comme ci-dessous

Warning message:
In rasters1.mosaicargs$fun <- mean : Coercing LHS to a list

J'ai ignoré le message puis j'ai continué

mos2 <- do.call(mosaic, rasters1.mosaicargs)

mais ici même erreur mentionnée comme ci-dessus

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘mosaic’ for signature ‘"character", "character"
Vandka
la source
J'ai également trouvé le script suivant, mais cela ne fonctionne pas nceas.ucsb.edu/scicomp/usecases/createrasterimagemosaic
Vandka

Réponses:

17

Le problème ici est que mosaic et do.call attendent un objet raster dans la liste et pas seulement les noms de caractères du raster contenu dans le vecteur "rasters1". Vous demandez en effet de mosaïquer un nom dans un vecteur et non un objet raster.

# Create some example data
require(raster)
    r <- raster(ncol=100, nrow=100)
      r1 <- crop(r, extent(-10, 11, -10, 11))
        r1[] <- 1:ncell(r1)
          r2 <- crop(r, extent(0, 20, 0, 20))
          r2[] <- 1:ncell(r2)
      r3 <- crop(r, extent(9, 30, 9, 30))
    r3[] <- 1:ncell(r3)

# If I create a list object of the raster names, as your are doing with list.files, 
#    do.call will fail with a character signature error 
rast.list <- list("r1","r2","r3")   
  rast.list$fun <- mean     
    rast.mosaic <- do.call(mosaic,rast.list)

# However, if I create a list contaning raster objects, the do.call function 
#   will work when mosaic is passed to it.      
rast.list <- list(r1, r2, r3)     
  rast.list$fun <- mean
    rast.mosaic <- do.call(mosaic,rast.list)
      plot(rast.mosaic)

# You could specify a for loop to create a list object, 
#   contaning raster objects
rasters1 <- list.files("F:/MOD15A2_LAI_1km/MOD15A2_LAI_2009", 
                       pattern="mod15a2.a2009001.*.005.*.img$", 
                       full.names=TRUE, recursive=TRUE)
rast.list <- list()
  for(i in 1:length(rasters1)) { rast.list[i] <- raster(rasters1[i]) }

# And then use do.call on the list of raster objects
rast.list$fun <- mean
  rast.mosaic <- do.call(mosaic,rast.list)
    plot(rast.mosaic)
Jeffrey Evans
la source
1

Juste une petite variation sur le thème. Vous pouvez éviter la création d'une liste vierge et de la boucle for ...

    rast.list <- list()

    for(i in 1:length(rasters1)) { 
rast.list[i] <- raster(rasters1[i])
}

... avec une commande lapply .

    rast.list <- lapply(1:length(rasters1),
 function(x) {
raster(rasters1[x])
})
Dan
la source