Как ускорить извлечение доли типов растительного покрова в буфере из растра?

Я хотел бы извлечь пространственные данные в буфере 10 км вокруг 30 000 объектов класса SpatialLines и рассчитать долю каждого типа земного покрова вокруг буферизованных линий. В первый раз я использовал функцию crop для обрезки растра. Затем я использовал функцию extract (пакетный растр) для расчета доли 10 типов растительного покрова. Вот мой код:

lapply(1:nrow(tab_lines), FUN=function(k){

Первый шаг: построить буфер в 10 км вокруг линии

buf_line <- gBuffer(seg_line[k], width=10000) ## seg_line =  Lines objects

Второй шаг: извлечь из растра типы земного покрова в буфере

ha <-extract(x=data_raster,y=buf_line)

Третий шаг: рассчитать соотношение 10 типов растительного покрова

Доля каждого типа земного покрова должна быть указана в столбцах (один столбец = один тип земного покрова).

    ha_1 <-length(ha[[1]][ha[[1]]==1])/length(ha[[1]])
    ha_2 <-length(ha[[1]][ha[[1]]==2])/length(ha[[1]])
    ha_3 <-length(ha[[1]][ha[[1]]==3])/length(ha[[1]])
    ha_4 <-length(ha[[1]][ha[[1]]==4])/length(ha[[1]])
    ha_5 <-length(ha[[1]][ha[[1]]==5])/length(ha[[1]])
    ha_6 <-length(ha[[1]][ha[[1]]==6])/length(ha[[1]])
    ha_7 <-length(ha[[1]][ha[[1]]==7])/length(ha[[1]])
    ha_8 <-length(ha[[1]][ha[[1]]==8])/length(ha[[1]])
    ha_9 <-length(ha[[1]][ha[[1]]==9])/length(ha[[1]])
    ha_10 <-length(ha[[1]][ha[[1]]==10])/length(ha[[1]])

     return(cbind(ha_1, ha_2, ha_3, ha_4, ha_5, ha_6, ha_7, ha_8, ha_9, ha_10))  
    })

Как ускорить время обработки 30 000 пространственных линий? Существуют ли какие-либо другие пакеты в R, которые могут обеспечить более быструю обработку такого типа извлечения?


person Pierre    schedule 07.12.2015    source источник
comment
Причина, по которой ваш код медленный, заключается в том, что он проверяет все ячейки сетки ландшафта на случай, если они перекрываются с буфером. Чтобы ускорить это, вы должны создать подмножество сетки, соответствующее размеру буфера, который вы проверяете в этой точке. Если вы разместите некоторые образцы данных, кому-то будет легче помочь вам. GRASS (в частности, ‹grass.osgeo.org/grass64/manuals/r.stats .html›) будет работать хорошо, и вы можете подключить его к R. Пример здесь: ‹scottishsnow.wordpress.com/2014/08/24/many-rastered-beast›.   -  person MikeRSpencer    schedule 14.12.2015
comment
scottishsnow.wordpress.com/2014/08/24/many-rastered -зверь   -  person numbercruncher    schedule 16.12.2015


Ответы (1)


Вот более краткая формулировка

library(raster)
library(rgeos)

buf_line <- gBuffer(seg_line, width=10000, byid=TRUE)
ha <- extract(x=data_raster, y=buf_line)
h <- sapply(ha, function(x) tabulate(x, 10))
h <- h / colSums(h)

Но я не думаю, что это будет намного быстрее. Вместо извлечения вы можете попробовать sp::over

В зависимости от вашего компьютера, процесс может ускориться при первом запуске

beginCluster()
person Robert Hijmans    schedule 07.12.2015
comment
Это не то, о чем говорит ваш вопрос. В этом случае вы должны задать лучший вопрос. - person Robert Hijmans; 08.12.2015
comment
Я хотел бы протестировать функцию beginCluster() для распараллеливания задачи. В моем случае я предполагаю, что функция должна иметь структуру: beginCluster() extract(data_raster , y=buf_line) ha_1 <-length(ha[[1]][ha[[1]]==1])/length(ha[[1]]) ... tab_prop <- cbind(ha_1, ha_2, ha_3, ha_4, ha_5, ha_6, ha_7, ha_8, ha_9, ha_10) endCluster(). Но я не знаю, как распараллелить 30 000 строк с помощью beginCluster() ? - person Pierre; 08.12.2015