在 R 中重新分类栅格
Reclassify Raster in R
我有一张栅格图像,其中包含从 -0.2 到 0.6 的 NDVI 值
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
这是一个独立的最小可重现示例
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)
我有一张栅格图像,其中包含从 -0.2 到 0.6 的 NDVI 值
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
这是一个独立的最小可重现示例
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)