Ускорение петли над растров - PullRequest
0 голосов
/ 28 ноября 2018

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

Мне удалось это сделать, выполнив следующий цикл:

for (i in 1:length(rasters2014)){
a <- raster(rasters2014[i])
ext[i] <- as.vector(extract(a, poligon2, fun=mean, na.rm=TRUE, df=F))
}
output2 = data.frame(ext, filename=filename2014)

Проблема в том, что представленный выше цикл занимает около 2,5 часов для завершения расчета.У кого-нибудь есть идеи, как я мог ускорить этот процесс?

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Если ваши полигоны не пересекаются (и в большинстве случаев они не перекрываются), альтернативный маршрут будет

library(raster)
x <- rasterize(poligon2, rasters2014[1])
s <- raster::stack(rasters2014, quick = TRUE)
z <- zonal(s, x, "mean")

PS : чем быстрее, тем лучше, но я бы предложил пообедатьпока это работает.

0 голосов
/ 29 ноября 2018

Спасибо за вашу помощь!Я испробовал все предложенные решения и время вычислений в целом одинаково, независимо от применяемого метода.Поэтому я предполагаю, что просто невозможно существенно ускорить вычислительный процесс.

0 голосов
/ 28 ноября 2018

Если ваш растр выровнен должным образом (один и тот же ncol, nrow, экстент, происхождение, разрешение), вы можете попытаться определить «номера ячеек», которые нужно извлечь, просмотрев первый файл, а затем извлекая его на основе этих файлов.Это может ускорить обработку, поскольку растру не нужно вычислять, какие ячейки извлечь.Примерно так:

rast1 <- raster(rasters2014[1])
cells <- extract(rast1, poligon2, cellnumbers = TRUE, df = TRUE)[,"cells"]
ext <- list()

for (i in 1:length(rasters2014)){
  a <- raster(rasters2014[i])
  ext[[i]] <- as.vector(extract(a, cells, fun=mean, na.rm=TRUE, df=F))
}

Обратите внимание, что я также использую list для хранения результатов, чтобы избежать "растущего" вектора, который обычно расточителен.

В качестве альтернативы, как предлагаетсяс помощью @qdread вы можете создать rasterStack, используя raster::stack(rasters2014, quick = TRUE) и вызывать extract поверх стека, чтобы избежать цикла for.Не знаю, что будет быстрее.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...