【问题标题】:Bring rasters to same extent by filling with NA - in R通过在 R 中填充 NA - 使栅格达到相同程度
【发布时间】:2015-09-15 20:22:52
【问题描述】:

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

我想用 'extend{raster}' 扩展光栅,用 NA 值填充不重叠的部分:

y <- extend(y, shape, value=NA) #Shape 是一个矩形形状,包含所有产量地图栅格

这对所有栅格都有效。但是它们仍然没有相同的程度。即使我通过setExtent()extent() <- extent() 将范围调整到矩形形状文件的范围,甚至调整到其他扩展栅格之一,我仍然得到:

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

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

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

【问题讨论】:

  • 也许this 接近?

标签: r stack spatial raster calc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您想实现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() &lt;- extent(),因为您可能会以错误的栅格地理坐标结束(即,范围会被修改,但内容不会被修改,因此您实际上会翻译您的栅格可能没有针对这一点,因为它们之间产生的重叠在物理上是没有意义的)。

    【讨论】:

    • 谢谢ztl!我最终折腾了 2 个栅格集,其范围比其他 4 个要小得多。然后我选择了您的最小范围方法,该方法效果很好。感谢您的帮助!
    • 很高兴它有帮助。如果您认为答案解决了您的问题,您可以考虑投票和/或接受它,以防将来对其他人有所帮助...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 2017-05-02
    • 2021-07-11
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多