如何将 SpatRaster 分成 terra 中的多个层?

问题描述 投票:0回答:1

我已经应用了一个函数来使用 terra 创建多层 SpatRaster。它已找到,但现在我想分离每个图层并在图层名称后命名新的 SpatRaster。对于三层来说还不错,但我稍后会考虑 15-100 层。我如何编写 for 循环或其他解决方案来自动执行此操作?

我在 R for 循环方面很糟糕,但我怀疑它们可以拯救我。

library(terra)
#create example layered raster
a <- rast(ncol = 10, nrow = 10)
values(a) <- rep(5,100)
names(a) <- "layer_one"

b <- rast(ncol = 10, nrow = 10)
values(b) <- rep(10,100)
names(b) <- "layer_two"

c <- rast(ncol = 10, nrow = 10)
values(c) <- rep(15,100)
names(c) <- "layer_three"

z <- c(a,b,c)
ids <- names(z)

在此示例中,我想要三个 SpatRaster,layer_one、layer_two、layer_ Three。

r for-loop spatial terra nested-for-loop
1个回答
0
投票

您可以循环使用

names()
并使用
assign()
将每个层存储在新对象中:

library(terra)

z <- c(a,b,c)
for(lyr in names(z)) assign(lyr, z[[lyr]])

# list layer_* objects
ls(pattern = "layer_.*")
#> [1] "layer_one"   "layer_three" "layer_two"

layer_one
#> class       : SpatRaster 
#> dimensions  : 10, 10, 1  (nrow, ncol, nlyr)
#> resolution  : 36, 18  (x, y)
#> extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#> coord. ref. : lon/lat WGS 84 
#> source(s)   : memory
#> name        : layer_one 
#> min value   :         5 
#> max value   :         5

只是一个想法,但拥有 SpatRasterDataset 或仅拥有 SpatRaster 列表听起来比在全局环境中拥有数十个 terra 对象更易于管理。

# a list:
rast_list <- split(z, 1:nlyr(z)) |> `names<-`(names(z))
str(rast_list)
#> List of 3
#>  $ layer_one  :S4 class 'SpatRaster' [package "terra"]
#>  $ layer_two  :S4 class 'SpatRaster' [package "terra"]
#>  $ layer_three:S4 class 'SpatRaster' [package "terra"]
rast_list$layer_one
#> class       : SpatRaster 
#> dimensions  : 10, 10, 1  (nrow, ncol, nlyr)
#> resolution  : 36, 18  (x, y)
#> extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#> coord. ref. : lon/lat WGS 84 
#> source(s)   : memory
#> name        : layer_one 
#> min value   :         5 
#> max value   :         5

# list to SpatRasterDataset:
rast_ds <- sds(rast_list)
rast_ds
#> class       : SpatRasterDataset 
#> subdatasets : 3 
#> dimensions  : 10, 10 (nrow, ncol)
#> nlyr        : 1, 1, 1 
#> resolution  : 36, 18  (x, y)
#> extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#> coord. ref. : lon/lat WGS 84 
#> source(s)   : memory 
#> names       : layer_one, layer_two, layer_three

创建于 2023-08-19,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.