0

以前にラスター スタックから書き込まれたように、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

必要なものを取得するためのいくつかの複雑な回避策がありますが、それらはほとんど効率が悪いようです (つまり、スタックをマトリックスに変換してから、ここから操作します)。大量の余分なコードを記述したり、不要な RAM を占有したりすることなく、よりエレガントな方法があるかどうか疑問に思っています。

4

1 に答える 1

3

これは他の質問と同じ問題ではないと思います。NetCDF 変数には がないdimnamesため、ここで希望する方法でラスター スタックを往復することはできません。

しかし、は Z 次元Zdimであり、名前ではありません。少なくとも、setZ(rstack, <zdimvals>)それを書く前にそうすることが期待されます。writeRaster3D 変数の生成に十分な経験がありませんが、これはうまくいくようです。

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% を達成する傾向がありますが、必要な場合は他のツールを使用します。

于 2016-09-21T15:44:46.017 に答える