加快raster :: R中的权重提取

时间:2018-09-21 11:16:39

标签: r vector parallel-processing extract raster

我想从r中的多边形定义的区域范围中提取栅格值的精确平均值。使用raster::extract和选项weights=TRUE可以正常工作。但是,对于大栅格,此操作变得异常缓慢,并且该函数似乎未并行化,因此beginCluster() ... endCluster()不会加快处理速度。 我需要提取一系列栅格的值,此处以r,r10和r100为例。是否有办法在r中加快速度?或者在GDAL中有其他方法可以做到这一点?

r <- raster(nrow=1000, ncol=1000, vals=sample(seq(0,0.8,0.01),1000000,replace=TRUE))
r10 <- aggregate(r, fact=10)
r100 <- aggregate(r, fact=100)

v = Polygons(list(Polygon(cbind(c(-100,100,80,-120), c(-70,0,70,0)))), ID = "a")
v = SpatialPolygons(list(v))

plot(r)
plot(r10)
plot(r100)
plot(v, add=T)

system.time({
precise.mean <- raster::extract(r100, v, method="simple",weights=T, normalizeWeights=T, fun=mean)    
})
user  system elapsed 
0.251   0.000   0.253 
> precise.mean
      [,1]
[1,] 0.3994278    


system.time({
  precise.mean <- raster::extract(r10, v, method="simple",weights=T, normalizeWeights=T, fun=mean)    
})

user  system elapsed 
7.447   0.000   7.446 

precise.mean
      [,1]
[1,] 0.3995429

r1000 and the area to be extracted

2 个答案:

答案 0 :(得分:0)

如果您首先调用beginCluster,它实际上应该运行得更快(然后该函数处理并行化)。更好的方法是使用版本2.7-14,该版本的实现要快得多。 CRAN目前正在对其进行审核,但您也可以在此处获取它:https://github.com/rspatial/raster

答案 1 :(得分:0)

最后,我使用gdalUtils直接在硬盘上工作来解决这个问题。

我使用命令gdalwarp()将栅格分辨率降低到r10,100。 然后gdalwarp()将所得栅格的分辨率提高到r的原始分辨率。 然后将gdalwarp()cutline= "v.shp", crop_to_cutline =T一起将栅格掩蔽为向量v。 然后将gdalinfo()subset(x(grep("Mean=",x)))组合以提取平均值。 所有这些都打包在foreach() %dopar%循环中,以处理许多栅格和分辨率。

虽然很复杂,但可能不如extract::raster精确,但它确实可以完成工作。