簡體   English   中英

通過不同光柵的像素值確定柵格堆棧層的值

[英]Extract Value from Raster Stack Layer Determined by Different Raster's Pixel Value

我們有一個柵格代表了與生長季節開始相對應的序數日期。 也就是說,柵格中的每個像素值位於1:365之間,表示序數日期。

我還計算了相應年份所有365天的累積增長度日數。 這些數據作為具有365層的光柵堆棧加載到R中。

我的目標是在生長季節層開始時隨機抽取地理位置。 然后,我希望從相同的坐標中提取累積增長度數天的值,但僅從增長度天數堆棧的層中提取,該層對應於季節像素值的開始。

例如,如果給定像素的季節開始是一年中的第100天,我想在一年的第100天從該位置提取增長度數天(nlayers = 100)。

我一直在嘗試編寫一個函數來實現這一目標,但我似乎無法讓它正常工作。 我想最終得到一個數據框或矩陣,顯示我的x位置,y位置,季節開始日和當天的GDD。 我在一列中沒有多個GDD值,而是獲得了一個GDD值的多列。

似乎問題在於我使用的提取物。 我已經嘗試了參數nl,layer,並使用[[]]索引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)

它似乎並沒有引起很多關注,但我能夠解決它。 使用原始問題中發布的示例,最簡單的解決方案是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM