spatialEco::zonal.stats 使用exactextractr(我没有检查代码,但它告诉我安装它以便能够使用zonal.stats)如果您正在考虑多边形应该更准确(光栅包将它们变成首先进入光栅,见下面的zonal)。然而,下面的例子(这只是一种情况)表明 spatialEco 不太精确。
示例(避免使用随机数,但如果您确实使用它们,请使用set.seed)。我从非常大的网格单元开始。
library(raster)
library(spatialEco)
ras <- raster(nrows=4, ncols=4, xmn=0, xmx=1000, ymn=0, ymx=800)
values(ras) <- 1:ncell(ras)
set.seed(1)
xy <- cbind(runif(3,0,1000), runif(3,0,800))
xy <- rbind(xy, xy[1,])
sp <- spPolygons(xy, attr=data.frame(x=1))
### zonal statistics using "spatialECO"
zonal.stats(sp, ras, stats="mean")
# mean.layer
#1 7
### zonal statistics using "raster"
extract(ras, sp, fun=mean)
# [,1]
#[1,] 6
### same as
# x <- rasterize(sp, ras)
# zonal(ras, x, "mean")
使用栅格,您还可以像这样获得更精确的估计
e <- extract(ras, sp, weights=T)[[1]]
weighted.mean(e[,1], e[,2])
#[1] 5.269565
查看使用了多少个单元格
zonal.stats(sp, ras, stats="counter")
# counter.layer
#1 6
extract(ras, sp, fun=function(x,...)length(x))
# [,1]
#[1,] 3
查看此问题的一种方法是创建更高分辨率的栅格数据。
分辨率提高 10 倍,数值相同
ras <- disaggregate(ras, 10)
zonal.stats(sp, ras, stats="mean")
# mean.layer
#1 5.5
extract(ras, sp, fun=mean)
# [,1]
#[1,] 5.245614
zonal.stats(sp, ras, stats="counter")
# counter.layer
#1 218
extract(ras, sp, fun=function(x,...)length(x))
# [,1]
#[1,] 171
分辨率提高 100 倍,值相同
ras <- disaggregate(ras, 10)
zonal.stats(sp, ras, stats="mean")
#mean.layer
#1 5.299915
extract(ras, sp, small=TRUE, fun=mean)
# [,1]
#[1,] 5.271039
zonal.stats(sp, ras, stats="counter")
# counter.layer
#1 17695
extract(ras, sp, fun=function(x,...)length(x))
# [,1]
#[1,] 17289
在最高分辨率下,平均值相似(细胞数量的相对差异很小);但是栅格在较低的分辨率(以及加权平均值)下更接近正确的值(无论是什么,确切地说)。这是出乎意料的。
为了更快的速度,现在还有terra 包
library(terra)
r <- rast(ras)
v <- vect(sp)
extract(r, v, "mean")
# ID layer
#[1,] 1 5.271039