Страница 1 из 1

Ошибка при кластеризациии растра

Добавлено: 15 янв 2022, 14:08
_taras_
Доброго времени!
Тренируюсь делать кластеризацию растра.

Код: Выделить всё

library(raster)
library(rgdal)
r_ndvi <- brick("/home/username/NDVI_VBU_08.tif")
Проверяю корректность загрузки

Код: Выделить всё

ICE <- stack(r_ndvi)
plot(ICE)
Делаю кластеризацию и убираю пустые значения

Код: Выделить всё

ICE.df <- as.data.frame(ICE)
cluster.ICE <- kmeans(na.omit(ICE.df), 4)
Создаю пустой растр аналогичный ICE

Код: Выделить всё

clusters <- raster(ICE)
Пытаюсь надожить результат кластеризации на растр

Код: Выделить всё

clusters <- setValues(clusters, cluster.ICE$cluster)
И получаю ошибку

Код: Выделить всё

Ошибка в setValues(clusters, cluster.ICE$cluster) :   length(values) is not equal to ncell(x), or to 1
Как побороть данную ошибку построить и сохранить результат кластеризации?

Re: Ошибка при кластеризациии растра

Добавлено: 15 янв 2022, 14:45
_taras_
Возможно эта ошибка связана с тем, что ранее растр был обрезан, а R "понимает" только прямоугольный раст?

Re: Ошибка при кластеризациии растра

Добавлено: 15 янв 2022, 15:32
gamm
_taras_ писал(а):
15 янв 2022, 14:45
ошибка связана с тем, что ранее растр был обрезан
нет, растр у вас не обрезан - просто вы выкинулим часть данных из таблицы, и не учли этого

Код: Выделить всё

ICE <- stack(r_ndvi)
plot(ICE)
ICE.df <- as.data.frame(ICE)
ind <- !apply(is.na(ICE.df),1,any)
cluster.ICE <- kmeans(ICE.df[ind,], 4)
clusters <- raster(ICE)
clusters[] <- NA
clusters[ind] <- cluster.ICE$cluster

Re: Ошибка при кластеризациии растра

Добавлено: 15 янв 2022, 16:31
_taras_
Спасибо за ответ gamm!
Насколько я понял командой находим NA и заменяем 1

Код: Выделить всё

ind <- !apply(is.na(ICE.df),1,any)
затем считаем кастеры

Код: Выделить всё

cluster.ICE <- kmeans(ICE.df[ind,], 4)
Однако при попытке создать новый растр

Код: Выделить всё

clusters <- raster(ICE)
clusters <- setValues(clusters, cluster.ICE$cluster) 
появляется та же ошибка

Код: Выделить всё

 Ошибка в setValues(x, value) :
  length(values) is not equal to ncell(x), or to 1

Re: Ошибка при кластеризациии растра

Добавлено: 15 янв 2022, 17:40
gamm
_taras_ писал(а):
15 янв 2022, 16:31
Насколько я понял командой находим NA и заменяем 1
нет :mrgreen:
посмотрите help, строим индекс строк, в которых есть хоть одно значение NA
И я же вам рабочий код написал, зачем вы опять те же ошибки сажаете?

Re: Ошибка при кластеризациии растра

Добавлено: 15 янв 2022, 18:00
_taras_
gamm писал(а):
15 янв 2022, 17:40
И я же вам рабочий код написал, зачем вы опять те же ошибки сажаете?
Растр создать не получается.

Re: Ошибка при кластеризациии растра

Добавлено: 15 янв 2022, 18:53
gamm
_taras_ писал(а):
15 янв 2022, 18:00
Растр создать не получается.
в смысле? в каком месте? просто скопируйте или загрузите, все само создастся.
cluster <- raster("/home/username/NDVI_VBU_08.tif",band=1)

я у себя запустил на первом попавшемся файле, все работает. У вас там сколько каналов в исходном растре?

Re: Ошибка при кластеризациии растра

Добавлено: 15 янв 2022, 21:07
_taras_
gamm, Ваш код работает.
Результат получил так
plot(clusters, col = viridis_pal(option = "D")(4), main = "NDVI")
Едиственно, ненравится, что шкала имеет не целые значения.
gamm писал(а):
15 янв 2022, 18:53
У вас там сколько каналов в исходном растре?
Пока один, но многоканальными растрами еще буду разбираться....

Re: Ошибка при кластеризациии растра

Добавлено: 15 янв 2022, 23:01
gamm
_taras_ писал(а):
15 янв 2022, 21:07
Пока один
а зачем тогда весь этот огород городить с кирпичами и стопками? я бы посоветовал грузить слои многоканального растра по одному, превращать их в вектора (используя []), и собирать data.frame. А потом грузить результат обратно, используя тот же оператор [] и соответствующие индексы. По крайней мере быдете всегда контролировать, что происходит.

Re: Ошибка при кластеризациии растра

Добавлено: 16 янв 2022, 00:35
_taras_
gamm писал(а):
15 янв 2022, 23:01
а зачем тогда весь этот огород городить
Тренируюсь :)
Всплыла (в очередной раз) тема пожаров на водно-болотных угодьях. Вот и пытаюсь посмотреть, что можно вытянуть из космоснимков.