我有两个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之外的所有值。
任何提示?
感谢。
答案 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)