【问题标题】:Concatenating values into new layer of raster stack将值连接到光栅堆栈的新层中
【发布时间】:2020-09-11 16:49:21
【问题描述】:

我希望合并两个栅格的值,但是我的意思是连接而不是求和。例如,我想要 1 + 1 = 11 而不是 1 + 1 = 2。此外,我希望保留两个数字,所以 0 + 1 = 01,而不是 1。我可以通过将栅格转换为数据框来实现这一点,但是我无法将它们转换回栅格(我希望制作一张地图作为最终产品)。此外,我无法弄清楚如何在将数据保留为栅格类的同时完成此操作。

这里有一些示例代码来说明我的问题:

library(raster)
#Create two rasters
xmn = 1; xmx = 5; ymn = 10; ymx = 20 
rast1<- raster(matrix(1,3,4), xmx=xmx, xmn=xmn, ymx=ymx, ymn=ymn)
rast2<- raster(matrix(2,3,4), xmx=xmx, xmn=xmn, ymx=ymx, ymn=ymn)

rast 1 和 rast2 中的所有单元格分别为 1 和 2。连接这两个栅格应该得到 12 的值。但是,我知道如何做到这一点的唯一方法是将栅格转换为数据框,如下所示:

#Stack the rasters and convert to data frame
rast_df<- as.data.frame(stack(rast1, rast2))

#Concatenate using the layer stack (layer.1 for rast1, layer.2 for rast2)
rast_con<- transform(rast_df, layer.3=paste(layer.1, layer.2, sep = ""))

#Inspect layer.3 values
head(rast_con)
  layer.1 layer.2 layer.3
1       1       2      12
2       1       2      12
3       1       2      12
4       1       2      12
5       1       2      12

正如我们所见,这种方法很有效。但是,我似乎无法将数据帧强制返回到具有原始范围/CRS 的栅格,仅具有 layer.3。有关如何执行此操作或如何连接两个栅格而不将它们转换为数据框的任何提示都会有所帮助。

【问题讨论】:

    标签: r concatenation raster


    【解决方案1】:

    有趣的是,我可能找到了一个潜在的解决方案,但我不知道为什么这是一个解决方案。因此,如果有人可以提供更简单的答案,或者解释为什么这个答案有效,我将不胜感激。

    创建 rast_con 后,您可以这样做:

    #Create a matrix out of the layer with the concatenated values, but you have to make it 
    #A character, then a numeric, before coercing to matrix. I don't know why
    rast_mat<- as.matrix(as.numeric(as.character(rast_con$layer.3)))
    
    #Inspecting the matrix, we see this works
    head(rast_mat)
         [,1]
    [1,]   12
    [2,]   12
    [3,]   12
    [4,]   12
    [5,]   12
    [6,]   12
    
    #Create a raster from the matrix, using the same extent parameters as before
    rast_final<- raster(rast_elf, xmx=xmx, xmn=xmn, ymx=ymx, ymn=ymn)
    
    #Inspect rast_final to ensure it works
    head(rast_final)
      1
    1  12
    2  12
    3  12
    4  12
    5  12
    6  12
    7  12
    8  12
    9  12
    10 12
    

    【讨论】:

      【解决方案2】:

      据我所知,R 中对字符串栅格的支持还不多,实现您的目标可能需要哪个字符串。我能想到的最简单的解决方案是创建一个因子值栅格并坚持使用因子栅格,如 here 所述。

      s0 = brick(rast1, rast2)
      coords = coordinates(s0) 
      
      s1 = as.data.frame(getValues(s0))
      s1$layer.1 = 0
      layer.3 = sapply(1:nrow(s1), function(x) paste0(s1[x, ], collapse = ''))
      layer.3 <- data.frame(coords, layer.3)
      layer.3$layer.3 <- factor(layer.3$layer.3, levels = unique(layer.3$layer.3))
      coordinates(layer.3) <- ~ x + y
      gridded(layer.3) <- TRUE
      layer.3 <- raster(layer.3)
      
      layer.3
      # class      : RasterLayer 
      # dimensions : 3, 4, 12  (nrow, ncol, ncell)
      # resolution : 1, 3.333333  (x, y)
      # extent     : 1, 5, 10, 20  (xmin, xmax, ymin, ymax)
      # crs        : NA 
      # source     : memory
      # names      : layer.3 
      # values     : 1, 1  (min, max)
      # attributes :
      #   ID levels
      # 1     02
      
      levels(layer.3)
      
      # [[1]]
      # ID levels
      # 1  1     02
      
      

      【讨论】:

      • 这行得通。对于阅读本文的人来说,您需要创建一个新变量,例如 r
      • 实际上,这不起作用,因为如果 rast1 的值为 0,而 rast2 的值为 2,则此代码的输出将为 2 而不是 02。与我下面的解决方案相同...
      • 可以,但现在不再是光栅格式。谢谢!
      • 在我看来,您需要对字符串进行操作才能达到您想要的效果,在这种情况下,您需要将它们转换为因子。我相应地更新了我的答案。检查这是否适合你。
      【解决方案3】:

      如果您只有两个唯一值少于 10 个的栅格,则可以将 1 乘以 10,如下所示

      library(raster)
      r1 <- raster(matrix(1:2, 3,4), xmx=5, xmn=1, ymx=5, ymn=1)
      r2 <- raster(r1)
      r2[] <- c(1,1,2,2)
      
      x <- 10 * r1 + r2
      plot(x)
      text(x)
      

      另一种方法

      s <- stack(r1, r2)
      combinations <- c("11", "12", "21", "22")
      f <- function(x) {
          x <- paste0(x[,1], x[,2])
          match(x, combinations)
      }
      
      r <- calc(s, f)
      plot(r)
      text(r)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-02
        • 1970-01-01
        • 1970-01-01
        • 2017-03-20
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多