在 R(terra 包)中的某些条件下将 SpatRaster 中的单元格值替换为另一个二进制堆叠的 SpatRaster

问题描述 投票:0回答:1

我有一个二进制堆叠的 SpatRaster bstacked_fht,其 25 层对应于不同森林栖息地类型的存在/不存在数据。我不想只有值 0 和 1,而是仅当值为 0.25 时才将值 1 替换为另一个 SpatRaster vit_dec 的相应像素。换句话说,仅当 bstacked_fht[[i]] = 1 且 vit_dec = 0.25 时才替换值。两层也都有 NULL 值。

print(bstacked_fht)
# class       : SpatRaster 
# dimensions  : 2370, 2513, 25  (nrow, ncol, nlyr)
# resolution  : 100, 100  (x, y)
# extent      : 280329.8, 531629.8, 5578461, 5815461  (xmin, xmax, ymin, ymax)
# coord. ref. : ETRS89 / UTM zone 32N (EPSG:25832) 
# sources     : spat_nx7E84x54c8tnTN_24884.tif  
# spat_nx7E84x54c8tnTN_24884.tif  (17 layers) 
# spat_nx7E84x54c8tnTN_24884.tif  (7 layers) 
# names       : class_1, class_3, class_4, class_5, class_6, class_7, ... 
# min values  :       0,       0,       0,       0,       0,       0, ... 
# max values  :       1,       1,       1,       1,       1,       1, ... 


freq(bstacked_fht)
# layer value count
# 1      1     0 91763
# 2      1     1   524
# 3      2     0 88677
# 4      2     1  3610
# 5      3     0 92281
# 6      3     1     6
# 7      4     0 92281
# 8      4     1     6
# 9      5     0 91933
# 10     5     1   354
# 11     6     0 80878
# 12     6     1 11409
# 13     7     0 92106
# 14     7     1   181
# 15     8     0 89741
# 16     8     1  2546
# 17     9     0 92268
# 18     9     1    19
# 19    10     0 90569
# 20    10     1  1718
# 21    11     0 92245
# 22    11     1    42
# 23    12     0 92141
# 24    12     1   146
# 25    13     0 55803
# 26    13     1 36484
# 27    14     0 92280
# 28    14     1     7
# 29    15     0 69071
# 30    15     1 23216
# 31    16     0 91796
# 32    16     1   491
# 33    17     0 85216
# 34    17     1  7071
# 35    18     0 92105
# 36    18     1   182
# 37    19     0 91956
# 38    19     1   331
# 39    20     0 89634
# 40    20     1  2653
# 41    21     0 91160
# 42    21     1  1127
# 43    22     0 92286
# 44    22     1     1
# 45    23     0 92131
# 46    23     1   156
# 47    24     0 92282
# 48    24     1     5
# 49    25     0 92285
# 50    25     1     2

print(vit_dec)
# class       : SpatRaster 
# dimensions  : 2370, 2513, 1  (nrow, ncol, nlyr)
# resolution  : 100, 100  (x, y)
# extent      : 280329.8, 531629.8, 5578461, 5815461  (xmin, xmax, ymin, ymax)
# coord. ref. : ETRS89 / UTM zone 32N (EPSG:25832) 
# source(s)   : memory
# name        : vitality_highly_decreased_25832 
# min value   :                            0.00 
# max value   :                            0.25 

freq(vit_dec)
#   layer value  count
# 1     1     0 186034

我尝试过各种方法但没有成功。比如:

function(bstacked_fht, vit_dec, thresh = 0.5, vit_dec_thresh = 0.20) {
    result <- list()
    
  for (i in 1:25) {
        layer <- bstacked_fht[[i]]
        
        higher <- layer > thresh & vit_layer > vit_dec_thresh
        layer[higher] <- vit_layer[higher]
        
        result[[i]] <- layer
    }
    
    names(result) <- names(bstacked_fht)
    return(result)
}

for (i in 1:25) {
    a_layer <- bstacked_fht[[i]]
    
    a_layer[] <- ifelse(a_layer[] > 0.5 & vit_dec[] > 0.2, vit_dec[], a_layer[])
    
    bstacked_fht[[i]] <- a_layer
}

这在仅可能有二进制值的二进制堆叠栅格中可能不可行。我的想法快用完了。 您对如何做有什么建议吗?我应该将 bstacked_fht 转换为另一种类型的对象吗?

r raster terra
1个回答
0
投票

没有您的数据,但也许

mask
就是您正在寻找的

library(terra) 
set.seed(42)
present = array(sample(c(0,1), 216L, replace = TRUE), dim = c(6,6,6))
present_r = rast(present)
sick = rast(matrix(sample(c(0, 0.25), 36L, replace = TRUE, prob=c(0.97, 0.03)), ncol =6)) #prob approx your present/sick
#plot(sick) - just to check we got one or so cells under sample probs
present_r_masked = mask(present_r, sick, maskvalues = 0.25, updatevalue = 0.25)

也许吧。

© www.soinside.com 2019 - 2024. All rights reserved.