将单个栅格设置为NA,其中栅格堆栈的值为NA

时间:2013-04-29 03:55:10

标签: r gis raster

我有两个30米x 30米的光栅文件,我想从中采样点。在采样之前,我想从图像中去除混浊区域。我转向R和Hijman的Raster包来完成任务。

使用drawPoly(sp = TRUE)命令,我绘制了18个不同的多边形。该函数似乎不允许18个多边形作为一个sp对象,所以我将它们全部分开绘制。然后我给多边形一个与光栅匹配的proj4string,并将它们设置为一个列表。我通过一个lapply函数运行列表,将它们转换为栅格(Hijman包中的栅格化函数),多边形区域设置为NA,图像的其余部分设置为1.

我的最终目标是一个栅格图层,其中18个区域设置为NA。我已经尝试堆叠光栅化多边形列表,并将其子集化以将新栅格设置为相同区域中的NA。我的可重复代码如下。

library(raster)
r1 <- raster(nrow=50, ncol = 50)
r1[] <- 1
r1[4:10,] <- NA
r2 <- raster(nrow=50, ncol = 50)
r2[] <- 1
r2[9:15,] <- NA
r3 <- raster(nrow=50, ncol = 50)
r3[] <- 1
r3[24:39,] <- NA

r4 <- raster(nrow=50, ncol = 50)
r4[] <- 1

s <- stack(r1, r2, r3)

test.a.cool <- calc(s, function(x){r4[is.na(x)==1] <- NA})

无论出于何种原因,darn testacool都是一个空白的图,我的目标是将它作为一个栅格,除了堆栈中的NA(s)等于1之外的所有值。

任何提示?

感谢。

4 个答案:

答案 0 :(得分:3)

执行sum(s)会有效,因为sum()会为堆栈中包含一个NA值的任何网格单元返回NA

要查看它是否有效,请比较以下产生的数字:

plot(s)
plot(sum(s))

答案 1 :(得分:2)

我也在R-Sig-Geo论坛上发布了这个问题,并收到了包裹作者的回复。两个最简单的解决方案:

使用sp包将我的多边形转换为一个,然后栅格化多边形。

p <- rbind(p1, p2, p3...etc., makeUniqueIDs = TRUE)

r4 <- raster(nrow=50, ncol = 50)
r4[] <- 1
mask <- rasterize(p, r4)
mask[mask %in% 1:18] <- 1
#The above code produces a single raster file with 
#my polygons as unique values, ready for masking.

第二个简单的解决方案,正如Josh O'Brien所指出的那样:

m <- sum(s)
test <- mask(r4, m)

R社区摇滚。问题在一小时内解决了(两次)。感谢。

答案 2 :(得分:1)

我不熟悉您正在使用的软件包,但是查看代码中的最后一行,我认为问题可能就在这里:

 function(x){r4[is.na(x)==1] <- NA})

calc看起来不会那样做。它设置r4的{​​{1}}索引的NA的值,并将其设置为x

然后呢?如果有的话,也许:

NA

虽然,目前尚不清楚这是否是你所追求的。

答案 3 :(得分:1)

你走在正确的轨道上。 [运算符是为栅格和栅格堆栈定义的,因此您只需使用单行:

r4[ any(is.na(s) ) ] <- NA
plot(r4)

如果您想使用calc,可以像这样使用它:

r4 <- calc( s, function(x){ ( ! any( is.na(x) ) ) } )
r4[is.na(r4)] <- NA
plot(r4)