R:编写RasterStack并保留图层名称

时间:2014-11-05 17:07:44

标签: r raster netcdf geotiff

我有一个光栅堆栈stk,由R中的三个光栅图像组成。这是一个简单的例子

# set up a raster stack with three layers
> library(raster)
> r <- raster(nrows=10,ncols=10)
> r[] <- rnorm(100)
> stk <- stack(r,r,r)

# layer names are set by default
> names(stk)
[1] "layer.1" "layer.2" "layer.3"

我为栅格图层指定名称:

# set layer names to "one", "two" and "three"
> names(stk) <- c('one','two','three')

> names(stk)
[1] "one" "two" "three"

当我使用:

将RasterStack写入GeoTiff(多层)时
writeRaster(stk,"myStack.tif", format="GTiff")

根据文件名重命名图层(参见下面的> names(stk))。

当我读入光栅堆栈时:

> stk <- stack("myStack.tif")

# the layer names have been set automatically based on the filename
# they should be "one", "two" and "three"
> names(stk)
[1] "myStack.1" "myStack.2" "myStack.3"

在R中编写RasterStacks时,您知道如何保留图层名称吗?我已经尝试将堆栈写入GeoTIFF和NetCDF格式。

谢谢,凯文

3 个答案:

答案 0 :(得分:8)

您可以使用原生栅格格式:

myRaster <- writeRaster(stk,"myStack.grd", format="raster")

栅格网格格式包含二进制.gri文件和.grd头文件。这将保留您的图层名称。但请注意,.gri二进制文件不会被压缩。

如果您需要在其他程序中打开raster grd文件,则很可能需要编写其他头文件。我通常使用ENVI标头格式来做到这一点。

hdr(myRaster, format = "ENVI")

要从qgis打开文件,例如你要选择.gri文件(二进制文件),它应该可以工作。

答案 1 :(得分:5)

有点晚但可能会帮助其他人寻找可能的解决方案:

writeRaster(stk, filename=names(stk), bylayer=TRUE,format="GTiff")

答案 2 :(得分:1)

我将我的文件写成ENVI文件并更改了ENVI头文件中的波段名称。现在可以在ENVI和ArcGis中打开文件,并保留图层名称。

#write ENVI file (.envi; .hdr; .envi.aux.xml) with automatic layer names
writeRaster(stk, "myStack" , format="ENVI")

#change layer names in ENVI header (.hdr):
n="myStack.hdr"  
x <- readLines(n)
x <- gsub("Band 1,", "one,", x) 
x <- gsub("Band 2,", "two," , x)
x <- gsub("Band 3", "three", x)  
cat(x, file=n, sep="\n") #overwrites the old ENVI header

/编辑 我刚刚注意到,当.envi文件导回到R时,图层名称会再次被删除。同样的问题在SAGA。

image <- stack("myStack.envi")  
names(image)
#[1] "myStack.1" "myStack.2" "myStack.3"

image = readGDAL("myStack.envi") 
names(image)
#[1] "band1" "band2" "band3"