Yo soy la extracción de la zona y por ciento de cobertura de los diferentes tipos de uso de la tierra a partir de una trama basada en varios miles de polígono de límites. He encontrado que el extracto de la función funciona mucho más rápido si me iterar a través de cada polígono y de los cultivos, a continuación, la máscara de la trama hacia abajo para el tamaño de la particular polígono. Sin embargo, es bastante lento, y me pregunto si alguien tiene alguna sugerencia para mejorar la eficiencia y la velocidad de mi código.
La única cosa de la que me he encontrado con esto se relaciona esta respuesta por Roger Bivand que sugirió el uso de GDAL.open()
y GDAL.close()
así como getRasterTable()
y getRasterData()
. Miré esos, pero han tenido problemas con gdal en el pasado y no conoce lo suficientemente bien para saber cómo implementarlo.
Reproducible Ejemplo:
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)
Método más rápido hasta el momento
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
El Procesamiento En Paralelo
El procesamiento en paralelo de cortar el tiempo de los usuarios por la mitad, pero negado el beneficio de la duplicación de la hora del sistema. Trama utiliza esto para el extracto de la función, pero por desgracia no para el cultivo o la función de máscara. Por desgracia, esto deja un poquito más grande la cantidad de tiempo transcurrido total debido a "la espera" por el de "IO."
beginCluster( detectCores() -1) #use all but one core
ejecución de código en múltiples núcleos:
user system elapsed
23.31 0.68 42.01
después de finalizar el clúster
endCluster()
Lento Método: El método alternativo de hacer un extracto directamente de la trama de la función tiene un montón mucho más tiempo, y no estoy seguro acerca de la gestión de los datos a obtener en la forma que yo quiero:
system.time(ext<-extract(c,bound))
user system elapsed
1170.64 14.41 1186.14