2014-11-05 129 views
10

我有一个光栅栈,stk,在R.由三个光栅图像下面是一个简单的例子R:写RasterStack和保留层名称

# 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格式。

谢谢,凯文

+0

你在哪里阅读堆叠的tif文件? – 2014-11-06 23:31:30

+0

Paulo,感谢您的关注。我刚刚清理了这个例子,使其更加清晰并修正了一些措辞。我使用'stk < - stack(“myStack.tif”)'(最后一个代码块的第一行)读入堆栈的tif文件。再次感谢。 – kguay 2014-11-07 18:52:10

回答

5

您可以使用本机光栅形式:

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

光栅网格格式由二进制.gri文件和.GRD头文件。这将保留你的图层名称。但是请注意,.gri二进制文件不会被压缩。

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

hdr(myRaster, format = "ENVI") 

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

+0

感谢您的回答!在R中读取栅格,图层名称将被保留。但是,QGIS无法显示正确的图层名称,尽管它们正确存储在.grd和.hdr文件中。有针对这个的解决方法吗? – 2017-03-23 17:21:10

4

有点晚了,但可能帮助别人寻找可能的解决方案:

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

这将按照OP的问题将每个图层写入单独的文件,而不是将所有图层和它们的名称写入一个堆栈。 – shekeine 2016-10-03 18:51:37

0

我写我的文件,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"