Как наложить два растра, используя ifelse (условные выражения) в R? - PullRequest
1 голос
/ 09 мая 2019

У меня есть два растра (изображения), и я хочу наложить их, используя этот код:

# 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 голосов
/ 10 мая 2019

Непонятно, чего вы на самом деле пытаетесь достичь, и, возможно, найдутся лучшие решения. В данных вашего примера Y (растр_2) не имеет нулевых значений. Это говорит о том, что вы хотите значения raster_2, где raster_1 не 0? Это может быть достигнуто так:

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

Я думаю, что у 42-х myFun есть проблема в том, что он возвращает 0, когда ни одно из условий не выполняется, особенно когда (x == 0 & y > 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)

(но опять же сомневаюсь, что это хороший подход для ваших нужд)

0 голосов
/ 09 мая 2019

Вам нужна функция, которая использует только векторизованные операторы.Это тот случай, когда булева арифметика должна быть успешной и более эффективной

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 но результаты, скорее всего, будут правильными, когда я оставлю это в вызове overlay:

> Hmisc::describe(values(res))
values(res) 
       n  missing distinct     Info     Mean      Gmd      .05      .10      .25 
 3222508  1634528     1502    0.727     4918     6403        0        0        0 
     .50      .75      .90      .95 
       0    13898    14082    14168 

Value            0   13000   13200   13400   13600   13800   14000   14200   14400
Frequency  2089448      67     578   10515   69031  249817  523241  226628   46191
Proportion   0.648   0.000   0.000   0.003   0.021   0.078   0.162   0.070   0.014

Value        14600   14800
Frequency     6876     116
Proportion   0.002   0.000

Когда я выполнил шаг Vectorize, я не получил ошибку, но я получил все нули,вместо этого.

...