GDALを使用してPythonでラスターを平滑化/補間しますか?


20

Pythonで開発し、OSGEOのGDALを使用して、ラスターとシェープファイルを操作および操作しています。

ポイントフィーチャを含むシェープファイルを取得して、サーフェスラスタに補間したいです。現在、私は「RasterizeLayer」メソッドを使用しています。このメソッドは、ポイントフィーチャからラスター(すべてのnodata値で設定されている)に値を焼き付けますが、すべてのタッチされていないピクセルを「nodata」値として残します。したがって、チェッカーボードタイプのラスターが残っています。

RasterizeLayerを使用した後の内容:

[gdal.rasterizelayerを使用したラスター]

最終製品に必要なもの:

ここに画像の説明を入力してください

私が探している関数は、arcgisscripting importの 'Spline_sa()'として知られていると思います。

GDALには同様の機能がありますか、または希望する出力を得るための別の方法がありますか?

回答:


18

NumPyとScipyを見てみましょう-scipy.interpolate.griddata関数を使用してSciPyクックブックにポイントデータを補間する良い例があります。明らかにこれには、numpy配列のデータが必要です。

  • GDAL pythonバインディングを使用gdal.Dataset.ReadAsArray()すると、ラスタに使用してデータをPythonに読み込むことができます。
  • OGRを使用すると、フィーチャレイヤーをループし、シェープファイルからポイントデータを抽出します(あるいは、GEOMETRY=AS_XYZ[ OGR CSVファイル形式を参照]を使用してシェープファイルをCSVに書き込み、csvをPythonに読み込みます)。

グリッド出力を取得したら、GDALを使用して、結果のnumpy配列をラスターに書き込むことができます。

最後に、Scipy補間ライブラリがうまくいかない場合は、scipy.ndimageをいつでも試すことができます。


助けてくれてありがとう!私はScipy.interpolate.griddataアプローチに旋回を与えています。結果を投稿します。
ダグ

1
この投稿に戻るのに非常に時間がかかったことをおpoびします。上記の答えは、基本的に問題を解決するために私がしたことです。Scipy補間ライブラリを使用して、これらのnodataスペースを埋めてから、ラスタバンドに書き戻しました。助けてくれてありがとう!
ダグ

@Doug心配無用-癒してよかった!
om_henners

1
このソリューションはどのくらいの速さですか?100x100のみが既知の値である10k x 10kグリッドに使用できますか?私はgdal_fillnodataを試しましたが、これは補間に比べて非常に高速ですが、あまりにもまばらな点ではうまく機能しません。現時点では、佐賀の三角測量を使用していますが、中規模の配列では非常に遅く、大きな配列では失敗します。
ミロ14

12

見ていGDALグリッド化APIを。Pythonバインディングで公開されているかどうかはわかりませんが、公開されていない場合は、サブプロセスモジュールを介してgdal_gridユーティリティを呼び出します。

GDALグリッドAPIは、逆距離重み付け、移動平均、および最近傍のみを使用し、スプラインを実装しません。別のオプションはScipyを使用することです。


1

このスレッドは少し古いですが、skspatialと呼ばれるsklearnのKNNアルゴリズムを使用する単純なモジュールを作成しました。

https://github.com/rosskush/skspatial

ジオパンダを使用してシェープファイルをインポートし、列を選択すると、ラスタにエクスポートできるサーフェスが補間されます。これは非常に基本的なものであり、おそらく最善の方法ではありませんが、少なくともすべてを純粋なpythonのままにします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.