R: Записать RasterStack и сохранить имена слоев

У меня есть растровый стек 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"

Знаете ли вы, как сохранить имена слоев при записи RasterStacks в R? Я попытался записать стек в форматы GeoTIFF и NetCDF.

Спасибо, Кевин

Ответ 1

Вы можете использовать собственный растровый формат:

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

Формат растровой сетки состоит из двоичного файла .gri и файла заголовка .grd. Это сохранит ваши имена. Обратите внимание, однако, что .gri двоичные файлы не сжимаются.

Если вам нужно открыть файлы растровых файлов grd в других программах, вам, скорее всего, понадобится написать дополнительный файл заголовка. Для этого я обычно использую формат заголовка ENVI.

hdr(myRaster, format = "ENVI")

Чтобы открыть файл из qgis, например, вы должны выбрать файл .gri(двоичный файл), и он должен работать.

Ответ 2

Немного поздно, но может помочь кому-то еще найти возможное решение:

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

Ответ 3

Я написал свои файлы как файлы 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"