在R中将栅格分割成5个像素x 5个像素的图块

时间:2018-09-24 17:06:31

标签: r split raster tile

R中是否有一种方法可以将栅格文件分割为5 x 5像素的图块网格,然后能够将这些图块放回一起以将整个栅格视为图块。

我必须用大约2500个栅格文件,因此使用整个栅格文件夹执行此操作的一些其他建议也很棒。

但是现在我只需要一种方法来处理第一个文件。

(我是R的初学者,请原谅我缺乏的知识)

2 个答案:

答案 0 :(得分:1)

最肯定的是:-)

我经常使用的一种方法是:

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)

答案 1 :(得分:1)

这是一种在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))