2013-07-24 4 views
0

У нас есть растровое изображение, которое представляет собой порядковый номер, соответствующий началу вегетационного периода. То есть каждое значение пикселя в растре находится между 1: 365, представляющим порядковую дату.Извлечение ценности из уровня стека растра, определяемого значением пикселя разного растра

Я также рассчитал совокупные возрастающие дни для всех 365 дней в соответствующем году. Эти данные загружаются в R в виде растрового стека с 365 слоями.

Моя цель - случайный выбор географических местоположений в начале слоя вегетационного периода. Затем я надеюсь извлечь ценность кумулятивных возрастающих дней с тех же координат, но только из слоя стека дней возрастающей степени, который соответствует началу значения пикселя сезона.

Например, если начало сезона на заданном пикселе составляло 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) 

ответ

2

Не похоже, чтобы это собрало много внимания, но я смог его решить. Используя образец, опубликованный в исходном вопросе, самым простым решением является функция stackSelect. Это было указано мне Робертом Хиджманом на 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 
Смежные вопросы