我有两个栅格(图像),并希望使用以下代码对其进行覆盖:
# 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
如果有人能帮助我,我将不胜感激。
谢谢。
答案 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)
我认为我不需要在Vectorize
,myFun
周围使用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)
(但是,我再次怀疑这是否是满足您需求的好方法)