環境システム株式会社公式HP

〒660-0083 兵庫県尼崎市道意町7-1-3
尼崎リサーチ・インキュベーションセンター512

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

蛇使いな彼女BLOG

【第80回】 netCDFを扱う #1.

2023.03.03

皆さんこんにちは!
今回本橋は地形データを触ってみたので、その概要と使用データについて書いていこうと思います。
そもそもこういうマッピングはGIS(地理情報システム)という地図と空間データを組み合わせたものが有名ですね。
何年か前、ダムのエレベーション変更に国土交通省HPの国土地理院から標高データを取得したことがありますが、イメージと違って残念だった記憶があります。
というのも実際のダムは山の斜面を平地に均して建造されていて、ダム湖内の機械が衛星から取得した座標ポイントを使って標高に変換しましたが、どうもこの標高データというのは山間部だと山肌?を測量しているのかあり得ない数値だったのを覚えています。
まあメジャー持って現地に出向いて測るわけにもいかないでしょうし、これが限界だなあと(笑)

今日はそれと似たようなデータでアメリカ合衆国のNOAAからETOPO1という世界の陸の標高と海底水深のデータを扱ってみることにしました。

↑View ETOPO1_Ice_g_geotiff.tif in Inkscape.

上のモノクロの世界地図はETOPO1を画像で表したときのデータです。
以下はこれと同じ地図をnetCDFというGISで利用されるデータ形式でダウンロードし、Pythonで表示した結果です。

netCDFの正式名称はNetwork Common Data Fromであり気温・湿度・気圧などの多次元データを格納しているファイルで、一般的にこのデータを図化する場合はPhotoshopを使うようなイメージでしょうか?
時間や場所などの次元をレイヤーのように投影することで表示出来るようです。
(私も使ったことがないのでさっぱりですが)

netCDFについてのプログラミング的な知見や詳細はユニデータというコミュニティで公開されています。
上記のスクリプトではNOAAのホームページからデスクトップ上にダウンロードしたnetCDF形式のETOPO1Python上で読み込んでいます。
(※netCDFはダウンロード直後は圧縮状態のため、専用ソフトで解凍処理を行わないと読み込めませんよ!)

etopo1という変数を参照すると、データに関する説明書きが表示されるだけで、データの中身や数値配列は直接出て来ないことがnumpyの配列参照やpandasのデータフレームとは扱いが異なる点です。
netCDFの内部構造や格納値を参照するためには、Python標準モジュールのinspectをインポートした状態で、inspect.getmembers(dataset)を実行すると以下のようにリストに格納された状態の内部関数と変数が(‘属性’、<オブジェクト>)、(‘キー’:関数)などがコンマ区切りで確認できます。―(6行目)

↑netCDF内部構造参照結果

ここでキーに当たるタプル左側の値をetopo1.dimensionsやetopo1.variables、etopo1.__class__など、個別に指定し実行すると、特定のデータ情報を参照することができます。

余談ですが__class____doc__などアンダーバー(アンダースコア)から始まる関数や変数はクラス構造でよく見かけますが、関数の使い方を区別する意味があるようです。
例えばある関数の返り値が3つあって、そのうち1つ使わない物があれば、a,b,_=function()と記述することでメモリの節約ができるんだとか。
※注 本文上記で赤く示されたアンダーバーは、画面表示上全角に見えますが、コードスクショで確認できるように、実際は2連半角です。

話が逸れましたが、先程のnetCDF内部構造参照結果の7行目以降、float64 x(x)… float64 y(y)… int32 z(y,x) とありますが、これがデータセットの値に紐づく変数になっています。
netCDFのDataset()で開いたデータは普段使用しているライブラリのように階層的な構造化された状態で返ってくるので、etopo1.variables[‘x’][:] 、etopo1.variables[‘y’][:]という風に記述するとデータが参照できます。

聞き慣れないデータセットと少し難しい話でしたが、次回は図化についてお話していきます。

pagetop