R 如何使用光栅对象中的值创建图层?
我有一个光栅对象,每个单元格中包含不同的值,如下例所示:R 如何使用光栅对象中的值创建图层?,r,raster,R,Raster,我有一个光栅对象,每个单元格中包含不同的值,如下例所示: library(raster) x <- matrix(1:5,nrow = 5, ncol = 1) r <- raster(x) plot(r) r > r class : RasterLayer dimensions : 5, 1, 5 (nrow, ncol, ncell) resolution : 1, 0.2 (x, y) extent : 0, 1, 0, 1 (xmin, xm
library(raster)
x <- matrix(1:5,nrow = 5, ncol = 1)
r <- raster(x)
plot(r)
r
> r
class : RasterLayer
dimensions : 5, 1, 5 (nrow, ncol, ncell)
resolution : 1, 0.2 (x, y)
extent : 0, 1, 0, 1 (xmin, xmax, ymin, ymax)
crs : NA
source : memory
names : layer
values : 1, 5 (min, max)
我想知道是否有一种简单的方法可以根据光栅的值创建新图层,从而保留其空间结构
在下面的示例中,我成功地手动实现了这一点,但我认为如果要将多个值转换为层,那么这不是一种有效的方法
l1 <- r
l2 <- r
l3 <- r
l4 <- r
l5 <- r
values(l1)[which(values(r)!=1)] <- 0
values(l2)[which(values(r)!=2)] <- 0
values(l3)[which(values(r)!=3)] <- 0
values(l4)[which(values(r)!=4)] <- 0
values(l5)[which(values(r)!=5)] <- 0
r1 <- stack(l1,l2,l3,l4,l5)
plot(r1)
r1
> r1
class : RasterStack
dimensions : 5, 1, 5, 5 (nrow, ncol, ncell, nlayers)
resolution : 1, 0.2 (x, y)
extent : 0, 1, 0, 1 (xmin, xmax, ymin, ymax)
crs : NA
names : layer.1, layer.2, layer.3, layer.4, layer.5
min values : 0, 0, 0, 0, 0
max values : 1, 2, 3, 4, 5
感谢您的帮助
谢谢是的,您可以在一行中实现这一点:
r1是的,您可以在一行中实现这一点:
r1有一种方法
x <- layerize(r)
要恢复原始数字,您可以
x <- layerize(r) * unique(r)
或者可能更明确
u <- unique(r)
x <- layerize(r, classes=u) * u
x
# (...)
#names : X1, X2, X3, X4, X5
#min values : 0, 0, 0, 0, 0
#max values : 1, 2, 3, 4, 5
有一种方法可以做到这一点
x <- layerize(r)
要恢复原始数字,您可以
x <- layerize(r) * unique(r)
或者可能更明确
u <- unique(r)
x <- layerize(r, classes=u) * u
x
# (...)
#names : X1, X2, X3, X4, X5
#min values : 0, 0, 0, 0, 0
#max values : 1, 2, 3, 4, 5
谢谢你,艾伦!这是一个非常优雅的解决方案。更优雅和内存安全的变体:StackLapplyUnique,functioni{r[r!=i]@RobertHijmans谢谢你。你能解释一下为什么它有更好的内存安全性吗?我不得不承认我不明白为什么会这样。我很感谢你的见解。[]创建一个包含内存中所有值的向量。如果您有一个非常大的文件或没有太多可用RAM,则可能会失败。光栅方法将改为分块处理文件。@RobertHijmans非常感谢-很高兴知道这一点。谢谢您,Allan!这是一个非常优雅的解决方案。更优雅且内存安全的变体:StackLapplyUnique,functioni{r[r!=i]@RobertHijmans谢谢你。你能解释一下为什么它有更好的内存安全性吗?我不得不承认我不明白为什么会这样。我很感激你的洞察力。[]创建一个包含内存中所有值的向量。如果您有一个非常大的文件或没有太多可用RAM,则可能会失败。光栅方法将改为分块处理文件。@RobertHijmans非常感谢-很高兴知道。谢谢,Robert。这正是我要找的。谢谢,Robert。这正是我要找的。