Я витягую з растру площу та відсоткове покриття різних типів землекористування на основі кількох тисяч меж полігону. Я виявив, що функція вилучення працює набагато швидше, якщо я повторюю кожен окремий багатокутник і обрізаю, а потім маскую растр до розміру конкретного багатокутника. Тим не менш, це досить повільно, і мені цікаво, чи є хтось із пропозицій щодо підвищення ефективності та швидкості мого коду.
Єдине, що я знайшов, що стосується цього, - це відповідь Роджера Біванда, який запропонував використовувати GDAL.open()
та GDAL.close()
, а також getRasterTable()
і та getRasterData()
. Я переглянув це, але в минулому виникли проблеми з gdal і не знаю цього досить добре, щоб знати, як його реалізувати.
Приклад відтворення:
library(maptools) ## For wrld_simpl
library(raster)
## Example SpatialPolygonsDataFrame
data(wrld_simpl) #polygon of world countries
bound <- wrld_simpl[1:25,] #name it this to subset to 25 countries and because my loop is set up with that variable
## Example RasterLayer
c <- raster(nrow=2e3, ncol=2e3, crs=proj4string(wrld_simpl), xmn=-180, xmx=180, ymn=-90, ymx=90)
c[] <- 1:length(c)
#plot, so you can see it
plot(c)
plot(bound, add=TRUE)
Найшвидший метод поки що
result <- data.frame() #empty result dataframe
system.time(
for (i in 1:nrow(bound)) { #this is the number of polygons to iterate through
single <- bound[i,] #selects a single polygon
clip1 <- crop(c, extent(single)) #crops the raster to the extent of the polygon, I do this first because it speeds the mask up
clip2 <- mask(clip1,single) #crops the raster to the polygon boundary
ext<-extract(clip2,single) #extracts data from the raster based on the polygon bound
tab<-lapply(ext,table) #makes a table of the extract output
s<-sum(tab[[1]]) #sums the table for percentage calculation
mat<- as.data.frame(tab)
mat2<- as.data.frame(tab[[1]]/s) #calculates percent
final<-cbind(single@data$NAME,mat,mat2$Freq) #combines into single dataframe
result<-rbind(final,result)
})
user system elapsed
39.39 0.11 39.52
Паралельна обробка
Паралельна обробка скоротила час користувача вдвічі, але заперечила перевагу, подвоївши системний час. Растр використовує це для функції вилучення, але, на жаль, не для функції врожаю чи маски. На жаль, це залишає трохи більший обсяг часу, що минув через "очікування навколо" IO ".
beginCluster( detectCores() -1) #use all but one core
запустити код на декількох ядрах:
user system elapsed
23.31 0.68 42.01
потім закінчіть кластер
endCluster()
Повільний метод: Альтернативний метод виконання витягу безпосередньо з функції растру займає набагато більше часу, і я не впевнений в управлінні даними, щоб ввести його в потрібну форму:
system.time(ext<-extract(c,bound))
user system elapsed
1170.64 14.41 1186.14