2016-09-18 70 views
0

我想從之前從柵格堆棧寫入的netcdf文件中提取柵格圖層名稱。將柵格堆棧導出到ncdf可以正常工作。例如:將柵格堆棧中的光柵名稱導出到R中的NetCDF文件中

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

有一些令人費解的變通方法來獲得需要什麼,但他們似乎大部分是無效的(即堆棧轉換爲基質,然後從這裏操縱它)。只是想知道是否有更優雅的方式,而無需編寫大量的額外代碼並佔用不必要的RAM。

回答

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操作符」工具完成,但值得探索一些我認爲的選項,如果您可以使用R的柵格來完成您所需要的操作,那麼您可以提前完成。

Python對於NetCDF和GDAL也非常流行 - 但GDAL遭受與柵格相同的「GIS-y」透視。這很複雜,我個人傾向於使用R和GDAL來獲得99%,但是當我需要的時候我會使用其他工具。