通过在R中填充NA来使栅格达到相同程度

时间:2015-06-29 11:29:52

标签: r stack spatial raster calc

我有几个具有不同几何/轮廓的裁剪栅格。具体而言,空间产量图来自同一领域的几年,但程度各不相同 - 测量结果并不总是整个领域,但在某些年份只是其中的一部分。 我想计算这些地图的平均值,并将它们组合成一个平均值栅格。然而,这确实意味着,并非对于每个像素来说,5层/栅格都有一个值。我可以接受这些缺失值为NA,因此最终的平均值只能通过让3个栅格用于场的部分来计算,其中地图不重叠。

我想用扩展{raster}'扩展栅格,用NA值填充非重叠部分:

y <- extend(y, shape, value=NA) #Shape是一个矩形形状,可以包含所有的yield map rasters

对于所有栅格,这都很好。但他们仍然没有相同的程度。即使我将范围调整为setExtent()extent() <- extent()到矩形shapefile的范围,甚至调整到其他扩展栅格之一,我仍然得到:

compareRaster(x)出错:不同的数字或列

..当我想要堆叠它们并使用calc(y, fun=mean,...)时。原始栅格范围与重新采样太不相同。但它们确实具有相同的分辨率和CRS。

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

如果要实现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操作),你也可以计算最大范围(与上面的第二种方法相同,在堆叠它们之前,只需将minmax)和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(),因为您可能会以错误的栅格地理坐标结束(即,范围会被修改,但不是内容,所以你' d实际上可以翻译你的栅格而不是针对它,因为它们之间产生的重叠在物理上是没有意义的。)

答案 1 :(得分:0)

我有同样的问题来攻击一些栅格,这些栅格包含bioclim数据。我确实正确裁剪,但是以不同的分辨率下载它们。查看每个栅格的列数。只需在R中键入栅格(文件)的名称即可完成。它们的大小可能相同。我希望我能以某种方式提供帮助。