r - 在 terra SpatRaster 中命名分类级别时,如何防止添加额外级别?

标签 r raster terra

我有一个包含 21 个类别的分类栅格:

>lc_2003

class       : SpatRaster 
dimensions  : 685, 827, 1  (nrow, ncol, nlyr)
resolution  : 4477.525, 4477.525  (x, y)
extent      : 4224289, 7927202, 2358424, 5425529  (xmin, xmax, ymin, ymax)
coord. ref. : NAD83 / Statistics Canada Lambert 
source      : memory 
name        : PHYSIOG 
min value   :       1 
max value   :      21 

>levels(lc_2003)
[[1]]
[1] ""

我想为每个分类级别指定一个名称。然而,当我这样做时,似乎添加了一个额外的级别,因此现在有 22 个级别。列表开头有一个额外的“NA”级别。

landcover_classes_cavmVec <- data.frame(lc_code = 1:21, lc_class = c("Cryptogam, herb barren", "Rush/grass, forb, cryptogam tundra", "Cryptogam barren complex (bedrock)",
                                                                     "Prostrate dwarf-shrub, herb tundra", "Graminoid, prostrate dwarf-shrub, forb tundra", "Prostrate/Hemiprostrate dwarf-shrub tundra", "Nontussock sedge, dwarf-shrub, moss tundra",
                                                                     "Tussock-sedge, dwarf-shrub, moss tundra", "Erect dwarf-shrub tundra", "Low-shrub tundra", "Missing (Cryprogram dwarf-shrub?)", "Sedge/grass, moss wetland",
                                                                     "Sedge, moss, dwarf-shrub wetland", "Sedge, moss, low-shrub wetland", "Noncarbonate mountain complex", "Carbonate mountain complex", "Nunatak complex",
                                                                     "Glaciers", "Water", "Lagoon", "Non-Arctic areas"))

>levels(lc_2003) <- landcover_classes_cavmVec

> levels(lc_2003)
[[1]]
 [1] NA                                              "Cryptogam, herb barren"                       
 [3] "Rush/grass, forb, cryptogam tundra"            "Cryptogam barren complex (bedrock)"           
 [5] "Prostrate dwarf-shrub, herb tundra"            "Graminoid, prostrate dwarf-shrub, forb tundra"
 [7] "Prostrate/Hemiprostrate dwarf-shrub tundra"    "Nontussock sedge, dwarf-shrub, moss tundra"   
 [9] "Tussock-sedge, dwarf-shrub, moss tundra"       "Erect dwarf-shrub tundra"                     
[11] "Low-shrub tundra"                              "Missing (Cryprogram dwarf-shrub?)"            
[13] "Sedge/grass, moss wetland"                     "Sedge, moss, dwarf-shrub wetland"             
[15] "Sedge, moss, low-shrub wetland"                "Noncarbonate mountain complex"                
[17] "Carbonate mountain complex"                    "Nunatak complex"                              
[19] "Glaciers"                                      "Water"                                        
[21] "Lagoon"                                        "Non-Arctic areas" 

如何防止这种情况发生?

额外问题:检查 landcover_classes_cavmVec 中的 lc_code 变量是否确实与原始 1:21 中的等效数字匹配的好策略是什么lc_2003 级别?我不知道如何验证这段代码是否达到了我想要的效果。

最佳答案

这是从 ?terra::levels 复制的

library(terra)
r <- rast(nrows=10, ncols=10)
set.seed(0)
values(r) <- sample(3, ncell(r), replace=TRUE)

我们有一个值为 1、2 和 3 的栅格。

您可以像这样分配类别

cls <- c("forest", "water", "urban")
d <- data.frame(id=1:3, cover=cls)
levels(x) <- d
x

levels(x)
#[[1]]
#[1] NA       "forest" "water"  "urban" 

cats(x)
#[[1]]
#  ID  cover
#1  0   <NA>
#2  1 forest
#3  2  water
#4  3  urban

因此对于值为零的单元格还有一个附加类别。这是为了适应 GDAL 库读取和写入类别的方式(假设值在 0 到 255 之间)。这就是您所看到的,这是正确的。

或者,您可以更改光栅,使其从零开始

x <- r - 1
levels(x) <- cls
names(x) <- "land cover"
levels(x)
#[[1]]
#[1] "forest" "water"  "urban" 

cats(x)
#[[1]]
#  ID category
#1  0   forest
#2  1    water
#3  2    urban

该手册还显示了以下方法。也就是说,为缺失的级别添加另一个(空)标签(在本例中为零)。

levels(r) <- c("", cls)

关于r - 在 terra SpatRaster 中命名分类级别时,如何防止添加额外级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70440038/

相关文章:

R highcharts多堆积条形图

r - 将多列相互相乘成R中的新数据框

r - 在 R 中裁剪光栅

r - 如何从 terra SpatRaster 构造经度、纬度、值数据框

r - 如何创建 SpatRaster (terra) 的可重现示例?

r - 如何在地形或栅格中执行邻域分析并保持输入的相同 NA 像元?

r - 如果该行包含任何 "TRUE",则保留该行

r - navebarMenu 始终突出显示

python - 使用 Python 将纬度、经度、值 CSV 转换为栅格 map

r - 将栅格聚合到更粗糙的现有网格——加权贡献像素