2016-09-18 8 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に読み込んだとき、Z次元(つまりYear)は保持されません。例:

#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>)にあなたを期待します。私は、3Dバールを生成するためにwriteRasterを使用するだけで十分な経験はありませんが、これはうまくいくようです。

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は非常に一般的で非常に強力ですが、ライブラリ自体は非常に低レベルで、少し単純すぎます。 (それはすべてのスラブとスライスで、少なくとも「有用」には十分ではない)未加工の「インデックス」抽象化はありません。

ラスタによって提供されるツールは、非常に高水準で柔軟性が低いです。いずれの理由でも、NetCDFの使用量が非常に多いNetCDFに焦点を当てるだけでなく、基本的なメタデータを持つ単純な配列にとどまっているため、高レベルに近いところにある唯一の他のツールはフェレットです。このような構造化オブジェクトはまれです。一般に、NetCDFの操作は「nc演算子」ツールでうまくいきますが、私が思ういくつかのオプションを調べる価値があります。また、Rのラスターに必要なものを手に入れることができれば、先を行くことができます。

PythonはNetCDFとGDALでも非常に普及していますが、GDALはラスターと同じ「GIS-y」パースペクティブに苦しんでいます。複雑ですが、私は個人的にはRとGDALだけで99%を得る傾向がありますが、私は必要なときに他のツールを使用します。

関連する問題