QGIS Graphical Modelerで反復タスクを簡素化する


13

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

上記のモデルを単純化するためにQGISグラフィカルモデラーで使用できるイテレーターはありますか?そうでない場合、モデルを単純化するより良い方法はありますか?

最初の列は入力レイヤーを表し、2列目は交差点、3列目は「交差点」操作の出力、4列目は「位置による属性の結合」操作、5列目は結合操作の結果です。

流域解析のために、「交差点」および「位置による属性の結合」操作を実行したいと思います。目的は、異なる次数のストリームの合計と平均の長さ、ストリーム比、分岐比などの線形形態パラメータを計算することです。

最初のステップは、「order1ストリーム」と分水界を交差させ、次に「Order2ストリーム」と同じ分水界を交差させることです。「order3ストリーム」シェープファイルが提供されている場合、この新しいレイヤーの交差を実行する必要があります。したがって、「order1ストリーム」と「order2ストリーム」のみが必須であり、残りは提供された流域層に依存します。たとえば、分水界が次数4の分水界である場合、必要なストリームは「order4ストリーム」までです。

使用可能なすべての入力レイヤーの交差が完了すると、交差したストリームの合計と平均を取得するオプションを使用して、場所ごとに流域に結合されます。

画像は正しい手順を示しています。モデラーの外部で操作を行うと、結果は正しいです。モデルを実行すると、このエラーが発生します。

「アルゴリズムOrder5_plus_wshed 'NoneType'オブジェクトの実行エラーに属性 'dataProvider'がありません。」

これは、オプションパラメータの1つに入力を提供していない場合(つまり、「order4ストリーム」などの入力)に発生します。ただし、すべての入力を提供すると、必要な結果が得られます。

したがって、このタスクを設定するより良い方法があるかどうかを尋ねたいと思います。

回答:


12

タスクを設定する方法は、モデラーよりも高い柔軟性を提供するカスタムスクリプトを作成することですが、それでもユーザーに同様のインターフェイスを提供できます。次から作成できます。

処理ツールボックス>スクリプト>ツール>新しいスクリプトの作成

次に、以下のスクリプトをコピーして貼り付け、に保存しC:/Users/You/.qgis2/processing/scriptsます。

以下のスクリプトは、モデルの動作をエミュレートしようとします。スクリプトは最終的なソリューションではありません(特に、ロケーションツールによる交差点結合属性に使用したパラメーターは、定義したものと異なる場合があるため) 。実行するには、保存後にProcessing Toolboxから選択するだけです。

スクリプトは、あなたが尋ねたことを行うと思います:

  • 最初の2つの注文は必須なので、処理されます。

  • IF ステートメントは、正しい注文が先行する場合にのみ後続の注文が処理されるようにするために使用されます(たとえば、order4はorder3が選択されている場合にのみ実行されます)。

  • また、処理中の注文を示すメッセージがPythonコンソールに出力されます。


##Example model=name
##Order1=vector
##Order2=vector
##Order3=optional vector
##Order4=optional vector
##Order5=optional vector
##Watershed=vector
##Order2_Wshed=output vector
##Order3_Wshed=output vector
##Order4_Wshed=output vector
##Order5_Wshed=output vector

order1 = processing.getObject(Order1)
order2 = processing.getObject(Order2)
order3 = processing.getObject(Order3)
order4 = processing.getObject(Order4)
order5 = processing.getObject(Order5)
watershed = processing.getObject(Watershed)

if Order3 is None:
    print 'Processing Order1 and Order2'
else:
    print 'Processing Order1, Order2 and Order3'
    if Order4 is not None:
        print 'Processing Order1, Order2, Order3 and Order4'
        if Order5 is not None:
            print 'Processing Order1, Order2, Order3, Order4 and Order5'

output_1a = processing.runalg("qgis:intersection", order1, watershed, None)
output_1b = processing.runalg("qgis:joinattributesbylocation", output_1a['OUTPUT'], watershed, u'intersects', 0, 0, '', 0, None)
output_2a = processing.runalg("qgis:intersection", order2, watershed, None)
output_2b = processing.runalg("qgis:joinattributesbylocation", output_2a['OUTPUT'], output_1b['OUTPUT'], u'intersects', 0, 0, '', 0, Order2_Wshed)

if Order3 is None:
    pass
else:
    output_3a = processing.runalg("qgis:intersection", order3, watershed, None)
    output_3b = processing.runalg("qgis:joinattributesbylocation", output_3a['OUTPUT'], output_2b['OUTPUT'], u'intersects', 0, 0, '', 0, Order3_Wshed)
    if Order4 is None:
        pass
    else:
        output_4a = processing.runalg("qgis:intersection", order4, watershed, None)
        output_4b = processing.runalg("qgis:joinattributesbylocation", output_4a['OUTPUT'], output_3b['OUTPUT'], u'intersects', 0, 0, '', 0, Order4_Wshed)
        if Order5 is None:
            pass
        else:
            output_5a = processing.runalg("qgis:intersection", order5, watershed, None)
            output_5b = processing.runalg("qgis:joinattributesbylocation", output_5a['OUTPUT'], output_4b['OUTPUT'], u'intersects', 0, 1, 'sum, mean', 0, Order5_Wshed)

以下は、スクリプトを実行するときのインターフェースのスクリーンショットです(モデルを実行するときと似ているはずです):

実行中のスクリプト

注意すべき点はほとんどありません。

  • 赤いボックスには必須パラメーターが含まれています

  • 緑のボックスにはオプションのパラメーターが含まれています

  • 青いボックスには必須パラメーターが含まれています

  • ブラックボックスには、結果を出力するためのオプションのパラメーターが含まれています。スクリプトは、関連する注文が選択されている場合にのみレイヤーを出力します(たとえば、order5の入力が選択されていないが、その出力が選択されている場合、エラーが発生します)。したがって、ユーザーは入力と関連する出力を選択する必要があります。これは意図的なものではありませんでしたが、個人的には、ユーザーにパラメーターを慎重にチェックさせるようにする良い方法だと思います。


QGIS 2.12.3(Processingプラグインバージョン2.12.2 を使用)を使用しました。


2
最近のQGISポッドキャストでは、処理の作成者がいて、その作成方法のために、モデルビルダーに直接イテレーターを直接追加できないと彼は言いました。追加するには大規模な書き直しが必要です。そのため、現時点では、カスタムスクリプトを使用するのが間違いありません。
-HeikkiVesanto

@Vesanto-それは非常に興味深い、それを含めてくれてありがとう。この特定のポッドキャストへのリンクはありますか?
ジョセフ


1
@DennisTG-おologiesび申し上げます。QGIS2.12.3(Processing plugin version 2.12.2 を使用)を使用したことを投稿でお伝えしたはずです。
ジョセフ

1
@ジョセフ、それは私のために働く。非常に洞察に満ちた、私は助けに感謝します。
DennisTG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.