在R中重新分类栅格

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

我有一个光栅图像,其中的NDVI值在-0.2到0.6之间

NDVI  
#class      : RasterLayer 
#dimensions : 706, 953, 672818  (nrow, ncol, ncell)
#resolution : 30, 30  (x, y)
#extent     : 368085, 396675, 2038125, 2059305  (xmin, xmax, ymin, ymax)
#crs        : +proj=utm +zone=43 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
#source     : memory
#names      : layer 
#values     : -0.08728454, 0.5357124  (min, max)

我需要对栅格进行重新分类,例如

  • NDVI值<0-0.99
  • NDVI值> 0且NDVI <0.2-0.96
  • NDVI值> 0.2和NDVI <0.5 = 0.004 * lsat8_PV + 0.986

其中lsat8_pv是另一种以以下格式计算的栅格

 lsat8_pv <- ((ndvi - maxValue(ndvi)) / (maxValue(ndvi) - minValue(ndvi)))^2

 lsat8_pv
 #class      : RasterLayer 
 #dimensions : 706, 953, 672818  (nrow, ncol, ncell)
 #resolution : 30, 30  (x, y)
 #extent     : 368085, 396675, 2038125, 2059305  (xmin, xmax, ymin, ymax)
 #crs        : +proj=utm +zone=43 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
  #source     : memory
  #names      : layer 
  #values     : 0, 1  (min, max)

我经历了一些类似的问题,但无法发现任何在重新分类规则下指定了公式的问题。

下面是我尝试的内容

lsat_e[ndvi < 0] = 0.991
lsat_e[ndvi > 0 & ndvi < 0.2] = 0.966

e <-  ({0.004 * lsat8_PV} + 0.986)

m = cbind(from = c(-1, 0.2, 0.5), to = c(0.2, 0.5, 1), becomes = c(0.984, e , 0.99))
m
#     from to  becomes
#[1,] -1   0.2 0.984  
#[2,] 0.2  0.5 ?      
#[3,] 0.5  1   0.99 
r raster r-raster
1个回答
0
投票

总是包含一个独立的最小可重现示例,并附带一个问题。例如,类似这样的东西

library(raster)
ndvi <- raster(nrow=7, ncol=9, ext=extent(368085, 398085, 2038305, 2059305), crs="+proj=utm +zone=43 +datum=WGS84")
values(ndvi) <- seq(-1, 1, 2/ncell(NDVI))[-1]

maxVal <- cellStats(NDVI, max)
minVal <- cellStats(NDVI, min)

lsat8_pv <- ((ndvi - maxVal) / (maxVal - minVal))^2

而且您还应该更加清楚自己的需求。例如,大于0.5的值如何?为什么您尝试使用的值与问题描述中的值不同?

无论如何,您可以执行以下操作。使用reclassify,但将需要由另一个栅格的值替换的像元设置为NA。然后使用cover进行替换。

lst <- 0.004 * lsat8_pv + 0.986
m <- cbind(from = c(-Inf, 0, 0.2, 0.5), to = c(0, 0.2, 0.5, Inf), becomes = c(0.99, 0.96, NA , 1))
x <- reclassify(ndvi, m)
y <- cover(x, lsat8_pv)
© www.soinside.com 2019 - 2024. All rights reserved.