2015-08-17 2 views
2

У меня есть растровый рисунок со слоями климатических данных на островах, окруженный океанскими ячейками NA. Я хотел бы установить несколько океанических ячеек на стоимость близлежащего побережья. У вас есть удивительная проблема. На мой взгляд, код должен быть чем-то вроде ниже, но у меня заканчивается память. Растр имеет размер около 2500x2500.Изменение значения одиночной ячейки в большом растрове

# dummy stack with three layers 
slogo <- stack(system.file("external/rlogo.grd", package="raster")) 
# let's say cell 5 is the one I want to change 
newvals <- 1000*(1:3) 
for(i in 1:nlayers(slogo)) slogo[[i]][5] <- newvals[i] 

Последующий шаг будет писать растры для разделения файлов ascii; поэтому альтернативное хакерское решение может быть отключено в текстовом файле и заменено одиночными значениями ...

EDIT: Возможно, есть решение, которое кто-то может порекомендовать, сбросив ограничения на распределение памяти? Вот сообщение об ошибке, которое я показываю после запуска на моем большом растере. Error: cannot allocate vector of size 504.1 Mb In addition: Warning messages: 1: In readBin([email protected]@con, what = dtype, n = nc, dsize, dsign, : Reached total allocation of 3979Mb: see help(memory.size) 2: In readBin([email protected]@con, what = dtype, n = nc, dsize, dsign, : Reached total allocation of 3979Mb: see help(memory.size) 3: closing unused connection 4 (C:\Users\jcw\AppData\Local\Temp\R_raster_jcw\r_tmp_2015-08-16_130255_2000_11926.gri) 4: In getBilData(object, r = startrow, nrows = nrows, c = startcol, : Reached total allocation of 3979Mb: see help(memory.size) 5: In getBilData(object, r = startrow, nrows = nrows, c = startcol, : Reached total allocation of 3979Mb: see help(memory.size) 6: In getBilData(object, r = startrow, nrows = nrows, c = startcol, : Reached total allocation of 3979Mb: see help(memory.size) 7: In getBilData(object, r = startrow, nrows = nrows, c = startcol, : Reached total allocation of 3979Mb: see help(memory.size)

ответ

1

Вы были очень близки, это просто вопрос индексации:

library(raster) 

# dummy stack with three layers 
slogo <- brick(system.file("external/rlogo.grd", package="raster")) 

## Check values of all three bands at cell 5: 
slogo[5] 

Урожайность:

 red green blue 
[1,] 255 255 255 

## Set values of all three bands to zero: 
slogo[5][1:3] <- 0 

slogo[5] 

Урожайность:

 red green blue 
[1,] 0  0 0 

Альтернативой, которая может получить О.П. прошлое проблемы с памятью обработки всех полос одновременно:

## Alternatively, load each band into memory separately, do the 
## replacement and write each band back to disk as a separate GeoTiff: 
for (i in 1:nbands(slogo)) { 
    r <- raster(slogo, layer=i) 
    r[5] <- 0 
    writeRaster(r, file=paste0("band_", i, ".tif"), format="GTiff") 
} 
+0

Это работает в примере, но не решает проблему памяти в моем большом растре: 'Ошибки : не может выделить вектор размером 504.1 Mb' –

+0

Хм, я вижу из вашего редактирования, что у вас всего 4 ГБ ОЗУ. Это сильно ухудшит ваш стиль работы с растрами, особенно на Windows-машине, где общее использование ОЗУ обычно оставляет меньше для работы R. Если вы все равно собираетесь записать эти значения на диск, вы можете попробовать мое редактирование выше, но вы можете застрять, делая что-то более запутанное в зависимости от общего размера растров, с которыми вы имеете дело. –

0

Вы можете использовать функцию raster::update для изменения значений в растровых файлах на диске (делают резервные копии!)

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