QGIS Modeler if / else条件、Modelerのカスタムスクリプト


10

モデル内に単純なif / else関数を作成し、それが可能かどうかを知りたいのですが。

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

これを行うには、「セグメントレイヤー」の入力が選択されている場合、「セグメント化(平均シフト)」を実行する必要がなく、次のプロセスの入力として「セグメントレイヤー」を使用します。

'Segmentation(meanshift)'の入力は次のとおりです。

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

ジョセフの答えを実装しようとした後の更新:次のコードを使用してこのエラーが発生しました ここに画像の説明を入力してください

更新2、パラメーターを置き換えた後、28行目でエラーが発生しましたこれは「else:」でした

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    -BGREN\
    -0\
    -70\
    -70\
    -0.1\
    -100\
    -100\
    -0\
    -0\
    -0\
    -'True'\
    -'False'\
    -1\
    -0.1\
    -'Layer'\
    -'DN'\
    -1024\
    -1\
    -0\
    -output)
else:
    output=Segment_Layer

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

更新して動作します:)数回試行して、Josephの助けを借りてこのコードが魅力的に機能するようになりました。最後のトリックは、2つのオプション値を「None」に置き換えることでした。

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    BGREN, \
    0, \
    70, \
    70, \
    0.1, \
    100, \
    100, \
    0, \
    0, \
    None, \
    True, \
    False, \
    1, \
    0.1, \
    'Layer', \
    'DN', \
    1024, \
    1, \
    None, \
    output)
else:
    output=Segment_Layer

3
if / elseステートメントを正しく使用するには、モデラー内でカスタムスクリプトを使用する必要があると思います。
ジョセフ

1
@Joseph私もそう思いました。問題は、私がスクリプトを作成するのが私が望んでいるほど上手ではないことです。私はほとんど経験がないのです...
Andreas

1
@Andreas私はジョセフがコメントで書いたことを確認します。ただし、質問を編集して、Pythonでヒントを入手できるようにすると(適切なタグも追加して)、コミュニティからさらに助けが得られると思います...
mgri

1
@Andreas-私の投稿を編集しました。また、問題が解決したで回答を受け入れる必要があります;)
ジョセフ

1
@ジョセフ私は現在機能しているコードで私の投稿を編集しました、あなたの助けは大いに必要でした、そしてあなたがこれを私に助けるためにあなたの貴重な時間の一部をとって本当に良かったです:)現在、それはアルゴリズムを実行していて、私は待つ必要があります結果については、それは本当に有望に見えます、再びありがとう:)
アンドレアス

回答:


8

私のコメントで述べたように、カスタムスクリプトはこのような状況に進むための方法かもしれません。以下から作成できます。

Processing Toolbox > Scripts > Tools > Create new script

次のスクリプトは、レイヤーを含むパラメーターに応じて、if / elseステートメントとともに入力パラメーターをオプションとして設定します。したがって、レイヤーがで選択された場合、セグメンテーションツールが実行され、出力が設定されます。それ以外の場合、出力はから選択されたレイヤーになります。BGRENSegment_Layer

可能なスクリプトは次のとおりです。

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    -BGREN, \
    -filter, \
    -filter.meanshift.spatialr, \
    -filter.meanshift.ranger, \
    -filter.meanshift.thres, \
    -filter.meanshift.maxiter, \
    -filter.meanshift.minsize, \
    -mode, \
    -mode.vector.outmode, \
    -mode.vector.inmask, \
    -mode.vector.neighbor, \
    -mode.vector.stitch, \
    -mode.vector.minsize, \
    -mode.vector.simplify, \
    -mode.vector.layername, \
    -mode.vector.fieldname, \
    -mode.vector.tilesize, \
    -mode.vector.startlabel, \
    -mode.vector.ogroptions, \
    -output)
else:
    output=Segment_Layer

otb:segmentationmeanshift怖い表情のパラメーター!残念ながら、Orfeoをインストールしていないため、このツールをテストできません。ただし、ここではパラメーターを示しています。GUIを使用する代わりに、パラメーターを入力するだけです。完了したら、入力レイヤーとしてBGREN、およびSegment_Layer入力レイヤーとしてスクリプトをモデラーに追加します。

スクリプトパラメータ

また、モデラーで、およびの必須パラメーター定義を変更する必要がある場合があります。BGRENSegment_Layer

パラメータ定義

次に、スクリプトの出力をNDVIツールに接続します。


選択した入力レイヤーに応じて機能する他のツールを使用してこれをある程度テストしたので、モデラーで機能することを願っています!



編集:

ここでは、わずかに変更され使用されるコードは、(あなたがパラメータを区切るにはカンマが必要であり、TrueそしてFalse文はそれらの前後に引用符を必要としない、バックスラッシュは単に読みやすくするためですが、ワンライナーとして、それが含まれます):

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    BGREN, \
    0, \
    70, \
    70, \
    0.1, \
    100, \
    100, \
    0, \
    0, \
    0, \
    True, \
    False, \
    1, \
    0.1, \
    'Layer', \
    'DN', \
    1024, \
    1, \
    0, \
    output)
else:
    output=Segment_Layer

またはワンライナーとして:

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift',BGREN,0,70,70,0.1,100,100,0,0,0,True,False,1,0.1,'Layer','DN',1024,1,0,output)
else:
    output=Segment_Layer

1
@Andreasに質問の編集を促し、より多くのヘルプを受けるためのヒントをPythonで取得する可能性を与えるためにコメントを追加していましたが、あなたはより速くなりました!
mgri

1
@mgri-OPが詳細を編集し、他の人が可能な解決策を投稿することを望んでいる可能性があるため、そのコメントを投稿することをお勧めします:)
Joseph

1
@Josephいまいましいそれは私が思っていたよりもはるかに多いです:Oとにかく私はこれを再作成して、うまくいけばフィードバックを残します、事前に感謝します:)
Andreas

1
大歓迎です!私はおそらくこれを考えすぎたので、@ mgriが提案したように質問を編集して、より適切なpythonソリューションなどを投稿できるようにするのは良い考えかもしれません=)
Joseph

1
@Andreas-まったく愚かではない、誰もが最初から学ばなければならない=)
ジョセフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.