我正在从基于数千个多边形边界的栅格中提取不同土地利用类型的面积和覆盖率。我发现,如果我遍历每个单独的多边形并进行裁剪,然后将栅格蒙版减小到特定多边形的大小,则提取功能的运行速度会更快。尽管如此,它的运行速度很慢,我想知道是否有人对提高我的代码效率和速度有任何建议。
我发现与此相关的唯一的事情就是这个响应由Roger Bivand使用谁建议GDAL.open()
,并GDAL.close()
作为以及getRasterTable()
和getRasterData()
。我研究了这些内容,但过去在gdal上遇到过麻烦,并且对它的了解不够深,不知道如何实现它。
可重现的示例:
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)
迄今为止最快的方法
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
并行处理
并行处理将用户时间减少了一半,但通过将系统时间加倍却没有带来好处。栅格将其用于提取功能,但不幸的是,剪裁或遮罩功能不使用此功能。不幸的是,由于“ IO”的“等待”,这留下了相当大的总经过时间。
beginCluster( detectCores() -1) #use all but one core
在多个内核上运行代码:
user system elapsed
23.31 0.68 42.01
然后结束集群
endCluster()
慢速方法: 直接从栅格函数提取数据的另一种方法花费的时间更长,而且我不确定数据管理是否可以将其转换为所需的形式:
system.time(ext<-extract(c,bound))
user system elapsed
1170.64 14.41 1186.14