如何在R raster软件包中编写具有RAT因子的栅格

9
我希望使用writeRaster函数来写入我在R中构建的栅格属性表(RAT)。
我正在运行R 3.0.1、raster 2.1-49和rgdal 0.8-10。
我的输入栅格数据如下:
r <-raster("F:/test.img")

class       : RasterLayer 
dimensions  : 3, 3, 9  (nrow, ncol, ncell)
resolution  : 30, 30  (x, y)
extent      : 347325, 347415, 4301655, 4301745  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : F:\test.img 
names       : test 
values      : 1, 19  (min, max)

我接着建立属性表:

r <- ratify(r)
rat <- levels(r)[[1]]
rat$Pixel_Values <- c(1, 7, 8, 9, 19)
rat$Class_Names <- c("A", "B", "C", "D", "E")
levels(r) <- rat

这会导致一个带有属性的栅格图像:raster
r

# class       : RasterLayer 
# dimensions  : 3, 3, 9  (nrow, ncol, ncell)
# resolution  : 30, 30  (x, y)
# extent      : 347325, 347415, 4301655, 4301745  (xmin, xmax, ymin, ymax)
# coord. ref. : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
# data source : F:\test.img 
# names       : test 
# values      : 1, 19  (min, max)
# attributes  :
#  ID Pixel_Values Class_Names
#   1            1           A
#   7            7           B
#   8            8           C
#   9            9           D
#  19           19           E

我尝试将栅格和其关联的 RAT 一起写入:
ratRaster <- "F:/testRat.img"
writeRaster(r, filename=ratRaster, datatype="INT1U", RAT=TRUE, progress="window", overwrite=TRUE)

但是当我将其读回到R中时,很明显属性没有保留:

r2 <- raster(ratRaster)

r2
# class       : RasterLayer 
# dimensions  : 3, 3, 9  (nrow, ncol, ncell)
# resolution  : 30, 30  (x, y)
# extent      : 347325, 347415, 4301655, 4301745  (xmin, xmax, ymin, ymax)
# coord. ref. : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
# data source : F:\testRat.img 
# names       : testRat 
# values      : 1, 19  (min, max)

在R语言中快速构建和导出光栅数据,同时保留关联的区域属性表(RAT),这将是非常方便且令人惊叹的。您需要如何实现?


library(raster); set.seed(1); r <- raster(matrix(sample(c(1, 7:9, 19), 100, replace=TRUE), 10)) 将提供一个可复制的栅格示例。 - jbaums
你为什么不接受我的答案?给悬赏并不意味着自动采纳。 - cmbarbu
@cmbarbu - 这不是我的问题... 我在一个已有的问题上设置了悬赏。 - jbaums
3个回答

4
请注意,如果您使用栅格的本机.grd格式(参见文档第3.3节),则RAT表将被保存:
library(raster)
r <- raster(nrows=5, ncols=5)
r[] <- rep(1:5, 5)
r <- ratify(r)
rat <- levels(r)[[1]]
rat$Pixel_Values <- 1:5
rat$Class_Names <- c("A", "B", "C", "D", "E")
levels(r) <- rat

r
writeRaster(r, filename="raster_rat.grd")

现在重新打开:
r2 <- raster("raster_rat.grd")
r2

2

你可以将RAT写成csv文件,然后稍后再加入该数据。

按照你指定的方式编写栅格:

writeRaster(r, filename=ratRaster, datatype="INT1U", RAT=TRUE, progress="window", overwrite=TRUE)

将属性数据/表格/RAT作为.csv文件编写:
write.csv(rat, file="C:\\merp\\rat.csv", row.names = F)

然后您可以在以后的另一个程序中加入这些数据。例如,如果从R导出到ArcMap,则将栅格写入磁盘,将属性数据写为csv文件,然后使用ArcMap中的Add Join工具将RAT连接到栅格。


1

阅读writeRaster的定义后,可以清楚地看出RAT的写入并没有实现,至少对于本地和GTif格式来说是这样。实际上,首先要做的事情之一就是删除RAT。这并不奇怪,考虑到ratify()帮助中的注释:

这里记录的函数主要可用于读取和处理带有RAT的文件;目前并没有太多进一步的支持。

从R到其他格式,您总是可以使用

    save(r,file=ratRaster)

然后

    load(ratRaster)

它包含了一切。

真遗憾不能用 RAT 写栅格!这会节省很多时间... - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接