2017-01-13 5 views
1

Я хочу изменить поднабор слоев в растровом кирпиче, умножив эти слои на другой растровый.subassignment выбранных слоев в растровом кирпиче

Например, если мы имеем растровый кирпич под названием «r.brick» и попытаться умножить его слои 2: 4 растра, «r.mult», с тем же строками & размерами столбцов:

  • r.brick[[2:4]] возвращает слои 2: 4, как и ожидалось

  • r.brick[[2:4]] * r.mult успешно умножает эти слои, как и ожидалось

, но, если я пытаюсь присвоить результат обратно в подмножество слоев я получаю сообщение об ошибке

r.brick[[2:4]] = r.brick[[2:4]] * r.mult 
# Error in value[] <- val : 
# incompatible types (from S4 to double) in subassignment type fix 

Сообщение об ошибке свидетельствует о том, что назначение пытается присвоить растр дорожит, а не самого растра. Но если я пытаюсь задание с getValues, я получаю другую ошибку:

r.brick[[2:4]] = getValues(r.brick[[2:4]] * r.mult) 
# Error in .local(x, values, ...) : length(values) is not equal to ncell(x) 

Что такое правильный способ сделать это?

Некоторые воспроизводимые данные:

library(raster) 
r.list = vector("list", 20) 
set.seed(123) 
for (i in 1:20) { 
    r.list[[i]] = raster(vals=runif(100), nrows=10, ncols=10, ext=extent(c(0,25,0,25))) 
} 
r.brick = brick(r.list) 
r.mult = raster(vals=sample(2,100,T), nrows=10, ncols=10, ext=extent(c(0,25,0,25))) 
+0

Вы пытались использовать setValues? (Не знаю, разрешает ли это присвоение на нескольких слоях, хотя ...) – lbusett

+0

@LorenzoBusetto setValues ​​только, кажется, работает на отдельных слоях, насколько я могу судить. – dww

ответ

3

Тогда я только получил обходной путь (с помощью петли) для вас:

layers <- 2:4 
for(i in layers) { 
    r.brick[[i]] <- r.brick[[i]] * r.mult 
} 

Примечание: Видимо назначение с [] Подменю работает только с одиночные слои.

+0

Справа. Не тестировал его с тех пор, как я был в дороге. У меня есть другое обходное решение для вас. Возможно, @RobertH может помочь вам лучше. :) – maRtin

+1

Спасибо - я уже использую обходное решение цикла - надеялся, что есть лучшее решение. – dww

1

Следующий код с несколькими слоями 2-4 из r.brick значений растра со значениями r.mult и присвоить результаты r.brick слоев 2-4.

attr(attr(r.brick, 'data'), 'values')[,2:4] = attr(attr(r.brick, 'data'), 'values')[,2:4] * attr(attr(r.mult, 'data'), 'values') 

или

attr(attr(r.brick, 'data'), 'values')[,2:4] = getValues(r.brick[[2:4]] * r.mult) 
+0

Это нехорошее решение. Он будет работать только в некоторых случаях (небольшие наборы данных) и os без необходимости скрывать. – RobertH

2

Я думаю, что это недостающая функция. Спасибо что подметил это. Я бы пошел с циклом после maRtin (возможно, после создания RasterStack, который может быть более эффективным). Если набор данных не слишком большой, вы можете сделать

# example data 
library(raster) 
b <- brick(nrows=2, ncols=2, nl=6) 
values(b) <- rep(1:4, 6) 
r.mult <- raster(vals=10, nrows=2, ncols=2) 


values(b)[,3:4] <- values(b[[3:4]] * r.mult) 
# values(b) 

 Смежные вопросы

  • Нет связанных вопросов^_^