2

我想知道如何根据特定颜色的矩阵编写 GTiff?这可能是当颜色不代表定量变量,而是定性空间现象(例如人口统计集群)时。例如,如果我有一个 1000x1000 的颜色值矩阵(字符串,如 '#FF0000'),我可以轻松地绘制这些值,grid.raster(mtrx, interpolate=FALSE)但这很难与其他 shapefile 重叠。我还可以将它们转换为 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)
4

1 回答 1

0

在您最初的通话中,我猜 SPDF 是原始的 data.frame,而不是SpatialPixelsDataFrame预期的writeGDAL。无论如何,您的最小示例中有第二个问题。

问题是 colorTables 不期望 data.frame: from help(writeGDAL)

默认 NULL,如果不是 NULL,长度等于波段数的列表,对于没有颜色表的波段,具有 NULL 分量,或者是红色、绿色、蓝色和 alpha 值 (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 图像

于 2017-02-09T02:52:28.427 回答