【问题标题】:Speed up raster::extract with weights in r使用 r 中的权重加速 raster::extract
【发布时间】:2018-09-21 11:16:38
【问题描述】:

我想从 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

【问题讨论】:

    标签: r vector parallel-processing extract raster


    【解决方案1】:

    最后我使用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 精确,但它确实完成了工作。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢。我试过beginCluster。它检测到 8 个内核并让 7 个可用,但随后只使用了 1 个节点(由系统监视器确认)。
      • 它为每个多边形使用一个节点,我想你只有一个多边形。
      • 是的,我只有一个多边形。
      猜你喜欢
      • 2020-07-25
      • 2021-10-19
      • 1970-01-01
      • 2021-08-12
      • 2017-09-22
      • 1970-01-01
      • 2020-12-15
      • 2015-05-08
      • 1970-01-01
      相关资源
      最近更新 更多