R中是否有一种方法可以将栅格文件分割为5 x 5像素的图块网格,然后能够将这些图块放回一起以将整个栅格视为图块。
我必须用大约2500个栅格文件,因此使用整个栅格文件夹执行此操作的一些其他建议也很棒。
但是现在我只需要一种方法来处理第一个文件。
(我是R的初学者,请原谅我缺乏的知识)
答案 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))