2016-09-18 4 views
0

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

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 г размер (т.е. год) не сохраняется. Например:

#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

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

ответ

0

Не думаю, что это та же проблема, что и другой вопрос. Переменные 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 и более GIS-y-моделями. Я не знаю, какой простой способ понять это, но жестокий опыт. NetCDF очень общий и очень мощный, но сама библиотека очень низкоуровневая и слишком упрощенная. (Это все плиты и кусочки, нет сырой «индексной» абстракции, по крайней мере, недостаточно, чтобы быть полезной).

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

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