netCDFデータを扱ってみよう


1.netCDFデータについて


(netCDFデータとは?)

netCDFデータは,「.nc」という拡張子で表示されるバイナリデータです.
例えば,NCEP/NCARの再解析データが公開されているこちらのサイト⇒Earth System Research Laboratory(ESRL)
ここでは,気温や風速といった様々なnetCDFデータが公開されています.

その中でも,今回はNCEP-DOEの再解析データⅡの「air.mon.mean.nc」(※重いデータなので要注意!)というnetCDFデータを処理していきます.
(※本研究室内では,このデータはhome/kaoru/Climate/NCEP/のディレクトリに置いてありますので,ここからコピーすると良いかと思います.)



(netCDFデータの様々な処理方法)

netCDFデータを処理する方法は,rubyでデータを取り出す方法,grads(※描画ソフトです)で直に描画する方法など様々あります.
今回は,Linux上でrubyを動かし,且つ,NArrayという配列処理に適したソフトを介してデータ処理をおこなう手法をご紹介します.
そのために必要なソフトが以下になります.

RubyNetCDF の 「ruby-netcdf-0.6.3.tar.gz」   :Linux上でnetCDFデータをrubyで処理するために開発されたソフト
NArray の 「narray-0.5.9p7.tar.gz」        :その名の通り,配列処理に特化したソフト(Rubyよりも優れた配列処理機能を持つ)
( ↑ いずれのサイトも日本語解説ページがあります.分かりにくい方は,そちらをご参照ください.)

少し脱線しますが…
上記2つの圧縮ファイルは,どちらも「.tar.gz」という拡張子が付いていますね.
tar (tape archivesの略) ファイルは,複数のファイルを単に一つのファイルにまとめたものと考えてください.
gz (GNU ZIPの略) ファイルは,フリーソフトウェアで使用できる(GNUプロジェクトhttp://ja.wikipedia.org/wiki/GNU)圧縮ファイル(ZIPファイル)と考えてください.
これら,tarとgzが組み合わさったファイルが,「.tar.gz」もしくは,「.tgz 」という拡張子を持つファイルになります.




netCDFデータを処理する前に,その前段階として,上で紹介している RubyNetCDF と NArray が扱える環境にする必要があります.
まずは,その方法から説明していきます.

2.RubyNetCDF と NArray のインストール方法

まず,上記の「ruby-netcdf-0.6.3.tar.gz」と「narray-0.5.9p7.tar.gz」というファイルをLinux上(Xming)のディレクトリに落としてきてください.
(※このようなファイルの転送には,FFFTPというソフトが役立ちます.これは,Linuxサーバーと各マシーンとをつなぐソフトです.サーバーから各マシーンへ,または,各マシーンからサーバーへファイルを転送できます.)


以下が,RubyNetCDFとNArrayのインストール手順になります.

(RubyNetCDF のインストール)

  • tar xvfz ruby-netcdf-0.6.3.tar.gz
  • cp *rb test  (←マシーンに合わせたかたちで使用していきたいので,testというディレクトリにRubyスクリプトをコピーします.)
  • cd test
  • ruby extconf.rb
  • make
  • sudo make site-install

(NArray のインストール)

  • tar xvfz narray-0.5.9p7.tar.gz
  • nkf -w README.ja | less
  • ruby exconf.rb
  • ruby exconf.rb --with -netcdf-dir = /usr/local/netcdf
  • make test
  • sudo make site-install

<コマンドの解説> 
tar              …tarファイルを解凍するコマンド
xvfz             …x:出力する,v:途中経過をみる,f:fileを後ろに持ってくる,z:gzファイル
extconf.rb     …「extconf.rb」は,Makefileを作成するRubyスクリプト,rubyを走らせることでMakefileができる
make             …インストールする
sudo make site-install  …管理者権限(sudo)を持って,インストールする
nkf -w           …「nkf」は,文字コード変換コマンド,「-w」は,UTFに変換するコマンド,ここでは,README.jaファイルを日本語で表示している




3.RubyNetCDF・NArrayを使用したデータ処理


データ処理をおこなうスクリプトを作るために,まずemacsを立ち上げます.
  • emacs &
そこで,以下のようなスクリプトを作ります.
スクリプトは,使用するデータと同じディレクトリ内で作成します.

スクリプト名 「nc_read.rb」
require 'numru/netcdf'
include NumRu

file = NetCDF.open("air.mon.mean.nc")           # NetCDFのファイル "air.mon.mean.nc" を開いて(open),fileと定義

=begin
p file                                          # ファイル名を表示(p:paste)
p ["ndims",file.ndims]                          # 次元の数を返して表示
p ["nvars",file.nvars]                          # 変数の数を返して表示
p ["natts",file.natts]                          # 属性の数を返して表示
#p file.vars
p file.var_names                                # 変数の名前を返して表示
p file.dim_names                                # 次元の名前を返して表示
p file.att_names                                # 属性の名前を返して表示

p file.var("level").get                         # ファイルに存在する "level(変数名)" の変数を開いて,取り出し(get)て表示
=end                                            # 「=begin」 と 「=end」 の間は読み飛ばされる
                                               
temp = file.var("air")                          # ファイルに存在する "air(変数名)" の変数を「temp」と定義
p temp.get                                      # temp を表示  

スクリプトが出来上がったら,Rubyを走らせます.
  • ruby nc_read.rb

すると,Xmingの画面上に以下のように表示されます.

NArray.sint(144,73,17,360):
[ [ [ [ -21990, -21990, -21990, -21990, -21990, -21990, -21990, ... ],
   [ -22013, -22015, -22017, -22019, -22020, -22022, -22023, ... ],
   [ -22017, -22025, -22033, -22040, -22048, -22055, -22061, ... ],
   [ -21877, -21897, -21918, -21940, -21964, -21990, -22015, ... ],
   [ -21453, -21459, -21473, -21496, -21528, -21568, -21618, ... ],
   [ -20805, -20749, -20711, -20697, -20706, -20739, -20794, ... ],
   [ -20146, -20003, -19897, -19831, -19809, -19828, -19882, ... ],
   [ -19610, -19425, -19296, -19229, -19223, -19270, -19357, ... ],
   [ -19209, -19063, -18992, -18999, -19076, -19210, -19377, ... ],
   [ -18959, -18908, -18937, -19048, -19224, -19445, -19684, ... ],
<解説>
NArray.sint          … 2バイトで整数の配列
[ [ [ [ -21990,…     … 変数名「air」の値

スクリプト「nc_read.rb」の「=begin」「=end」を取り除いてRubyを走らせると以下のように表示されます.

NetCDF:air.mon.mean.nc
["ndims", 5]
["nvars", 6]
["natts", 8]
["level", "lat", "lon", "time", "time_bnds", "air"]
["lon", "lat", "level", "nbnds", "time"]
["Conventions", "title", "history", "comments", "platform", "source", "institution", "references"]
NArray.sfloat(17):
[ 1000.0, 925.0, 850.0, 700.0, 600.0, 500.0, 400.0, 300.0, 250.0, 200.0, ... ]
NArray.sint(144,73,17,360):
[ [ [ [ -21990, -21990, -21990, -21990, -21990, -21990, -21990, ... ],
   [ -22013, -22015, -22017, -22019, -22020, -22022, -22023, ... ],
   [ -22017, -22025, -22033, -22040, -22048, -22055, -22061, ... ],
   [ -21877, -21897, -21918, -21940, -21964, -21990, -22015, ... ],
   [ -21453, -21459, -21473, -21496, -21528, -21568, -21618, ... ],
   [ -20805, -20749, -20711, -20697, -20706, -20739, -20794, ... ],
   [ -20146, -20003, -19897, -19831, -19809, -19828, -19882, ... ],
   [ -19610, -19425, -19296, -19229, -19223, -19270, -19357, ... ],
   [ -19209, -19063, -18992, -18999, -19076, -19210, -19377, ... ],
   [ -18959, -18908, -18937, -19048, -19224, -19445, -19684, ... ],
<解説>
NetCDF:air.mon.mean.nc          … ファイル名
["ndims", 5]                    … 次元の数が5個
["nvars", 6]                    … 変数の数6個
["natts", 8]                    … 属性の数8個
["level", "lat"…                 … 変数の名前
["lon", "lat", …                 … 次元の名前
["Conventions", …                … 属性の名前
NArray.sfloat(17):              … (小数点第一位までの)小数17個の配列
[ 1000.0, 925.0, …               … 変数名「level」の値


以上で,今回は終わりにします.





名前:
コメント:


タグ:

+ タグ編集
  • タグ:
最終更新:2009年12月10日 02:58