3

UTM-X(256) と UTM-Y(256) 座標で構成される 3 つの NumPy 配列と、UTM の気象レーダー 256x256 (km) の累積降雨量 (65536) があります。

UTM の流域境界であるグリッド境界内にポリゴンもあります。

集水域ポリゴン (RADAR データのクリップされたサブセット) だけの平均降雨量、最大値、および最大値の位置を決定する必要があります。RADAR グリッド全体の平均はすでに決定しています。

問題は、Polygon によって決定される NumPy 配列のサブセットに対して分析を実行するにはどうすればよいかということです。これは非常に一般的な操作だと思いましたが、この操作を実行する Python スクリプトは見つかりませんでした。

データセットの図を次に示します。

UTM の RADAR Grid と白い破線の集水域ポリゴンの画像 赤い星は雨量計の位置を示しています

4

2 に答える 2

1

考えられるアプローチの概要を次に示します。

まず、集水域の境界に接するポリゴンを見つけます。ポイントの完全なセットの UTM 座標のどれがその集水域の境界を形成するかを知っていると仮定すると、次のようになります。

キャッチメント = (UTM_X, UTM_Y) ポイント タプルの np.array

scipy.spatial.ConvexHullを使用して、そのポイント セットの境界を見つけることができます。

境界= scipy.spatial.ConvexHull(集水域)

次に、降雨データの配列について、座標が凸包の境界の内側にあるか外側にあるかをテストする必要があります。

この前のSOの質問には、その座標テストを行う方法を説明するいくつかの良い答えがあります.

最後に、境界内にあるというテストに合格した降雨データ ポイントを収集し、適切な NumPy/SciPy 統計関数を使用して、必要な統計計算を実行します。

于 2015-07-15T01:14:17.897 に答える
1

境界がポリゴン頂点のリストとして与えられていると仮定すると、matplotlib でデータ座標に対してマスクを生成し、そのマスクを使用して等高線内の値のみを合計することができます。

つまり、関心領域をマークする多角形の境界を定義する一連の座標がある場合、matplotlib に、この多角形内にあるすべての座標を示すブール値マスクを生成させます。このマスクを使用して、等高線内の限られた降雨量のデータセットのみを抽出できます。

次の簡単な例は、これがどのように行われるかを示しています。

import numpy as np
from matplotlib.patches import PathPatch
from matplotlib.path import Path
import matplotlib.pyplot as plt

# generate some fake data
xmin, xmax, ymin, ymax = -10, 30, -4, 20 
y,x = np.mgrid[ymin:ymax+1,xmin:xmax+1]
z = (x-(xmin+xmax)/2)**2 + (y-(ymin + ymax)/2)**2
extent = [xmin-.5, xmax+.5, ymin-.5, ymax+.5]
xr, yr = [np.random.random_integers(lo, hi, 3) for lo, hi
         in ((xmin, xmax), (ymin, ymax))] # create a contour

coordlist = np.vstack((xr, yr)).T  # create an Nx2 array of coordinates
coord_map = np.vstack((x.flatten(), y.flatten())).T # create an Mx2 array listing all the coordinates in field

polypath = Path(coordlist)
mask = polypath.contains_points(coord_map).reshape(x.shape) # have mpl figure out which coords are within the contour

f, ax = plt.subplots(1,1)
ax.imshow(z, extent=extent, interpolation='none', origin='lower', cmap='hot')
ax.imshow(mask, interpolation='none', extent=extent, origin='lower', alpha=.5, cmap='gray')
patch = PathPatch(polypath, facecolor='g', alpha=.5)
ax.add_patch(patch)
plt.show(block=False)
print(z[mask].sum())  # prints out the total accumulated

matplotlib で輪郭をマスキングする この例では、xandyは yourUTM-XおよびUTM-Ydataranges を表します。zは気象降雨量データを表しますが、この場合はマトリックスであり、平均降雨量の単一列ビュー (グリッドに簡単に再マッピングできます) とは異なります。

z最後の行では、輪郭内にあるすべての値を合計しました。平均が必要な場合は、 に置き換えsummeanください。

于 2015-07-15T02:22:01.227 に答える