Разделить растр на плитки размером 5 × 5 пикселей в R - PullRequest
0 голосов
/ 24 сентября 2018

Есть ли способ в R разделить растровый файл на сетку из плиток размером 5 x 5 пикселей, а затем иметь возможность построить их вместе для просмотра всего растра в виде плиток.

Я должен сделать это с ок.2500 растровых файлов, поэтому некоторые дополнительные советы по работе с целой папкой растров также были бы замечательными.

Но сейчас мне просто нужен способ сделать это с первым файлом.

(я новичок в R, поэтому прошу прощения за недостаток знаний)

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вот способ разделить растр на ячейки ячейки 5x5

Пример данных:

library(raster)
r <- raster(res=10, vals=1:648)

Решение:

a <- aggregate(raster(r), 5)
p <- as(a, 'SpatialPolygons')
x <- lapply(seq_along(p), function(i) crop(r, p[i]))

x теперьсписок объектов RasterLayer

Чтобы построить их (кажется странным подходом!), вы можете сделать что-то вроде этого

plot(p, border='gray')
z <- lapply(x, function(i) plot(i, add=T, legend=F))
0 голосов
/ 25 сентября 2018

Там, безусловно, есть: -)

Один из подходов, который я использую довольно часто:

library(raster)
library(purrr)

r <- raster(ncol = 50, nrow = 50, ext = extent(c(0,50,0,50)))

split_raster <- function(r, nx, ny, buffer = c(0,0)) {

  ext <- extent(r)

  tiles <- vector("list", length = nx * ny)

  n <- 1L

  for (i in seq_len(nx) - 1L) {
    for (j in seq_len(ny) - 1L) {
      x0 <- ext@xmin + i * ((ext@xmax - ext@xmin) / nx) - buffer[1] * xres(r) 
      x1 <- ext@xmin + (i + 1L) * ((ext@xmax - ext@xmin) / nx) + buffer[1] * xres(r) # nolint
      y0 <- ext@ymin + j * ((ext@ymax - ext@ymin) / ny) - buffer[2] * yres(r) # nolint
      y1 <- ext@ymin + (j + 1L) * ((ext@ymax - ext@ymin) / ny) + buffer[2] * yres(r) # nolint
      tiles[[n]] <- extent(x0, x1, y0, y1)
      n <- n + 1L
    }
  }

  crop_tiles <- function(i, e, r) {
    ri <- crop(r, e[[i]])
    crs(ri) <- crs(r)
    return(ri)
  }

  tiles <- purrr::map(seq_along(tiles), function(i) crop_tiles(i, tiles, r)) 

  return(tiles)

}

split_raster(landscape, 10, 10)

В зависимости от количества плиток и размера вашего отдельного растра, вы можете обменятьфункция purrr :: map с чем-то вроде:

library(raster)
library(furrr)

plan(multisession)

r <- raster(ncol = 50, nrow = 50, ext = extent(c(0,50,0,50)))

split_raster <- function(r, nx, ny, buffer = c(0,0)) {

  [...]

  tiles <- furrr::future_map(seq_along(tiles), function(i) crop_tiles(i, tiles, r)) 

  return(tiles)

}

split_raster(landscape, 10, 10)
...