如何将栅格数据更改为特定的空间分辨率?

3
我想改变栅格的分辨率。例如,我们可以以大约30米分辨率的Landsat 7图像为例。
library(terra)
#> terra 1.5.21

f <- system.file("tif/L7_ETMs.tif", package = "stars")
r <- rast(f)

# 30m x 30m resolution
res(r)
#> [1] 28.5 28.5

plot(r, 1)

我可以使用aggregate()和整数因子,例如:
# 10 * 28.5
r2 <- aggregate(r, fact = 10)
res(r2)
#> [1] 285 285

plot(r2, 1)

我的问题是,我如何指定一个精确的分辨率。例如,我想要一个像素分辨率为1.234公里(1234米)。
fact <- 1234 / 28.5
fact
#> [1] 43.29825

r3 <- aggregate(r, fact = fact)
res(r3)
#> [1] 1225.5 1225.5

plot(r3, 1)

文档说明fact应该是一个整数,因此这里将fact向下取整为43。
res(aggregate(r, 43))
#> [1] 1225.5 1225.5

有没有办法获得1234米的精确分辨率?
创建于2022-04-28,使用reprex package (v2.0.1)。

1
必须制作一个由大小规则的单元格组成的光栅。如果您的原始数据的尺寸不是您选择的分辨率的倍数,则您的单元格将不等于原始光栅的范围。在“聚合”中输入小数意味着您希望在生成的光栅中有小数个单元格,这实际上是没有意义的。当然,如果允许裁剪,那么应该是可能的,但似乎没有包括这个选项。我猜您可以将光栅裁剪到“fact”的倍数,然后再进行聚合? - Allan Cameron
感谢@AllanCameron的回复。这就是我卡住的地方。我不介意挑选一点,但我有点迷失了。您是否有任何资源或指导提供?如何使用因子剪裁r?是否可以在之前创建所需分辨率的网格,并将r“转换”为它? - Philippe Massicotte
2个回答

3
我想出了这个解决方案,它似乎给了我我所需要的东西。
library(terra)
#> terra 1.5.21

f <- system.file("tif/L7_ETMs.tif", package = "stars")
r <- rast(f)

plot(r, 1)

r2 <- r
res(r2) <- 1234
r2 <- resample(r, r2)

plot(r2, 1)

res(r2)
#> [1] 1234 1234

此内容由reprex包 (v2.0.1)于2022年4月28日创建。


1
我正要发布一个非常类似的解决方案,使用“resample”,但这个也很好! - Allan Cameron
谢谢你,@AllanCameron。你之前的回答引导我以不同的方式来处理这个问题。 - Philippe Massicotte

1

我还建议(如 terra 文献所述)您首先尽可能地聚合光栅图像,然后再重新采样。可以使用模板光栅图像进行重新采样,以保证正确的 crs、尺寸等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接