2013-07-24 92 views
0

我們有一個柵格代表與生長季節開始相對應的序號日期。也就是說,柵格中的每個像素值都在1:365之間,代表了序號日期。從光柵堆棧層提取不同光柵像素值的值

我也計算了相應年份所有365天的累積生長度日數。這些數據以365層的柵格堆棧形式加載到R中。

我的目標是在生長季節層的開始隨機抽樣地理位置。然後,我希望從這些相同的座標中提取累積生長度天數的值,但只能從對應於季節像素值開始的增長度天數堆棧層中提取。例如,如果給定像素的季節開始時間是一年中的第100天,我想在該年的第100天從該位置提取增長度數天(nlayers = 100)。

我一直在試圖寫一個函數來完成這個,但我似乎無法讓它正常工作。我想結束一個數據框或矩陣,顯示當天的x位置,y位置,季節開始日和GDD。一列中代替了許多GDD值,我得到了許多列的一個GDD值。

看來問題在於我使用的提取物。我已經嘗試了參數nl,圖層,並用[[]]對x參數編制索引。他們似乎產生了相同的結果。這裏有一個簡化的代碼,只有5天的時間來考慮,我正在試圖構建的功能。

任何幫助/建議表示讚賞!

#============================================================ 
library(raster) 

SOST <- raster() 
SOST[] <- 1:5 

r1 <- r2 <- r3 <- r4 <- r5 <- raster() 
r1[] <- 10 
r2[] <- 20 
r3[] <- 30 
r4[] <- 40 
r5[] <- 50 
GDD <- stack(r1,r2,r3,r4,r5) 

getGDD <- function(sost, gdd, n){set.seed(232) 
     samp <- sampleRandom(sost, n, xy = TRUE, 
     na.rm = TRUE) 

     df <- data.frame('x'=as.numeric(), 'y'= 
     as.numeric(), 'SOST'=as.numeric(), 
     'GDD'=as.numeric()) 


     df.temp <- data.frame('x' = samp[1:n,1], 'y' = 
     samp[1:n,2], 'SOST' = samp[,3],'GDD' = 
     extract(gdd, samp[1:n,1:2], nl = samp[1:n,3])) 

     df <- rbind(df, df.temp) 
     return(df) 
            } 

getGDD(sost = SOST, gdd = GDD, n = 5) 

回答

2

它似乎並沒有收集到很多的關注,但我能夠解決它。使用原始問題中發佈的示例,最簡單的解決方案是stackSelect函數。 Robert Hijmans在R-sig-geo上向我指出了這一點。

x <- stackSelect(GDD, SOST) 

set.seed(232) 
samp <- sampleRandom(SOST, 5, xy = TRUE, na.rm = TRUE)[, -3] 
extract(x, samp) 

如果您的數據具有相同的範圍和分辨率,此功能非常有用。但是,我沒有提及並且包括我的數據並不完美。因此,據我所知,我仍然需要創建一個函數。多思考一下,我能夠想出下面的例子和功能並解決問題。

library(raster) 
#SOST and GDD simulations with same ncell and extents as actual data: 

SOST <- raster(nrow = 3991, ncol = 3025, xmn = 688635, xmx = 779385, 
ymn = 4276125, ymx = 4395855, crs = "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0") 
SOST[] <- 1:5 

r1 <- r2 <- r3 <- r4 <- r5 <- raster(nrow = 3951, ncol = 2995, xmn = 688620.2, xmx = 779377.8, ymn = 4276121, ymx = 4395848, crs = "+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0") 
r1[] <- 10 
r2[] <- 20 
r3[] <- 30 
r4[] <- 40 
r5[] <- 50 
GDD <- stack(r1,r2,r3,r4,r5) 

getGDD <- function(sost, gdd, n){ 
     set.seed(232) 
     samp <- sampleRandom(sost, size = n, xy = TRUE) 

     extr <- NULL 
     for(i in 1:n){ 
     extr[i] <- extract(gdd[[samp[i,3]]], cbind(as.matrix(samp[i,1]), 
       as.matrix(samp[i,2]))) 
     } 

     out <- data.frame(x = samp[,1], y = samp[,2], 'SOST' = samp[,3], 'GDD' = extr) 
     return(out) 
     } 

test <- getGDD(sost = SOST, gdd = GDD, n = 5) 
test