Wyciągam obszar i procent pokrycia różnych rodzajów użytkowania gruntów z rastra opartego na kilku tysiącach granic wielokąta. Przekonałem się, że funkcja wyodrębniania działa znacznie szybciej, jeśli iteruję po każdym wielokącie i przycinam, a następnie maskuje raster do rozmiaru określonego wielokąta. Niemniej jednak jest dość powolny i zastanawiam się, czy ktoś ma jakieś sugestie dotyczące poprawy wydajności i szybkości mojego kodu.
Jedyne, co znalazłem w związku z tym, to odpowiedź Rogera Bivanda, który zasugerował użycie, GDAL.open()
a GDAL.close()
także getRasterTable()
i getRasterData()
. Przyjrzałem się tym, ale w przeszłości miałem problemy z Gdalem i nie znam go wystarczająco dobrze, aby wiedzieć, jak go wdrożyć.
Powtarzalny przykład:
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)
Jak dotąd najszybsza metoda
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
Przetwarzanie równoległe
Przetwarzanie równoległe skróciło czas użytkownika o połowę, ale podważyło korzyści wynikające z podwojenia czasu systemowego. Raster używa tego do funkcji wyodrębniania, ale niestety nie do funkcji przycinania lub maskowania. Niestety pozostawia to nieco więcej całkowitego czasu, który upłynął z powodu „oczekiwania” przez „IO”.
beginCluster( detectCores() -1) #use all but one core
uruchom kod na wielu rdzeniach:
user system elapsed
23.31 0.68 42.01
następnie zakończ klaster
endCluster()
Powolna metoda: alternatywna metoda wyodrębniania bezpośrednio z funkcji rastra zajmuje dużo więcej czasu i nie jestem pewien, czy zarządzanie danymi doprowadzi ją do żądanej formy:
system.time(ext<-extract(c,bound))
user system elapsed
1170.64 14.41 1186.14