Tôi đang trích xuất diện tích và tỷ lệ phần trăm của các loại sử dụng đất khác nhau từ một raster dựa trên hàng ngàn ranh giới đa giác. Tôi đã thấy rằng hàm trích xuất hoạt động nhanh hơn nhiều nếu tôi lặp qua từng đa giác riêng lẻ và cắt sau đó che dấu raster xuống kích thước của đa giác cụ thể. Tuy nhiên, nó khá chậm và tôi tự hỏi liệu có ai có bất kỳ đề xuất nào để cải thiện hiệu quả và tốc độ mã của tôi không.
Điều duy nhất tôi tìm thấy liên quan đến điều này là phản hồi này của Roger Bivand, người đã đề xuất sử dụng GDAL.open()
và GDAL.close()
cũng như getRasterTable()
và getRasterData()
. Tôi đã xem xét những thứ đó, nhưng đã gặp rắc rối với gdal trong quá khứ và không biết nó đủ rõ để biết cách thực hiện nó.
Ví dụ sinh sản:
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)
Phương pháp nhanh nhất cho đến nay
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
Tiến trình song song
Xử lý song song giúp giảm một nửa thời gian của người dùng, nhưng phủ nhận lợi ích bằng cách nhân đôi thời gian hệ thống. Raster sử dụng chức năng này cho chức năng giải nén, nhưng không may cho chức năng cắt xén hoặc mặt nạ. Thật không may, điều này để lại một lượng lớn thời gian trôi qua do "chờ đợi xung quanh" bởi "IO".
beginCluster( detectCores() -1) #use all but one core
chạy mã trên nhiều lõi:
user system elapsed
23.31 0.68 42.01
sau đó kết thúc cụm
endCluster()
Phương pháp chậm: Phương pháp thay thế để thực hiện trích xuất trực tiếp từ chức năng raster mất nhiều thời gian hơn và tôi không chắc chắn về việc quản lý dữ liệu để đưa nó vào dạng tôi muốn:
system.time(ext<-extract(c,bound))
user system elapsed
1170.64 14.41 1186.14