13

R.

私のnetCDFファイルの要約は以下の通りです。2 つの次元 (緯度と経度) と 1 つの変数 (10U_GDS4_SFC) があります。これは基本的に、風の値を含む緯度/経度のグリッドです。

[1] "file example.nc has 2 dimensions:"
[1] "lat_0   Size: 1280"
[1] "lon_1   Size: 2560"
[1] "------------------------"
[1] "file example.nc has 1 variables:"
[1] "float 10U_GDS4_SFC[lon_1,lat_0]  Longname:10 metre U wind component Missval:1e+30"

緯度変数は +90 から -90 まで、経度変数は 0 から 360 までです。

次の地理的なコーナー境界を使用して、グリッド全体のサブセットを抽出したいと考えています。

左下隅: 緯度: 34.5°、経度: 355°、左上隅: 緯度: 44.5°、経度: 355°、右上隅: 緯度: 44.5°、経度: 12°、右下隅: 緯度: 34.5° 、ロング:12°

コマンドを使用して変数の一部を抽出できることを認識していますget.var.ncdf()(以下の例):

z1 = get.var.ncdf(example.nc, "10U_GDS4_SFC", start=c(11,26), count=c(5,5))

ただし、変数値を含むサブセット化された空間グリッドになるように、緯​​度/経度をどのように組み込むことができるかを理解できません。私はRでnetCDF値を扱うのが初めてで、アドバイスをいただければ幸いです。どうもありがとう!

4

3 に答える 3

8

原則として、あなたはそこまでの道のりの 2/3 です。もちろん、次のようなものを使用して開始インデックスを作成できます。

require(ncdf4)

ncFile <- nc_open( MyNetCDF )
LonStartIdx <- which( ncFile$dim$lon$vals == 355)
LatStartIdx <- which( ncFile$dim$lat$vals == 34.5)

カウントについても同じことを行います。次に、必要な変数を読み取ります

MyVariable <- ncvar_get( ncFile, varName, start=c( LonStartIdx, LatStartIdx), count=...)

ただし、あなたの場合、私の知る限り、あなたは運が悪いです。netcdf ルーチンの読み取り/書き込みは、順番に処理を行います。経度が 0 ~ 360 の座標があり、ゼロ子午線を含むボックスに関心があるため、グリッドは折り返します。

あなたにとって(データが多すぎないと仮定すると)、フルグリッドをRに読み込み、Rの「ボックス」subsetを使用してインデックスを作成しwhichて切り取る方が理にかなっています.

ncFile <- nc_open( MyNetCDF )
LonIdx <- which( ncFile$dim$lon$vals > 355 | ncFile$dim$lon$vals < 10)
LatIdx <- which( ncFile$dim$lat$vals > 34.5 & ncFile$dim$lat$vals < 44.5)
MyVariable <- ncvar_get( ncFile, varName)[ LonIdx, LatIdx]
nc_close(ncFile)

備考: 私ncdf4は .

Ok。コメントは必要な限り長くできないので、回答を更新しました心配ありません。質問を順を追って見ていきましょう。

  • 関数のwhich方法が機能します。私はそれを自分で使用します。
  • データは netcf ファイルと同様の形式になりますが、0 子午線に問題があるかどうかはよくわかりません (私はそうだと思います)。次のようにして、2 つの半分を交換する必要がある場合があります (2 番目の例の対応する行を置き換えます)。

    LonIdx <- c(which( ncFile$dim$lon$vals > 355) , which( ncFile$dim$lon$vals < 10) )
    

    これにより、座標インデックスの順序が変更され、西部が最初に、次に東部が来るようになります。

  • すべてを 2x3 データ フレームに再フォーマットすることが可能です。2 番目のコード例が返すデータを取得します (行列 [lon x lat] になります。また、座標の値も取得します。

    lon <- ncFile$dim$lon$val[LonIdx]
    

    (または、あなたの例で経度がどのように呼び出されるか、同じlat)。次に、次を使用して行列を組み立てます

    cbind( rep(lat, each=length(lon)), rep(lon,length(lat)), c(myVariable) )
    
  • もちろん、座標は netcdf ファイルと同じになります...

座標を台無しにしていないという確信は約 98% しかないので、最後の cbind をサミティ チェックする必要があります。デスクトップで見つけた R スクリプトでは、ループを使用していますが、これは... 悪質です... これは (少し?) 高速であり、より賢明でもあります。

于 2014-01-22T11:02:05.130 に答える