带有计算和/或叠加返回单值图像的波段数学
Band math with calc and / or overlay returning single-valued images
当我尝试 运行 带数学运算时,结果始终是一种颜色的图像,并且最小值和最大值与预测值非常不同。
我在这里没有找到任何显示此问题的问题。
我是这样锻炼的
r.stack <- stack("path to raster file"))
我使用重采样而不是裁剪来切掉原始图像中的白边
prj <- "+proj=utm +zone=23 +south +datum=WGS84 +units=m"
r <- raster(res=11.47, ext=extent(c(301496, 323919, 9888968, 9913982)), crs=prj, vals=NA
r.stack <- resample(r.stack, r)
之后的图像有这样的配置:
> class : RasterBrick
> dimensions : 2181, 1955, 4263855, 4 (nrow, ncol, ncell, nlayers)
> resolution : 11.47, 11.47 (x, y)
> extent : 301496, 323919.8, 9888966, 9913982 (xmin, xmax, ymin, ymax)
>coord. ref. : +proj=utm +zone=23 +south +datum=WGS84 +units=m +ellps=WGS84 +towgs84=0,0,0
>data source : in memory
>names : l.1, l.2, l.3, l.4
>min values : -36.12217, -45.12768, -46.30455, -35.26328
>max values : 10.567671, 4.050200, 3.878345, 11.613799
然后使用下面的函数进行计算
f <- function(x){
(x[[2]])/(x[[1]])
}
s <- r.stack[[c(1,2)]]
r2 <- calc(s, f)
我也 运行 叠加了乐趣
f <- function(x,y){
y/x
}
r2 <- overlay(r.stack[[1]], r.stack[[2]], fun= f)
任何方法都会导致 image of one value
我是不是漏掉了一些步骤?
这是你的代码和一些示例数据(没有它很难回答问题)。我简化了一个功能,一点点,但结果是一样的。
library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster"))
b <- b/10 + 1
f <- function(x){ x[2]/ x[1] }
s <- b[[c(1,2)]]
r1 <- calc(s, f)
f <- function(x,y){ y / x }
r2 <- overlay(b[[1]], b[[2]], fun= f)
或者干脆
r3 <- b[[2]] / b[[1]]
r3
#class : RasterLayer
#dimensions : 77, 101, 7777 (nrow, ncol, ncell)
#resolution : 1, 1 (x, y)
#extent : 0, 101, 0, 77 (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=merc +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
#data source : in memory
#names : layer
#values : 0.7692308, 1.7 (min, max)
r1
和r2
是一样的。
你得到 "single color" 的原因是因为大多数值都接近 1,但有一些大的异常值;可能是因为除以 -1 和 1 之间的数字?这可能说明了这一点:
q <- quantile(r3, c(0.1, 0.9))
d <- clamp(r3, q[1], q[2])
plot(d)
看看极端情况
i <- which.max(r3)
b[i][,2:1]
当我尝试 运行 带数学运算时,结果始终是一种颜色的图像,并且最小值和最大值与预测值非常不同。 我在这里没有找到任何显示此问题的问题。 我是这样锻炼的
r.stack <- stack("path to raster file"))
我使用重采样而不是裁剪来切掉原始图像中的白边
prj <- "+proj=utm +zone=23 +south +datum=WGS84 +units=m"
r <- raster(res=11.47, ext=extent(c(301496, 323919, 9888968, 9913982)), crs=prj, vals=NA
r.stack <- resample(r.stack, r)
之后的图像有这样的配置:
> class : RasterBrick
> dimensions : 2181, 1955, 4263855, 4 (nrow, ncol, ncell, nlayers)
> resolution : 11.47, 11.47 (x, y)
> extent : 301496, 323919.8, 9888966, 9913982 (xmin, xmax, ymin, ymax)
>coord. ref. : +proj=utm +zone=23 +south +datum=WGS84 +units=m +ellps=WGS84 +towgs84=0,0,0
>data source : in memory
>names : l.1, l.2, l.3, l.4
>min values : -36.12217, -45.12768, -46.30455, -35.26328
>max values : 10.567671, 4.050200, 3.878345, 11.613799
然后使用下面的函数进行计算
f <- function(x){
(x[[2]])/(x[[1]])
}
s <- r.stack[[c(1,2)]]
r2 <- calc(s, f)
我也 运行 叠加了乐趣
f <- function(x,y){
y/x
}
r2 <- overlay(r.stack[[1]], r.stack[[2]], fun= f)
任何方法都会导致 image of one value
我是不是漏掉了一些步骤?
这是你的代码和一些示例数据(没有它很难回答问题)。我简化了一个功能,一点点,但结果是一样的。
library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster"))
b <- b/10 + 1
f <- function(x){ x[2]/ x[1] }
s <- b[[c(1,2)]]
r1 <- calc(s, f)
f <- function(x,y){ y / x }
r2 <- overlay(b[[1]], b[[2]], fun= f)
或者干脆
r3 <- b[[2]] / b[[1]]
r3
#class : RasterLayer
#dimensions : 77, 101, 7777 (nrow, ncol, ncell)
#resolution : 1, 1 (x, y)
#extent : 0, 101, 0, 77 (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=merc +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
#data source : in memory
#names : layer
#values : 0.7692308, 1.7 (min, max)
r1
和r2
是一样的。
你得到 "single color" 的原因是因为大多数值都接近 1,但有一些大的异常值;可能是因为除以 -1 和 1 之间的数字?这可能说明了这一点:
q <- quantile(r3, c(0.1, 0.9))
d <- clamp(r3, q[1], q[2])
plot(d)
看看极端情况
i <- which.max(r3)
b[i][,2:1]