web-dev-qa-db-ja.com

不規則なグリッド上の補間

つまり、緯度、経度、およびいくつかのプロパティ値をグリッドに格納する3つのnumpy配列があります。つまり、LAT(y、x)、LON(y、x)、およびたとえば温度T(y、x)があります。 )、xとyのいくつかの制限について。グリッドは必ずしも規則的ではありません。実際、グリッドは3極です。

次に、これらのプロパティ(温度)値を、実際のグリッドポイントに該当しないさまざまなlat/lonポイント(lat1(t)、lon1(t)として約10,000 t ...として保存)に補間したいと思います。 。 matplotlib.mlab.griddataを試しましたが、時間がかかりすぎます(結局のところ、実際には私が行っていることを目的として設計されていません)。 scipy.interpolate.interp2dも試しましたが、MemoryErrorが発生します(グリッドは約400x400です)。

これを行うための巧妙な、できれば高速な方法はありますか?仕方がないのですが、答えは当たり前だと思います…ありがとう!

22
user391045

逆距離加重と scipy.spatial.KDTree の組み合わせを試してくださいSO inverse-distance-weighted-idw-interpolation-with-pythonKd-trees 2d 3d ...でうまく機能し、逆距離加重はスムーズでローカルであり、k =最近傍の数は速度/精度のトレードオフに応じて変更できます。

10
denis

Roger Veciana i Roviraによる素敵な逆距離の例 と、GDALを使用してgeotiffに書き込むコードがあります。

これは通常のグリッドには粗いですが、最初にpyprojなどを使用してデータをピクセルグリッドに投影すると仮定します。その間、データにどの投影が使用されるかに注意してください。

testを使用した彼のアルゴリズムのコピー:

from math import pow  
from math import sqrt  
import numpy as np  
import matplotlib.pyplot as plt  

def pointValue(x,y,power,smoothing,xv,yv,values):  
    nominator=0  
    denominator=0  
    for i in range(0,len(values)):  
        dist = sqrt((x-xv[i])*(x-xv[i])+(y-yv[i])*(y-yv[i])+smoothing*smoothing);  
        #If the point is really close to one of the data points, return the data point value to avoid singularities  
        if(dist<0.0000000001):  
            return values[i]  
        nominator=nominator+(values[i]/pow(dist,power))  
        denominator=denominator+(1/pow(dist,power))  
    #Return NODATA if the denominator is zero  
    if denominator > 0:  
        value = nominator/denominator  
    else:  
        value = -9999  
    return value  

def invDist(xv,yv,values,xsize=100,ysize=100,power=2,smoothing=0):  
    valuesGrid = np.zeros((ysize,xsize))  
    for x in range(0,xsize):  
        for y in range(0,ysize):  
            valuesGrid[y][x] = pointValue(x,y,power,smoothing,xv,yv,values)  
    return valuesGrid  


if __name__ == "__main__":  
    power=1  
    smoothing=20  

    #Creating some data, with each coodinate and the values stored in separated lists  
    xv = [10,60,40,70,10,50,20,70,30,60]  
    yv = [10,20,30,30,40,50,60,70,80,90]  
    values = [1,2,2,3,4,6,7,7,8,10]  

    #Creating the output grid (100x100, in the example)  
    ti = np.linspace(0, 100, 100)  
    XI, YI = np.meshgrid(ti, ti)  

    #Creating the interpolation function and populating the output matrix value  
    ZI = invDist(xv,yv,values,100,100,power,smoothing)  


    # Plotting the result  
    n = plt.normalize(0.0, 100.0)  
    plt.subplot(1, 1, 1)  
    plt.pcolor(XI, YI, ZI)  
    plt.scatter(xv, yv, 100, values)  
    plt.title('Inv dist interpolation - power: ' + str(power) + ' smoothing: ' + str(smoothing))  
    plt.xlim(0, 100)  
    plt.ylim(0, 100)  
    plt.colorbar()  

    plt.show() 
5
ryanjdillon

ここにはたくさんのオプションがありますが、どれが最適かはデータによって異なります...しかし、私はあなたのためのすぐに使えるソリューションを知りません

入力データは三極データからのものであるとあなたは言います。このデータをどのように構成できるかについては、主に3つのケースがあります。

  1. 三極空間の3Dグリッドからサンプリングされ、2D LAT、LONデータに投影されます。
  2. 三極空間の2Dグリッドからサンプリングされ、2D LATLONデータに投影されます。
  3. 2d LATLONデータに投影された三極空間の非構造化データ

これらの中で最も簡単なのは2です。LATLON空間で補間する代わりに、ポイントをソース空間に「変換」して、そこで補間します。

1と2で機能する別のオプションは、サンプルポイントをカバーするために三極空間からマッピングされるセルを検索することです。 (BSPまたはグリッドタイプの構造を使用して、この検索を高速化できます)セルの1つを選択し、その内部を補間します。

最後に、非構造化補間オプションのヒープがあります..しかし、それらは遅くなる傾向があります。私の個人的なお気に入りは、最も近いNポイントの線形補間を使用することです。これらのNポイントを見つけるには、グリッドまたはBSPを使用します。もう1つの良いオプションは、Delauneyが非構造化ポイントを三角測量し、結果の三角形メッシュを補間することです。

個人的には、メッシュがケース1の場合、投影が重なっているセルの検索を処理する必要があるので、構造化されていない戦略を使用します。 「正しい」セルを選択するのは難しいでしょう。

1

[〜#〜] bivar [〜#〜] というFORTRANライブラリがあり、これはこの問題に非常に適しています。いくつかの変更を加えるだけで、f2pyを使用してpythonで使用できるようになります。

説明から:

BIVARは、秋間宏氏による、散在する二変量データを補間するFORTRAN90ライブラリです。

BIVARは、2Dに散在する(X、Y)データポイントのセットと関連するZデータ値を受け入れ、指定されたデータと一致する滑らかな補間関数Z(X、Y)を構築でき、次の場所で評価できます。平面内の他のポイント。

0
ye-ti-800

GRASS(オープンソースGISパッケージ)補間機能( http://grass.ibiblio.org/gdp/html_grass62/v.surf.bspline.html )をご覧になることをお勧めします。 pythonにはありませんが、再実装するか、Cコードとインターフェースすることができます。

0
Vitor Py

データグリッドが次のようになっていると思いますか(赤は古いデータ、青は新しい補間データです)?

代替テキストhttp://www.geekops.co.uk/photos/0000-00-02%20%28Forum%20images%29/DataSeparation.png

これはやや野蛮なアプローチかもしれませんが、既存のデータをビットマップとしてレンダリングするのはどうですか(openglは適切なオプションを構成して色の単純な補間を行い、データを三角形としてレンダリングできます。これはかなり高速です。 )。次に、新しいポイントの位置でピクセルをサンプリングできます。

または、最初のポイントセットを空間的に並べ替えてから、新しいポイントを囲む最も近い古いポイントを見つけて、それらのポイントまでの距離に基づいて補間することもできます。

0
Jon Cage