QGISのPythonコンソールから補間プラグインを呼び出す


13

PythonコンソールからQGIS補間プラグイン関数(TINメソッド)(ラスター->補間)を呼び出したいです。

QGIS API内または処理アルゴリズムリスト内に対応する関数が見つかりません。SAGA三角形分割アルゴリズムを見つけました。これは正常に機能しますが、5〜10倍遅く、私の場合は速度が重要です。

それを実行する方法はありますか?


2
これは必要ありませんが、知っておくと便利です。私はこのリンクをたどりました:(gis.stackexchange.com/questions/11216/…)。私は限りましたfrom rasterinterpolation import rasterinterpolation(でも呼び出す方法または)を呼び出すためにどのモジュールわからなく。
ジョセフ14年

要件をもう少し明確にできますか?入力ラスタレイヤから新しい補間ラスタレイヤを計算する方法を単に探していますか?
暗闇

同様の問題があります:Raster \ interpolationで始まり、グリッドからSaga \ contoursが続くcountourモデルを作成したいです。質問は-「処理モデラー」ウィンドウにラスタインリポータを追加する方法ですか?
H.Wiener

回答:


4

次の質問で完全なソリューションを提供できました。

QGISのPythonコンソールから補間ラスターを計算する方法は?

興味を引くように思われるため、ここでも答えを再投稿します。

回答:

pyqgis上のドキュメントは非常に自明ではないですが、私は(適切に関連する補間クラスを呼び出す方法を考え出しQgsInterpolatorQgsTINInterpolatorQgsIDWInterpolatorQgsGridFileWriterのpythonから)。スクリプトのすべてのステップを非常に詳細に説明します。

ステップ1:

コアと解析モジュールをインポートし、レイヤータブでマウスクリックして選択することにより、補間に必要なベクターレイヤーを取得します。

import qgis.core
import qgis.analysis

layer = qgis.utils.iface.activeLayer()

ステップ2:

必要なパラメーターを使用して補間クラスを準備します。LayerData構造体の初期化のための正確なパラメーターは、QGIS APIドキュメント(searchterm:QgsInterpolator)にあります。

layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1

z座標を使用せず、補間属性として最初の使用可能なフィールド(インデックス= 0)を取得し、入力タイプとしてPOINTSを使用していることに注意してください。

ステップ3:

補間エンジンを選択します。ここでは、TIN補間法(QgsTINInterpolator)とIDW 補間法()を選択できますQgsIDWInterpolator。私はQgsTINInterpolator自分のコードを取り入れました。

tin_interpolator = QgsTINInterpolator([layer_data])

のPythonリストをlayer_data補間エンジンに渡す必要があることに注意してください!これにより、複数のlayer_dataシナリオを追加することもできます。

ステップ4:

補間出力のエクスポートに必要なパラメーターをセットアップします(のドキュメントを参照QgsGridFileWriter)。これらには、補間GUIと同様の情報(ファイルパス、範囲、解像度、列と行の数)が含まれます。

export_path ="C:/SomeFolder/output.asc"
rect = layer.extent()
res = 10
ncol = int( ( rect.xMaximum() - rect.xMinimum() ) / res )
nrows = int( (rect.yMaximum() - rect.yMinimum() ) / res)

output = QgsGridFileWriter(tin_interpolator,export_path,rect,ncol, nrows,res,res)
output.writeFile(True)  

iface.addRasterLayer(export_path, "interpolation_output") 

QgsGridFileWriterASCIIグリッド(.asc)のみを書き込むため、出力ラスターのファイル拡張子に注意してください。writeFile()メソッドを呼び出すことにより、データがディスクに書き込まれます。エクスポート後、グリッドファイルをラスタとしてキャンバスに追加できます。

参照用の完全なスクリプト:

import qgis.analysis
import qgis.core

layer = qgis.utils.iface.activeLayer() 
layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1


tin_interpolator = QgsTINInterpolator([layer_data])

export_path = "E:/GIS_Workbench/script_output/test.asc"

rect = layer.extent()
res = 10
ncol = int( ( rect.xMaximum() - rect.xMinimum() ) / res )
nrows = int( (rect.yMaximum() - rect.yMinimum() ) / res)
output = QgsGridFileWriter(tin_interpolator,export_path,rect,ncol,nrows,res,res)
output.writeFile(True)

QGIS-APIは現在、バージョン3.0に書き換えられ、使用される補間-クラスがから移動していることに留意してくださいqgis.analysisqgis.core!これは、このスクリプトの機能に大きな影響を与えるため、バージョン3.0用に書き直す必要があります!


1
サンプルコードを試してみましたが、layer_data.InterpolationAttribute = 0でしか機能せず、別のフィールドインデックスで試してみましたが、0しか取得できませんでした。-
レナード

そうです-私もこの問題に遭遇しましたが、原因を調査するのに十分な時間がありませんでした。私の解決策は、必要なフィールドが1つだけのレイヤーをスクリプトに供給することでした。改善されたソリューションについては、QGIS APIドキュメントを試してみてください。
root676

3

プラグインマネージャーを使用してRaster Interpolationプラグインをインストールしている場合、これを行うことができます。

from rasterinterpolation.core.rasterinterpolator import RasterInterpolator
rastLayer = iface.activeLayer()
interpolator = RasterInterpolator(rastLayer,0,1)
a= interpolator.linear(QgsPoint(10.662629, 76.225421))
print a

注:値を出力したという事実以外に、上記のコードが何をするのか本当にわかりません。しかし、それはおそらく使用法を理解するのに役立つでしょう。

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