5

THREDDS によって提供されている三角メッシュ モデルからデータのサブセットを取得しようとしています。LAT/LON 境界ボックスを指定して、そのボックス内からデータを取得できるようにしたいと考えています。データ URL は次のとおりです。

http://www.smast.umassd.edu:8080/thredds/dodsC/FVCOM/NECOFS/Forecasts/NECOFS_MET_FORECAST.nc

グリッド化されたデータを使用すると、THREDDS サーバーからのデータを簡単にサブセット化できます。THREDDS が提供する三角形メッシュのサブドメインを取得する最善の方法を知っている人はいますか?

グリッド データの場合、Ferret を OPeNDAP クライアントとして使用し、ダウンロード プロセスをスクリプト化できます。Matlab、Python、またはその他のツールを使用できますが、ここで同様のことをしたいと思います。

ありがとう、

スティーブ

4

2 に答える 2

5

Opendap と NetCDF では、不規則なインデックス作成を使用した抽出は許可されていません。スタート、ストップ、ストライドのみをリクエストできます。

また、これは三角形グリッドであるため、同じ領域内の三角形のノードが同様のインデックスを持つという保証はありません。したがって、バウンディング ボックス内のノードのみを取得する場合は、1 つずつ要求する必要があります。そしてそれは遅いです。したがって、多くの場合、最小インデックスと最大インデックスを決定し、そのチャンク全体を 1 つの部分として要求してから、必要に応じてインデックスを抽出する方が高速です。

Python での 2 つのアプローチのサンプル比較を次に示します。この例では、すべてのインデックスを含むサブセットを抽出すると、各インデックスをループして時系列を抽出するよりも約 10 倍速くなります。

import netCDF4
import time
import numpy as np

url='http://www.smast.umassd.edu:8080/thredds/dodsC/FVCOM/NECOFS/Forecasts/NECOFS_GOM3_FORECAST.nc'
nc = netCDF4.Dataset(url)
ncv = nc.variables
lon = ncv['lon'][:]
lat = ncv['lat'][:]
tim = ncv['time'][:]

# find indices inside box
box = [-71.4,41,-70.2,41.5]
ii = (lon>=box[0])&(lon<=box[2])&(lat>=box[1])&(lat<=box[3])
# jj will have just indices from inside the box:
jj = np.where(ii)[0]

各インデックスをループすると、遅くなります。

# loop over indices, extracting time series
time0=time.time()
zi = np.zeros((len(tim),len(jj)))
k=0
for j in jj:
    zi[:,k]=ncv['zeta'][:,j]
    k +=1
print('elapsed time: %d seconds' % (time.time()-time0))

elapsed time: 56 seconds

しかし、時間ステップごとに範囲をループすると、はるかに高速になります。

time0=time.time()
zi2 = np.zeros((len(tim),len(jj)))
jmin=jj.min()
jmax=jj.max()

for i in range(len(tim)):
    ztmp = ncv['zeta'][i,jmin:jmax+1]
    zi2[i,:] = ztmp[jj-jmin]
print('elapsed time: %d seconds' % (time.time()-time0))

elapsed time: 6 seconds

もちろん、構造化されていないグリッドのサイズ、サブセット内のポイントの近さ、抽出するポイントの数などによって、結果は異なる場合があります。

于 2014-11-07T10:31:14.393 に答える