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

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 15 янв 2022, 14:08

Доброго времени!
Тренируюсь делать кластеризацию растра.

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

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
Как побороть данную ошибку построить и сохранить результат кластеризации?

_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 15 янв 2022, 14:45

Возможно эта ошибка связана с тем, что ранее растр был обрезан, а R "понимает" только прямоугольный раст?
Вложения
NDVI.jpeg
NDVI.jpeg (67.83 КБ) 4636 просмотров

gamm
Гуру
Сообщения: 4046
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 15 янв 2022, 15:32

_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

_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 15 янв 2022, 16:31

Спасибо за ответ 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

gamm
Гуру
Сообщения: 4046
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 15 янв 2022, 17:40

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

_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 15 янв 2022, 18:00

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

gamm
Гуру
Сообщения: 4046
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 15 янв 2022, 18:53

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

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

_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 15 янв 2022, 21:07

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

gamm
Гуру
Сообщения: 4046
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 15 янв 2022, 23:01

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

_taras_
Активный участник
Сообщения: 186
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 12
Откуда: Киев

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

Сообщение _taras_ » 16 янв 2022, 00:35

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

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей