首页 > 解决方案 > 替换栅格堆栈中所有图层的像素值

问题描述

我需要有关栅格堆栈的帮助。我有一个 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 函数?)

提前致谢。

标签: rr-raster

解决方案


通常,在 R 中遇到此类问题的第一步是编写一个对向量进行操作的函数。或搜索现有的。我的第一个谷歌查询指出我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)))

并将两者结合起来。你可以做

一个)

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

或者

二)

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

推荐阅读