如何在R中使用ifelse(条件语句)覆盖两个栅格?

时间:2019-05-08 22:23:29

标签: r if-statement overlay raster

我有两个栅格(图像),并希望使用以下代码对其进行覆盖:

# Getting the images
library(raster)

URL1 <- "https://www.dropbox.com/s/6jjz7ou1skz88wr/raster_1.tif?dl=1"
URL2 <- "https://www.dropbox.com/s/d5xuixohjqfnfze/raster_2.tif?dl=1"

download.file(URL1, destfile=paste0(getwd(),"/", "raster_1.tif"), method="auto", mode="wb", timeout="6000")
download.file(URL2, destfile=paste0(getwd(),"/", "raster_2.tif"), method="auto", mode="wb", timeout="6000")

# Reading the images 
raster_1 <- raster(list.files(pattern="raster_1.tif$"))
raster_2 <- raster(list.files(pattern="raster_2.tif$"))

# Overlaying
myFun <- function(x,y){ifelse(x==0 && y==0, 0, ifelse(x==1 && y==0, 2, ifelse(x==1 && y>0, y)))}

( res <- overlay(stack(raster_1 ,raster_2), fun = Vectorize(myFun) ) )

### R gives this error
Error in .overlayList(x, fun = fun, filename = filename, forcefun = forcefun,  : 
  cannot use this formula, probably because it is not vectorized

如果有人能帮助我,我将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:0)

您需要一个仅使用向量化运算符的函数。在这种情况下,布尔运算既要成功又要更有效率

myFun <- function(x,y){ 0*(x==0 && y==0)+ 
                        2*(x==1 && y==0)+
                        y*(x==1 && y>0) }

有些边缘情况没有出现。 x可以是除0或1以外的值吗? y会否定否定?

运行我的版本后,我得到:

> ( res <- overlay(stack(raster_1 ,raster_2), fun = Vectorize(myFun) ) )
class       : RasterLayer 
dimensions  : 2958, 1642, 4857036  (nrow, ncol, ncell)
resolution  : 500, 500  (x, y)
extent      : -171063.8, 649936.2, 5317253, 6796253  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
data source : in memory
names       : layer 
values      : 0, 14751  (min, max)

我认为我不需要在VectorizemyFun周围使用enter code here,但是当我将其留给{{1 }}:

overlay

当我执行Vectorize步骤时,我没有收到错误,而是得到了全零。

答案 1 :(得分:0)

目前尚不清楚您真正想要实现的目标,并且可能会有更好的解决方案。在您的示例数据中,Y(栅格_2)的值不为零。这表明您想要raster_2不为0的raster_1的值吗?可以这样实现:

m <- mask(raster_2, raster_1, maskvalue=0)

我认为42-的myFun的问题在于,当没有条件成立时,特别是在(x == 0 & y > 0)时,它将返回0。

要使其与overlay一起使用,请将&&替换为&

myFunV <- function(x,y){ 
                    0*(x==0 & y==0)+ 
                    2*(x==1 & y==0)+
                    y*(x==1 & y>0) }                        

res <- overlay(raster_1, raster_2, fun = myFunV)

(但是,我再次怀疑这是否是满足您需求的好方法)