QGIS Modeler if / else condition, script personalizzato per Modeler


10

Voglio fare una semplice funzione if / else all'interno del mio modello e volevo sapere se è possibile o meno.

inserisci qui la descrizione dell'immagine

Voglio che ciò avvenga se viene selezionato un input per "Segment Layer", che non deve eseguire la "Segmentazione (spostamento medio)" e utilizza invece "Segment Layer" come input per il processo successivo.

gli input per il 'Segmentazione (meanshift)' sono i seguenti

inserisci qui la descrizione dell'immagine

Aggiorna dopo aver tentato di implementare la risposta di Joseph: ho usato il seguente codice e ho ricevuto questo errore inserisci qui la descrizione dell'immagine

Aggiornamento 2, dopo aver sostituito i parametri ottengo un errore nella riga 28 questo è stato 'else:' sta

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

inserisci qui la descrizione dell'immagine

Aggiorna funziona :) dopo alcuni tentativi e con Joseph aiuta questo codice ora funziona come un incantesimo, l'ultimo trucco è stato quello di sostituire due valori opzionali con "Nessuno".

##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
Penso che dovrai usare uno script personalizzato all'interno del tuo modellatore per usare correttamente le istruzioni if / else .
Joseph,

1
@Joseph è quello che pensavo anch'io, il problema è che non sono bravo nello scripting come vorrei essere, praticamente non ho alcuna esperienza ...
Andreas

1
@Andreas Confermo ciò che Joseph ha scritto nel suo commento. Tuttavia, penso che potresti ricevere maggiore aiuto dalla community se modifichi la tua domanda e dai la possibilità di ottenere alcuni suggerimenti con Python (aggiungendo anche un tag appropriato) ...
mgri

1
@Andreas - Ho modificato il mio post. Inoltre, dovresti accettare le risposte dopo aver risolto il tuo problema;)
Joseph

1
@Joseph Ho modificato il mio post con il codice ora funzionante, il tuo aiuto è stato molto necessario e sono davvero felice che tu abbia impiegato un po 'del tuo tempo prezioso per aiutarmi con questo :) fin da ora sta eseguendo l'algoritmo e devo aspettare per i risultati, ma sembra davvero promettente, grazie ancora :)
Andreas,

Risposte:


8

Come menzionato nel mio commento, uno script personalizzato potrebbe essere la strada da percorrere in questa situazione. Puoi crearne uno da:

Processing Toolbox > Scripts > Tools > Create new script

Lo script seguente imposta i parametri di input come facoltativi insieme a un'istruzione if / else in base al parametro che contiene un layer. Quindi, se è stato selezionato un layer BGREN, eseguirà lo strumento di segmentazione e imposta l'output; altrimenti l'output sarà il layer selezionato da Segment_Layer.

Ecco un possibile script:

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

I parametri per l' otb:segmentationmeanshiftaspetto spaventoso! Sfortunatamente, Orfeo non è installato, quindi non posso testare questo strumento. Tuttavia, i parametri sono mostrati qui , devi solo digitarli invece di usare la GUI. Una volta fatto, aggiungi lo script nel tuo modellatore usando BGRENe Segment_Layercome livelli di input:

Parametri dello script

Inoltre, nel modellatore, potrebbe essere necessario modificare la definizione del parametro obbligatorio di BGRENe Segment_Layer:

Definizione dei parametri

Quindi collegare l'output dello script allo strumento NDVI.


Ho provato questo in una certa misura utilizzando altri strumenti che hanno funzionato a seconda del livello di input selezionato, quindi spero che funzionerà per il tuo modellatore!



MODIFICARE:

Ecco il codice che hai usato leggermente modificato (hai bisogno delle virgole per separare i parametri Truee le Falseistruzioni non richiedono virgolette attorno a loro, la barra rovesciata è solo per leggibilità ma la includerà come una riga):

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

O come one-liner:

##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
Stavo aggiungendo un commento per incoraggiare @Andreas a modificare la sua domanda e dare la possibilità di ottenere alcuni suggerimenti con Python per ricevere più aiuto, ma tu eri più veloce!
mgri,

1
@mgri - Ti incoraggio a pubblicare quel commento poiché l'OP potrebbe voler modificare alcuni dettagli e spero incoraggiare gli altri a pubblicare una possibile soluzione :)
Joseph

1
@Joseph accidenti è molto più di quanto pensassi: O comunque proverò a ricrearlo e a lasciare un feedback se riuscissi a farlo funzionare, grazie in anticipo :)
Andreas

1
Molto gradito! Probabilmente ho pensato troppo a questo, quindi potrebbe essere una buona idea modificare la tua domanda come suggerito da @mgri in modo da poter pubblicare una soluzione di pitone più adatta o simile =)
Joseph

1
@Andreas - Per niente stupido, tutti devono imparare dall'inizio =)
Joseph
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.