替换栅格堆栈中所有图层的像素值

时间:2019-02-09 10:41:19

标签: r r-raster

我需要栅格堆栈方面的帮助。 我有一个365层栅格堆栈(对应于一个水文年),我想用值3替换像素,最后一个上一个图层的值替换为其他值。 例如,对于特定的像素,我具有前10个提供值的层: 1,1,2,3,3,3,3,2,1,1。 在这种情况下,值为3的层应替换为2,这是“ 3窗口”之前的最后一个值,该值不同于3。 应该对每个像素的所有层(显然,第一个除外)执行此操作。 任何想法? 我只是将栅格转换成矩阵,然后处理矩阵,但这需要很多时间。 假设vel_3D_snow_P4是我的矩阵(从栅格中检索),其中我有365行(天)和超过400000列(像素),我编写了这段代码:

vel_3D_snow_P4_back=matrix(nrow=nrow(vel_3D_snow_P4),ncol=ncol(vel_3D_snow_P4))
for (i in 1:ncol(vel_3D_snow_P4)){
  y <- which(vel_3D_snow_P4[,i]==3)
  startIndex <- y[!(y-1) %in% y]
  stopIndex <- y[!(y+1) %in% y]

  matrix=matrix(nrow=length(startIndex),ncol=2)
  matrix[,1]=startIndex
  matrix[,2]=stopIndex 

  new_vector_back=vel_3D_snow_P4[,i]
  for (j in 1:nrow(matrix)){
  if (matrix[j,1]==1) next
  new_vector_back[matrix[j,1]:matrix[j,2]]=new_vector_back[matrix[j,1]-1]
  }
vel_3D_snow_P4_back=cbind(vel_3D_snow_P4_back,new_vector_back)
print(c("fine",toString(i)))
}

但是,正如您可以想象的那样,拥有众多像素是不可能的!这就是为什么我要通过维护栅格格式(也许使用calc函数?)来寻求解决方案/想法的原因

谢谢。

1 个答案:

答案 0 :(得分:0)

通常,在R中遇到此类问题的第一步是编写对向量进行运算的函数。或搜索现有的一个。我的第一个Google查询将我指向zoo::na.locf

library(zoo)
x <- c(1,1,2,3,3,3,3,2,1,1)
x[x==3] <- NA
na.locf(x)
# [1] 1 1 2 2 2 2 2 2 1 1

然后创建示例栅格数据

library(raster)
r <- raster(ncol=10, nrow=10)
s <- stack(lapply(c(1,2,3,3,4), function(i) setValues(r, i)))

并结合两者。你可以做

A)

x <- reclassify(s, cbind(3, NA))
z <- calc(x, fun=na.locf)

B)

f <- function(v) {
    v[v==3] <- NA
    na.locf(v)
}   
zz <- calc(s, f)