Экспорт имен растров из стека растров в файл NetCDF в R

Я пытаюсь извлечь имена растровых слоев из файла netcdf, как ранее было написано, из стека растров. Экспорт растрового стека в ncdf работает нормально. Например:

library(raster)
library(ncdf4)
library(RNetCDF)

#Create some rasters (x3)
r1<-raster(system.file("external/test.grd", package="raster"))
r2<-r1*2
r3<-r2*3

#Stack them
rstack<-stack(r1,r2,r3)

#Give each raster layer a name - in this instance years 2014 to 2016
names(rstack)<-c("2014","2015","2016")

#Write out to netcdf format
writeRaster(rstack, "rstack.nc", overwrite=TRUE, format="CDF", varname="Temperature", varunit="degC", 
        longname="Temperature -- raster stack to netCDF", xname="X", yname="Y",zname="Year",
        zunit="numeric")

Однако, когда я читаю файл ncdf обратно в R, размер Z (т.е. год) не сохраняется. Например:

#Open the new netcdf dataset and look at the Z dimention, i.e. "Year"
data.nc<- open.nc("rstack.nc")
Zdim = var.get.nc(ncfile=data.nc,variable="Year")
print(Zdim)
#[1] 1 2 3

Итак, мы получаем номера диапазонов, то есть 1,2,3. Но мне нужен текст, определенный Годом (например, 2014,2015,2016), как определено в:

names(rstack)<-c("2014","2015","2016")

Можно ли сделать это?? Эта проблема не нова, обратитесь сюда: https://gis.stackexchange.com/questions/122167/export-band-names-with-netcdf-file-in-r.

Есть несколько запутанных обходных путей для получения того, что требуется, но они кажутся в значительной степени неэффективными (то есть преобразование стека в матрицу, а затем управление ею отсюда). Просто интересно, есть ли более элегантный способ без необходимости писать большой объем дополнительного кода и занимать ненужную оперативную память.


person Mat W    schedule 18.09.2016    source источник


Ответы (1)


Я не думаю, что это та же проблема, что и другой вопрос. Переменные NetCDF не имеют dimnames, поэтому вы не можете выполнить обход растрового стека так, как хотите.

Но Zdim - это значения в измерении Z, а не имена, и, по крайней мере, я ожидаю, что вы setZ(rstack, <zdimvals>) перед тем, как его напишите. У меня недостаточно опыта в использовании writeRaster для создания 3D-переменных, но, похоже, это работает.

library(raster)
library(ncdf4)
library(RNetCDF)

#Create some rasters (x3)
r1<-raster(system.file("external/test.grd", package="raster"))
r2<-r1*2
r3<-r2*3

#Stack them
rstack<-stack(r1,r2,r3)
rstack <- setZ(rstack, 2014:2016)
#names(rstack)<-c("2014","2015","2016")

#Write out to netcdf format
writeRaster(rstack, "rstack.nc", overwrite=TRUE, format="CDF",     varname="Temperature", varunit="degC", 
        longname="Temperature -- raster stack to netCDF", xname="X",   yname="Y",zname="Year",
        zunit="numeric")

## your ncdf4 code was not right, looked like RNetCDF (which is fine)
data.nc<- nc_open("rstack.nc")
Zdim = ncvar_get(data.nc,varid="Year")
#print(Zdim)  ## now it's numeric
##[1] 2014 2015 2016

Возможно, вы захотите изучить единицы и метаданные, которые вы используете для хранения этих значений года.

Наконец, это очень сбивает с толку, но все сводится к разрыву между NetCDF и другими моделями ГИС. Я не знаю простого способа понять это, кроме грубого жестокого опыта. NetCDF очень общий и очень мощный, но сама библиотека очень низкоуровневая и слишком упрощенная. (Это все плиты и срезы, нет необработанной абстракции "индекса", по крайней мере, недостаточно, чтобы быть полезным).

Инструменты, предоставляемые растром, имеют чрезвычайно высокий уровень и поэтому менее гибкие. Единственный другой инструмент, который хоть немного близок к такому высокому уровню, - это Ferret, по каким-либо причинам интенсивное использование NetCDF остается либо очень ориентированным на NetCDF, либо просто тупыми массивами с базовыми метаданными. Подобные структурированные объекты встречаются редко. Обычно манипуляции с NetCDF лучше выполнять с помощью инструментов «оператора nc», но я думаю, стоит изучить несколько вариантов, и если вы можете заставить растр R делать то, что вам нужно, вы далеко впереди.

Python также очень популярен для NetCDF и GDAL, но GDAL страдает от той же точки зрения "GIS-y", что и растр. Это сложно, лично я стараюсь получить 99% только с помощью R и GDAL, но я использую другие инструменты, когда мне нужно.

person mdsumner    schedule 21.09.2016