如果您想实现calc(y, fun=mean,...) 之类的操作,您可以获取栅格的最小公共范围,并将它们全部裁剪到该范围,然后再将它们堆叠在一起并应用操作。
假设您有三个栅格:
# Generate 3 dummy rasters with different extents
r1 <- raster( crs="+proj=utm +zone=31")
extent(r1) <- extent(0, 100, 0, 500)
res(r1) <- c(5, 5)
values(r1) <- sample(10, ncell(r1), replace=TRUE)
r2 <- raster( crs="+proj=utm +zone=31")
extent(r2) <- extent(10, 120, -10, 400)
res(r2) <- c(5, 5)
values(r2) <- runif(ncell(r2), 1, 10)
r3 <- raster( crs="+proj=utm +zone=31")
extent(r3) <- extent(50, 150, 30, 200)
res(r3) <- c(5, 5)
values(r3) <- runif(ncell(r3), 1, 10)
第一种方法:
# Summing your rasters will only work where they are not NA
r123 = r1+r2+r3 # r123 has the minimal common extent
r1 = crop(r1, r123) # crop to that minimal extent
r2 = crop(r2, r123)
r3 = crop(r3, r123)
s123 = stack(r1, r2, r3)
s123.mean = calc(s123, fun=mean)
另一个:
# Manually compute the minimal extent
xmin <- max(bbox(r1)[1,1], bbox(r2)[1,1], bbox(r3)[1,1])
xmax <- min(bbox(r1)[1,2], bbox(r2)[1,2], bbox(r3)[1,2])
ymin <- max(bbox(r1)[2,1], bbox(r2)[2,1], bbox(r3)[2,1])
ymax <- min(bbox(r1)[2,2], bbox(r2)[2,2], bbox(r3)[2,2])
newextent=c(xmin, xmax, ymin, ymax)
r1 = crop(r1, newextent)
r2 = crop(r2, newextent)
r3 = crop(r3, newextent)
s123 = stack(r1, r2, r3)
s123.mean = calc(s123, fun=mean)
我不太确定您到底想要什么,但是如果您真的想保持所有栅格完整(没有crop 操作),您还可以计算最大范围(与上面的第二种方法相同,只需反转min 和 max) 和 extend 在堆叠之前将所有栅格放到那个栅格上(同样的,您最终会得到更大的栅格,其中充满了 NA ......不确定这是否真的需要):
xmin <- min(bbox(r1)[1,1], bbox(r2)[1,1], bbox(r3)[1,1])
xmax <- max(bbox(r1)[1,2], bbox(r2)[1,2], bbox(r3)[1,2])
ymin <- min(bbox(r1)[2,1], bbox(r2)[2,1], bbox(r3)[2,1])
ymax <- max(bbox(r1)[2,2], bbox(r2)[2,2], bbox(r3)[2,2])
newextent=c(xmin, xmax, ymin, ymax)
r1 = extend(r1, newextent)
r2 = extend(r2, newextent)
r3 = extend(r3, newextent)
s123 = stack(r1, r2, r3)
s123.mean = calc(s123, fun=mean)
这有帮助吗?
注意
您可能不想使用 setExtent() 或 extent() <- extent(),因为您可能会以错误的栅格地理坐标结束(即,范围会被修改,但内容不会被修改,因此您实际上会翻译您的栅格可能没有针对这一点,因为它们之间产生的重叠在物理上是没有意义的)。