Создание объекта big.matrix из RasterBrick

Чтобы выполнить кластерный анализ kmean для больших наборов растровых данных, я пытаюсь преобразовать свой объект RasterBrick в объект big.matrix с помощью функции brick, но когда я читаю файл .grd обратно в R, вся информация теряется.

library(raster)
library(bigmemory)
library(biganalytics)

#initialize raster
one <- raster(matrix(rnorm(400), 20, 20))
two <- raster(matrix(rnorm(400), 20, 20))
three <- raster(matrix(rnorm(400), 20, 20))

#save brick object as .grd file
brick(one, two, three, filename = "test")

#read .grd file in as big.matrix
big_matrix <- as.big.matrix("test.grd", type = "double")

#check dimensions
dim(big_matrix)

#perform kmeans
bigkmeans(big_matrix, 3)

Я вижу файлы .grd и .gri в своем каталоге, но не могу понять, как их прочитать или как передать файл .grd в функцию bigkmean. Есть идеи, как я могу это сделать?


person Forrest Williams    schedule 03.12.2017    source источник


Ответы (1)


Пример данных

library(raster)
library(bigmemory)

b <- brick(system.file("external/rlogo.grd", package="raster"))

Если файл не такой большой, вы можете сделать

x <- as.big.matrix(values(b))

В противном случае, вот функция, которую вы можете использовать.

r2bm <- function(from, filename="") {
    b <- big.matrix(ncell(from), nlayers(from), backingfile=filename )
    nc <- ncol(from)
    tr <- blockSize(from)
    for (i in 1:tr$n) {
        start <- ((tr$row[i]-1) * nc) + 1
        end <- start + (tr$nrows[i] * nc) - 1
        b[start:end, ] <- getValues(from, row=tr$row[i], nrows=tr$nrows[i])
    }
    b
}

Теперь используйте это

y <- r2bm(b, "bg.dat")
person Robert Hijmans    schedule 04.12.2017
comment
Спасибо, вторая часть вашего решения решает мою проблему. - person Forrest Williams; 04.12.2017