我正在处理使用Hantson& Sons提出的方法进行地形修正的地形数据。 Chuvieco(2010)涉及基于特定NDVI值的覆盖分离方法,以告知植被和非植被区域。
所以,我从一个多波段光栅对象变为两个,它们被单独处理并随后组合以形成原始的,地形校正的场景。
问题是我在场景中有一些NA值,所以如果我没有摆脱它们,我会得到一张空白图像。我使用sum
函数并将na.rm
选项定义为TRUE来解决此问题,但结果是单波段栅格对象而不是堆栈或栅格砖对象。
这是我的代码:
#topographic correction
VEGB1TC<- topocorr(VEGB1,slopeG,aspectG,sunelev,sunazimuth,method="ccorrection",na.value=NA)
VEGB2TC<- topocorr(VEGB2,slopeG,aspectG,sunelev,sunazimuth,method="ccorrection",na.value=NA)
....
SDB1TC<- topocorr(SDB1,slopeG,aspectG,sunelev,sunazimuth,method="ccorrection",na.value=NA)
SDB2TC<- topocorr(SDB2,slopeG,aspectG,sunelev,sunazimuth,method="ccorrection",na.value=NA)
...
#rasterize corrected band and stack them
VB1<-raster(VEGB1TC)
VB2<-raster(VEGB2TC)
....
ADEVEG<-stack(VB1, VB2,...)
SB1<-raster(SDB1TC)
SB2<-raster(SDB2TC)
....
ADESD<-stack(SB1, SB2,...)
#-----------combine images-------
ADE<-sum(stack(ADEVEG,ADESD),na.rm=T)
是否有可以添加带na.rm
标签的多波段栅格的功能?我找到了do.call
函数,但在我看来它将几个栅格相加成一个单波段对象。
感谢您的帮助。
ps:Hantson,S。Chuvieco,E。2010.评估Landsat图像的不同地形校正方法。国际应用地球观测与地理信息杂志13(2011):691-700p。
答案 0 :(得分:3)
请提供可重复的示例
library(raster)
s1 <- stack(system.file("external/rlogo.grd", package="raster"))
s2 <- flip(s1, 'x')
s2[1000:4000] <- NA
现在你可以做到
r1 <- s1 + s2
但是这并没有考虑NA
值。所以你需要诉诸
r2 <- overlay(s1, s2, fun=function(x) sum(x, na.rm=TRUE))
或者
s2r <- reclassify(s2, cbind(NA, 0))
r3 <- s1 + s2r
PS。我理解预期sum(s1, s2)
会返回一个多层对象,但我认为返回一个图层与base::sum
一致:
sum(1:4, 1:4)
# [1] 20