【问题标题】:How to use values in a raster object to create layers?如何使用栅格对象中的值来创建图层?
【发布时间】:2020-11-16 12:26:15
【问题描述】:

我在每个单元格中有一个包含不同值的栅格对象,如下例所示:

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 

感谢任何帮助!

谢谢

【问题讨论】:

    标签: r raster


    【解决方案1】:

    有一个方法

    x <- layerize(r)
    

    但是如下所示,这些层是0 / 1 (FALSE/TRUE)。

    x
    # (...)
    #names      : X1, X2, X3, X4, X5 
    #min values :  0,  0,  0,  0,  0 
    #max values :  1,  1,  1,  1,  1 
    

    要取回原始数字,您可以这样做

    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 
    

    【讨论】:

    • 谢谢,罗伯特。这正是我想要的。
    【解决方案2】:

    是的,您可以在一行中实现:

    r1 <- stack(lapply(unique(r[]), function(i) {r[r[] != i] <- 0; r;}))
    

    这样

    plot(r1)
    

    【讨论】:

    • 谢谢你,艾伦!这是一个非常优雅的解决方案。
    • 更优雅和内存安全的变体:stack(lapply(unique(r), function(i) { r[r != i] &lt;- 0; r;} ))
    • @RobertHijmans 对此表示感谢。你能解释一下为什么它有更好的内存安全性吗?我不得不承认我不明白为什么会这样。非常感谢您的洞察力。
    • [ ] 创建一个包含内存中所有值的向量。如果您有一个非常大的文件或没有太多可用 RAM,这可能会失败。光栅方法将改为分块处理文件。
    • @RobertHijmans 非常感谢 - 很高兴知道。
    猜你喜欢
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多