【问题标题】:R raster functions, splitting multiple rasters from oneR 栅格函数,从一个栅格中拆分多个栅格
【发布时间】:2015-06-24 12:36:25
【问题描述】:

我有一个简单的函数将栅格对象分成三个不同的类。但是我的函数不会返回这些栅格。我也读了这个教程http://cran.r-project.org/web/packages/raster/vignettes/functions.pdf 据它说,这是“这样做的一种非常糟糕的方式”。然而,“正确的方法”似乎过于复杂。真的没有简单的方法可以做到这一点(即,考虑函数应该让你更容易,反之亦然)。

我对使用 R 处理栅格很陌生,所以请原谅我的愚蠢问题..

rm(list=ls(all=T))

r <- raster(ncol=10, nrow=10)
r[] <- rnorm(100,100,5)

# Create split function // three classes
splitrast <- function(rast, quantile) {
  print("Splitting raster...")
  (q <- quantile(rast, probs=quantile))
  r1 <- rast; r2 <- rast; r3 <- rast # copy raster three times

  r1[rast > q[1]] <- NA                    #raster value less than .25 quantile
  r2[rast <= q[1] | rast >= q[2]] <- NA    #raster values is between quantiles
  r3[rast < q[2]] <- NA                    #raster values is over .75 quantile
  par(mfrow=c(1,3))
  plot(r1);plot(r2);plot(r3)
  rast <-   brick(r1,r2,r3)
  return(rast)
}

splitrast(r,c(0.2,0.8))
ls()

编辑:添加了可重现的示例

【问题讨论】:

  • 您应该将 r1、r2 和 r3 存储在 RasterStack 中,并将此 RasterStack 作为函数的输出返回。
  • 或者至少包含三个RasterLayers 的列表。
  • 正如其他人建议的那样,不要处理3层,处理brick()stack()(这两个非常相似,您几乎可以将它们视为一个数组,在某种程度上您可以将栅格视为矩阵)。此外,更重要的是,你的函数返回什么(R 函数的基础知识:你只会得到 r1;你可以return(list(r1,r2,r3)))?请提供一个可重现的例子。
  • 感谢您的想法,但仍然无法正常工作.. 顺便说一句。现在有人如何复制光栅n次吗? (函数中的第 3 行)。

标签: r function split raster


【解决方案1】:

请勿尝试单独退货。而是return(list(r1,r2,r3))。但是请参阅 cmets 关于样式。

【讨论】:

  • 如果你这样做,返回的对象似乎变成了一个“列表”类型,所以当你尝试访问每个元素时,它们似乎保留了这种类型,我无法将它们转换回输入“S4”。因此,应用(例如):“dim(raster_in_list)”应该返回栅格的行和列,如果您尝试在对象中进一步挖掘,实际上返回 1 或 NULL。
  • @Irene 我在 4.5 年前发布了这个答案,所以我不太记得了。但是列表只是一个容器。尝试索引它。比如l = list() 然后l[[1]]。或者,mat_list = list(matrix(rep(1,6), nrow=3), matrix(rep(1,6), nrow=2)) 然后 sapply(mat_list, dim)dim(mat_list[[1]]) 等。您只需深入到实际栅格,而不是在列表本身上使用 dim,它返回列表的 dim,而不是 @ 987654329@ 列表中的栅格。
【解决方案2】:

R raster subset 函数可以在这里提供帮助。归还砖块后,您可以将每个波段子集为单独的栅格。

# split the raster - returns a three band stack
rasters = splitrast(r,c(0.2,0.8))

# subset each band of the stack as a separate raster
r1 = subset(rasters, 1)
r2 = subset(rasters, 2)
r3 = subset(rasters, 3)

# proof - plot the separate rasters - same as those plotted in the function
plot(r1);plot(r2);plot(r3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2018-09-15
    • 2018-06-14
    • 1970-01-01
    • 2015-10-23
    • 2013-03-30
    相关资源
    最近更新 更多