Condition QGIS Modeler if / else, script personnalisé pour Modeler

10

Je veux faire une simple fonction if / else à l'intérieur de mon modèle et je voulais savoir si c'est possible ou non.

entrez la description de l'image ici

Je veux que cette chose fasse que si une entrée pour 'Segment Layer' est sélectionnée, elle n'a pas à exécuter la 'Segmentation (meanshift)' et utilise à la place 'Segment Layer' comme entrée pour le prochain processus.

les entrées pour la «segmentation (shift moyen)» sont les suivantes

entrez la description de l'image ici

Mettre à jour après avoir essayé d'implémenter la réponse de Joseph: j'ai utilisé le code suivant et j'ai eu cette erreur entrez la description de l'image ici

Mise à jour 2, après avoir remplacé les paramètres, j'obtiens une erreur à la ligne 28, c'est `` 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

entrez la description de l'image ici

Mettre à jour ça marche :) après quelques essais et avec l'aide de Joseph, ce code fonctionne maintenant comme un charme, l'astuce finale était de remplacer deux valeurs facultatives par '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
Andreas
la source
3
Je pense que vous devrez utiliser un script personnalisé dans votre modeleur afin d'utiliser correctement les instructions if / else .
Joseph
1
@Joseph c'est ce que je pensais aussi, le problème est que je ne suis pas aussi bon en script que je le souhaiterais, je n'ai pratiquement aucune expirience du tout ...
Andreas
1
@Andreas Je confirme ce que Joseph a écrit dans son commentaire. Cependant, je pense que vous pouvez obtenir plus d'aide de la communauté si vous modifiez votre question et donnez la possibilité d'obtenir des indices avec Python (en ajoutant également une balise appropriée) ...
mgri
1
@Andreas - Modification de mon message. En outre, vous devez accepter les réponses après avoir résolu votre problème;)
Joseph
1
@Joseph J'ai édité mon message avec le code qui fonctionne maintenant, votre aide était vraiment nécessaire et je suis vraiment heureux que vous ayez pris un peu de votre temps précieux pour m'aider avec cela :) en ce moment, il exécute l'algorithme et je dois attendre pour les résultats mais ça a l'air vraiment prometteur, merci encore :)
Andreas

Réponses:

8

Comme mentionné dans mon commentaire, un script personnalisé peut être la voie à suivre dans cette situation. Vous pouvez en créer un à partir de:

Processing Toolbox > Scripts > Tools > Create new script

Le script suivant définit les paramètres d'entrée comme facultatifs avec une instruction if / else selon le paramètre qui contient une couche. Donc, si un calque a été sélectionné BGREN, il exécutera l' outil de segmentation et définira la sortie; sinon, la sortie sera le calque sélectionné Segment_Layer.

Voici un script possible:

##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

Les paramètres pour le otb:segmentationmeanshiftlook effrayant! Malheureusement, je n'ai pas installé Orfeo et je ne peux donc pas tester cet outil. Cependant, les paramètres sont affichés ici , il vous suffit de les saisir au lieu d'utiliser l'interface graphique. Une fois cela fait, ajoutez le script dans votre modeleur en utilisant BGRENet Segment_Layercomme couches d'entrée:

Paramètres de script

De plus, dans votre modeleur, vous devrez peut-être modifier la définition de paramètre requise de BGRENet Segment_Layer:

Définition des paramètres

Connectez ensuite la sortie du script à votre outil NDVI.


J'ai testé cela dans une certaine mesure en utilisant d'autres outils qui fonctionnaient en fonction de la couche d'entrée sélectionnée, alors j'espère que cela fonctionnera pour votre modeleur!



ÉDITER:

Voici le code que vous avez utilisé légèrement modifié (vous avez besoin des virgules pour séparer les paramètres, Trueet les Falseinstructions ne nécessitent pas de guillemets autour d'eux, la barre oblique inverse est juste pour la lisibilité mais l'inclura comme une ligne):

##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

Ou en monoplace:

##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
la source
1
J'ajoutais un commentaire pour encourager @Andreas à modifier sa question et donner la possibilité d'obtenir quelques conseils avec Python pour recevoir plus d'aide, mais vous étiez plus rapide!
mgri
1
@mgri - Je vous encourage à publier ce commentaire car le PO pourrait vouloir éditer certains détails et j'espère que d'autres à poster une solution possible :)
Joseph
1
@Joseph putain, c'est beaucoup plus que ce que je pensais: O de toute façon, j'essaierai de recréer cela et de laisser un commentaire si je le fais fonctionner, merci d'avance :)
Andreas
1
Bienvenue! J'ai probablement trop réfléchi à cela, donc ce peut être une bonne idée de modifier votre question comme l'a suggéré @mgri pour qu'une solution python plus appropriée soit publiée =)
Joseph
1
@Andreas - Pas stupide du tout, tout le monde doit apprendre depuis le début =)
Joseph