2016-07-07 165 views
0

我正在使用由Hantson提出的方法進行一些地形校正的遙感數據& Chuvieco(2010)涉及基於某一NDVI值的覆蓋物分離方法來區分植被和非植被之間區域。因此,我從一個多波段光柵對象轉爲兩個,這些對象被嚴格處理並隨後被組合以形成原始的,地形校正的場景。在r中添加多波段光柵

問題是我在場景中有一些NA值,所以如果我沒有擺脫它們,我會得到一個空白圖像。我使用sum函數,將na.rm選項定義爲TRUE來解決此問題,但結果是單波段柵格對象而不是堆棧或rasterbrick對象。

這是我的代碼:

#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影像的不同地形校正方法。 International Journal of Applied Earth Observations and Geoinformation 13(2011):691-700p。

+0

如果您總結了一些光柵層,你只會得到一個樂隊。或者你想分別疊加ADEVEG和ADESD,然後疊加它們?可能你想要做的是'ADE <-stack(sum(ADEVEG,na.rm = T),sum(ADESD,na.rm = T))' – rar

+0

我想將兩個堆棧合併爲一個,因爲它們代表荒蕪和植被的一部分場景,同時結合多個樂隊。最後,我用0手動替換了NA vaues,然後繼續通過簡單的添加來添加這兩個堆棧。你的方法不是我想要的,但非常感謝你的快速回答。 –

回答

1

請提供可重複的例子

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 
+0

感謝您的快速解答。最後,我使用x [is.na(x [])] < - 0替換了每個多頻段柵格的NA值,然後通過簡單的聯合(x3 < - x1 + x2)將它們組合爲一個。 這對我很好,但我只是想知道是否會有一個更自動化的方式來總結兩個柵格並處理NA存在。 –

+1

你不應該這樣做'x [is.na(x [])] < - 0'(風險記憶方式);也許做'x [is.na(x)] < - 0',但'reclassify'是可取的, – RobertH