如何计算两个栅格图层中有多少像素共享相同的值?
How can I calculate how many pixels share the same value in two raster layers?
我制作了一个具有相同范围的两层堆叠栅格,其中包含有关整个区域存在两种不同事物的信息。两者都是二进制的;每个像素的值为 1(存在)或 0(不存在)。
这是栅格的描述:
> stacked
class : SpatRaster
dimensions : 166, 1622, 2 (nrow, ncol, nlyr)
resolution : 0.1666667, 0.1666667 (x, y)
extent : -131.5, 138.8333, 36.33333, 64 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 (EPSG:4326)
sources : memory
memory
names : lyr1, lyr1
min values : 0, 0
max values : 1, 1
如何使用条件提取两层中 value = 1 的像素数?
当这两个区域是单独的栅格时,我尝试了一些方法,但没有成功,所以我使用 extend() 来扩大它们的范围,以便它们可以共享一个公共区域。我认为这意味着那里会有 NA 以及 1 和 0。
我试过以下方法:
> freq(stacked, value = 1)
layer value count
[1,] 1 1 12243
[2,] 2 1 14804
但这只是分别计算每个层中有多少像素的值为 1,而我需要的是两个层的值都为 1 的像素数,因此它们匹配。
非常感谢任何提示!
如果我完全理解您的要求,请在下面找到一种可能的解决方案。
Reprex
library(terra)
# Build a dummy Spatraster with two layers containing only 1 and 0
set.seed(0) # for reproducibility
r <- rast(nrows=10, ncols=10, nlyrs=2)
values(r) <- sample(c(1,0), 200, replace = TRUE)
r
#> class : SpatRaster
#> dimensions : 10, 10, 2 (nrow, ncol, nlyr)
#> resolution : 36, 18 (x, y)
#> extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
#> coord. ref. : lon/lat WGS 84
#> source : memory
#> names : lyr.1, lyr.2
#> min values : 0, 0
#> max values : 1, 1
# If you use terra::freq(), you get the number of cells with 0 and 1 for each layer
terra::freq(r)
#> layer value count
#> [1,] 1 0 52
#> [2,] 1 1 48
#> [3,] 2 0 47
#> [4,] 2 1 53
# So, one approach is to sum the two layers and retrieve the number of cells with 2
# (here 24 cells have the value 1 in the two layers)
terra::freq(sum(r))
#> layer value count
#> [1,] 1 0 23
#> [2,] 1 1 53
#> [3,] 1 2 24
# OR more directly:
terra::freq(sum(r), value = 2)[, 'count']
#> count
#> 24
由 reprex package (v2.0.1)
于 2022 年 3 月 15 日创建
我制作了一个具有相同范围的两层堆叠栅格,其中包含有关整个区域存在两种不同事物的信息。两者都是二进制的;每个像素的值为 1(存在)或 0(不存在)。
这是栅格的描述:
> stacked
class : SpatRaster
dimensions : 166, 1622, 2 (nrow, ncol, nlyr)
resolution : 0.1666667, 0.1666667 (x, y)
extent : -131.5, 138.8333, 36.33333, 64 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 (EPSG:4326)
sources : memory
memory
names : lyr1, lyr1
min values : 0, 0
max values : 1, 1
如何使用条件提取两层中 value = 1 的像素数?
当这两个区域是单独的栅格时,我尝试了一些方法,但没有成功,所以我使用 extend() 来扩大它们的范围,以便它们可以共享一个公共区域。我认为这意味着那里会有 NA 以及 1 和 0。
我试过以下方法:
> freq(stacked, value = 1)
layer value count
[1,] 1 1 12243
[2,] 2 1 14804
但这只是分别计算每个层中有多少像素的值为 1,而我需要的是两个层的值都为 1 的像素数,因此它们匹配。
非常感谢任何提示!
如果我完全理解您的要求,请在下面找到一种可能的解决方案。
Reprex
library(terra)
# Build a dummy Spatraster with two layers containing only 1 and 0
set.seed(0) # for reproducibility
r <- rast(nrows=10, ncols=10, nlyrs=2)
values(r) <- sample(c(1,0), 200, replace = TRUE)
r
#> class : SpatRaster
#> dimensions : 10, 10, 2 (nrow, ncol, nlyr)
#> resolution : 36, 18 (x, y)
#> extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
#> coord. ref. : lon/lat WGS 84
#> source : memory
#> names : lyr.1, lyr.2
#> min values : 0, 0
#> max values : 1, 1
# If you use terra::freq(), you get the number of cells with 0 and 1 for each layer
terra::freq(r)
#> layer value count
#> [1,] 1 0 52
#> [2,] 1 1 48
#> [3,] 2 0 47
#> [4,] 2 1 53
# So, one approach is to sum the two layers and retrieve the number of cells with 2
# (here 24 cells have the value 1 in the two layers)
terra::freq(sum(r))
#> layer value count
#> [1,] 1 0 23
#> [2,] 1 1 53
#> [3,] 1 2 24
# OR more directly:
terra::freq(sum(r), value = 2)[, 'count']
#> count
#> 24
由 reprex package (v2.0.1)
于 2022 年 3 月 15 日创建