2013-05-20 1 views
1

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

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) 
+0

Пожалуйста, помогите нам помочь вам, предоставив нам воспроизводимый пример (то есть код и примеры данных), см Http: //stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example для деталей. –

+0

Несомненно @Paul Hiemstra, добавил к вопросу. – geotheory

ответ

0

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

Вопрос заключается в том, что colorTables не ожидает data.frame: от help(writeGDAL):

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

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

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

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

[email protected]$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) 

Resulting GeoTiff image with color table applied