Các raster Mosaicking trong R?


10

Tôi đang cố gắng ghép một số raster thành một raster lớn duy nhất trong R. Sử dụng tập lệnh được đăng trong /programming/15287807/how-can-i-create-raster-mosaic-USE-list-of-rasters Nhưng, tôi đã nhận được một thông báo cảnh báo và thông báo lỗi.

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)

Đó là báo cáo lỗi như dưới đây

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

Sau đó, tôi đã thử một phiên bản khác.

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

Nhưng ở đây một số thông điệp cảnh báo như dưới đây

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

Tôi đã bỏ qua tin nhắn sau đó tiếp tục

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

nhưng ở đây cùng một lỗi được đề cập ở trên

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

Tôi cũng đã tìm thấy theo kịch bản, nhưng nó không hoạt động nceas.ucsb.edu/scicomp/usecase/c [isterimagemosaic
Vandka

Câu trả lời:


17

Vấn đề ở đây là khảm và do.call đang mong đợi một đối tượng raster trong danh sách và không chỉ tên nhân vật của raster được chứa trong vectơ "rasters1". Trong thực tế, bạn đang yêu cầu khảm một tên trong một vectơ chứ không phải là một đối tượng 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)

1

Chỉ là một biến thể nhỏ về chủ đề. Bạn có thể tránh việc tạo một danh sách trống và vòng lặp for ...

    rast.list <- list()

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

... với một lệnh lapply .

    rast.list <- lapply(1:length(rasters1),
 function(x) {
raster(rasters1[x])
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.