我想从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
答案 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
精确,但它确实可以完成工作。