Saya mengekstraksi area dan persen tutupan berbagai jenis penggunaan lahan dari raster berdasarkan beberapa ribu batas poligon. Saya telah menemukan bahwa fungsi ekstrak bekerja lebih cepat jika saya mengulangi setiap poligon dan memotong masing-masing lalu menutupi raster ke ukuran poligon tertentu. Meskipun demikian, ini sangat lambat, dan saya bertanya-tanya apakah ada yang punya saran untuk meningkatkan efisiensi dan kecepatan kode saya.
Satu-satunya hal yang saya temukan terkait dengan ini adalah tanggapan oleh Roger Bivand yang menyarankan menggunakan GDAL.open()
dan GDAL.close()
juga getRasterTable()
dan getRasterData()
. Saya melihat itu, tetapi memiliki masalah dengan gdal di masa lalu dan tidak cukup tahu untuk menerapkannya.
Contoh yang Dapat Diproduksi:
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)
Metode tercepat sejauh ini
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
Proses paralel
Pemrosesan paralel memotong waktu pengguna hingga setengahnya, tetapi meniadakan manfaatnya dengan menggandakan waktu sistem. Raster menggunakan ini untuk fungsi ekstrak, tetapi sayangnya tidak untuk fungsi crop atau mask. Sayangnya, ini meninggalkan jumlah total waktu berlalu yang sedikit lebih besar karena "menunggu" oleh "IO."
beginCluster( detectCores() -1) #use all but one core
jalankan kode pada banyak core:
user system elapsed
23.31 0.68 42.01
lalu akhiri cluster
endCluster()
Metode Lambat: Metode alternatif melakukan ekstrak langsung dari fungsi raster membutuhkan banyak waktu lebih lama, dan saya tidak yakin tentang manajemen data untuk memasukkannya ke dalam formulir yang saya inginkan:
system.time(ext<-extract(c,bound))
user system elapsed
1170.64 14.41 1186.14