Binlerce poligon sınırına dayanan bir rasterden alanı ve farklı arazi kullanım türlerinin yüzde kapağını çıkarıyorum. Her bir poligonda yinelemeliyim ve kırparsam, ardından rasterini belirli poligonun boyutuna kadar maskelersem, ekstrakt fonksiyonunun çok daha hızlı çalıştığını gördüm. Bununla birlikte, oldukça yavaş ve kodumun verimliliğini ve hızını artırmak için herhangi bir öneriniz olup olmadığını merak ediyorum.
Ben bununla ilgili bulduk tek şey bu yanıtı kullanarak önerdi Roger Bivand tarafından GDAL.open()
ve GDAL.close()
hem de getRasterTable()
ve getRasterData()
. Bunlara baktım, ancak geçmişte gdal ile ilgili sorun yaşadım ve nasıl uygulanacağını bilecek kadar iyi tanımıyorum.
Tekrarlanabilir Örnek:
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)
Şimdiye kadarki en hızlı yöntem
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
Paralel işleme
Paralel işleme kullanıcı süresini yarı yarıya azaltır, ancak sistem süresini iki katına çıkartarak avantajı reddeder. Raster bunu ekstre işlevi için kullanır, ancak ne yazık ki kırpma veya maske işlevi için kullanılamaz. Maalesef, bu , “IO” tarafından “beklemekten” ötürü, belli miktarda daha büyük toplam geçen zaman bırakır .
beginCluster( detectCores() -1) #use all but one core
kodunu birden çok çekirdeğe kodla:
user system elapsed
23.31 0.68 42.01
sonra kümeyi sonlandır
endCluster()
Yavaş Yöntem: Doğrudan raster işlevinden özütleme yapmanın alternatif yöntemi çok daha uzun sürer ve veri yönetiminden istediğim forma sokmak konusunda emin değilim:
system.time(ext<-extract(c,bound))
user system elapsed
1170.64 14.41 1186.14