QGIS Modeler si / sino condición, script personalizado para Modeler

10

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

ingrese la descripción de la imagen aquí

Quiero que esto haga eso si se selecciona una Entrada para 'Capa de segmento' que no tiene que ejecutar la 'Segmentación (desplazamiento medio)' y usa 'Capa de segmento' como entrada para el siguiente Proceso.

Las entradas para la 'Segmentación (desviación media)' son las siguientes

ingrese la descripción de la imagen aquí

Actualice después de intentar implementar la respuesta de Joseph: utilicé el siguiente código y obtuve este error ingrese la descripción de la imagen aquí

Actualización 2, después de reemplazar los parámetros, aparece un error en la línea 28, este es 'else:' 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

ingrese la descripción de la imagen aquí

Actualizarlo funciona :) después de algunos intentos y con la ayuda de Joseph, este código ahora funciona de maravilla, el truco final fue reemplazar dos valores opcionales 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
Andreas
fuente
3
Creo que necesitará usar un script personalizado dentro de su modelador para usar las declaraciones if / else correctamente.
Joseph
1
@Joseph, eso es lo que yo también pensé, el problema es que no soy tan bueno en scripting como me gustaría ser, no tengo experiencia en absoluto ...
Andreas
1
@Andreas confirmo lo que Joseph escribió en su comentario. Sin embargo, creo que puede obtener más ayuda de la comunidad si edita su pregunta y le da la posibilidad de obtener algunos consejos con Python (agregando también una etiqueta adecuada) ...
mgri
1
@Andreas: edité mi publicación. Además, debe aceptar las respuestas después de que hayan resuelto su problema;)
Joseph
1
@Joseph Edité mi publicación con el código que ahora funciona, su ayuda fue muy necesaria y estoy muy contento de que haya tomado parte de su valioso tiempo para ayudarme con esto :) a partir de ahora está ejecutando el algoritmo y tengo que esperar por los resultados, pero parece realmente prometedor, gracias de nuevo :)
Andreas

Respuestas:

8

Como se menciona en mi comentario, un guión personalizado puede ser el camino a seguir en esta situación. Puedes crear uno desde:

Processing Toolbox > Scripts > Tools > Create new script

El siguiente script establece los parámetros de entrada como opcionales junto con una instrucción if / else dependiendo de qué parámetro contiene una capa. Entonces, si se seleccionó una capa BGREN, realizará la herramienta de segmentación y establecerá la salida; de lo contrario, la salida será la capa seleccionada Segment_Layer.

Aquí hay un posible 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

Los parámetros para el otb:segmentationmeanshiftaspecto aterrador! Desafortunadamente, no tengo instalado Orfeo, así que no puedo probar esta herramienta. Sin embargo, los parámetros se muestran aquí , solo necesita escribirlos en lugar de usar la GUI. Una vez hecho esto, agregue el script a su modelador usando BGRENy Segment_Layercomo capas de entrada:

Parámetros de script

Además, en su modelador, es posible que deba cambiar la definición del parámetro Requerido de BGRENy Segment_Layer:

Definición de parámetros

Luego conecte la salida del script a su herramienta NDVI.


Probé esto hasta cierto punto usando otras herramientas que funcionaron dependiendo de la capa de entrada seleccionada, ¡así que espero que funcione para su modelador!



EDITAR:

Aquí está el código que usó ligeramente modificado (necesita las comas para separar los parámetros, Truey las Falsedeclaraciones no requieren comillas a su alrededor, la barra invertida es solo para facilitar la lectura, pero la incluirá como una 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 una frase:

##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
fuente
1
Estaba agregando un comentario para alentar a @Andreas a editar su pregunta y dar la posibilidad de obtener algunos consejos con Python para recibir más ayuda, ¡pero fuiste más rápido!
mgri
1
@mgri: le animo a publicar ese comentario, ya que el OP podría querer editar algunos detalles y espero alentar a otros a publicar una posible solución :)
Joseph
1
@Joseph maldita sea, eso es mucho más de lo que pensé que sería: O, de todos modos, intentaré recrear esto y dejar un comentario si lo hago funcionar, gracias de antemano :)
Andreas
1
Muy bienvenido! Probablemente pensé demasiado en esto, por lo que puede ser una buena idea editar su pregunta como sugirió @mgri para que se pueda publicar una solución de Python más adecuada o similar =)
Joseph
1
@Andreas - No es estúpido en absoluto, todos tienen que aprender desde el principio =)
Joseph