11 votos

QGIS Modeler if/else condición, la secuencia de comandos personalizada para Modeler

Quiero hacer un simple if/else función dentro de mi Modelo y quería saber si es posible o no.

enter image description here

Quiero que esta cosa que hacer que si una Entrada para 'Segmento de la Capa está seleccionada que no tiene que ejecutar la "Segmentación(meanshift)" y utiliza a 'Segmento de Capa" en lugar de como una Entrada para el siguiente Proceso.

las Entradas para el 'Segmentación(meanshift)" son como sigue

enter image description here

Actualización después de tratar de implementar José de la respuesta: He utilizado el siguiente código y tengo este error enter image description here

Update 2, después de la sustitución de los parámetros me da un error en la línea 28 esto es, eran " otra cosa:' se encuentra

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

enter image description here

Actualización funciona :) después de un par de probar y con José ayudar a este código ahora funciona como un encanto, el truco final fue la sustitución de dos opcionales valores con 'Ninguno'.

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

9voto

Mue Puntos 2469

Como lo mencioné en mi comentario, una secuencia de comandos personalizada puede ser el camino a seguir en esta situación. Puede crear uno desde:

Processing Toolbox > Scripts > Tools > Create new script

La siguiente secuencia de comandos establece los parámetros de entrada como opcional junto con un if/else instrucción dependiendo del parámetro contiene una capa. Así que si una capa fue seleccionado para BGREN, se llevará a cabo la segmentación de la herramienta y establece la salida; de lo contrario el resultado será seleccionada la capa de Segment_Layer.

Aquí hay una posible secuencia de comandos:

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

Los parámetros de la otb:segmentationmeanshift mirada de miedo! Por desgracia, no tengo Orfeo instalado por lo que no puede probar esta herramienta. Sin embargo, los parámetros se muestra aquí, sólo tiene que escribir en lugar de utilizar la interfaz gráfica de usuario. Una vez hecho esto, agregar la secuencia de comandos en su modelador de uso BGREN y Segment_Layer como capas de entrada:

Script parameters

También, en su modeler, usted puede necesitar cambiar la Necesaria definición de los parámetros de BGREN y Segment_Layer:

Parameter definition

A continuación, conecte la salida de la secuencia de comandos para su NDVI de la herramienta.


He probado esto en cierta medida el uso de otras herramientas que trabajó dependiendo de la capa de entrada fue seleccionado, así que espero que va a trabajar para su modelador!



EDITAR:

Aquí es el código que se utiliza ligeramente modificada (necesita la comas para separar los parámetros, True y False declaraciones no requieren comillas alrededor de ellos, la barra diagonal inversa es sólo para mejorar la legibilidad, pero va a incluir de una sola línea):

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X