Запись файла GeoTiff на основе цветовой матрицы

Интересно, как можно написать GTiff на основе матрицы определенных цветов? Это может быть, когда цвета представляют не количественную переменную, а скорее качественные пространственные явления, такие как демографические кластеры. Если у меня есть, например. матрица значений цвета 1000x1000 (строки символов, такие как «# FF0000»), я могу легко построить их с помощью grid.raster(mtrx, interpolate=FALSE), но это трудно наложить на другие шейп-файлы. Я также могу преобразовать их в SpatialPixelsDataFrame с именами полей «x», «y», «col». Но я не понимаю, как записать любой из этих объектов в GTiff. Например:

writeGDAL(SPDF, 'test.tif', drivername = "GTiff", colorTables=x$col)

урожаи

Error in function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘gridded’ for signature ‘"data.frame"’

Очень благодарен за любые указатели.


Пример:

require(sp)
require(rgdal)
mtrx = matrix(rgb(runif(10000), runif(10000), runif(10000)), ncol=100)
spdf = data.frame(x=rep(1:100,100), y=rep(1:100,each=100), col=as.vector(mtrx))
plot(spdf[,1:2], col=spdf$col, pch=15)
spdf = SpatialPixelsDataFrame(points=spdf[,1:2], data=spdf)
writeGDAL(spdf, 'test.tif', drivername = "GTiff", colorTables=spdf$col)

person geotheory    schedule 20.05.2013    source источник
comment
Пожалуйста, помогите нам помочь вам, предоставив нам воспроизводимый пример (т. е. код и пример данных), см. stackoverflow.com/questions/5963269/ для получения подробной информации.   -  person Paul Hiemstra    schedule 21.05.2013
comment
Конечно, @Paul Hiemstra, добавил к вопросу.   -  person geotheory    schedule 21.05.2013


Ответы (1)


В вашем первоначальном вызове я предполагаю, что SPDF был исходным data.frame, а не SpatialPixelsDataFrame, который ожидал writeGDAL. Несмотря на это, у вас есть вторая проблема в вашем минимальном примере.

Проблема в том, что colorTables не ожидает data.frame: from help(writeGDAL):

по умолчанию NULL, если не NULL, список длины, равной количеству каналов, с компонентами NULL для каналов без таблицы цветов, или либо целочисленная матрица красного цвета, значения зеленого, синего и альфа-канала (0–255) или вектор символов цветов. Количество разрешенных цветов может варьироваться в зависимости от водителя.

В вашем примере spdf$col является фактором (попробуйте class(spdf$col)). Вы можете преобразовать в список векторов символов по запросу list(levels(spdf$col)).

Это поднимает вопрос: что такое GeoTiff, который вы пытаетесь написать? В настоящее время это трехканальное изображение с x, y и цветовым кодом символа... Вам нужен фактический атрибут, который будет закодирован в соответствии с цветовым кодом.

Давайте добавим новый атрибут, представляющий собой случайное целое число от 0 до 255, создадим таблицу цветов, в которой цвет будет назначен для каждого значения (256 значений) на основе ваших первых 256 значений:

spdf@data$new = sample(0:255, length(spdf$x), replace=TRUE)
coltable = list(levels(spdf$col)[0:255])

Теперь мы можем успешно записать файл; обратите внимание, что мы должны указать тип и обработку значения NoData, чтобы избежать ошибок:

writeGDAL(spdf[,'new'], '/Users/Benjamin/Desktop/test.tif', drivername = "GTiff", type="Byte", mvFlag=0, colorTables=coltable)

Результирующее изображение GeoTiff с примененной таблицей цветов

person Benjamin    schedule 09.02.2017