Condição if / else do QGIS Modeler, script personalizado para o Modeler

10

Quero criar uma função if / else simples dentro do meu Model e queria saber se é possível ou não.

insira a descrição da imagem aqui

Eu quero que isso seja feito se uma entrada para 'Camada de segmento' for selecionada e não precisar executar a 'Segmentação (deslocamento médio)' e usar 'Camada de segmento' como uma entrada para o próximo processo.

as entradas para a 'segmentação (deslocamento médio)' são as seguintes

insira a descrição da imagem aqui

Atualize depois de tentar implementar a resposta de Joseph: usei o seguinte código e recebi este erro insira a descrição da imagem aqui

Atualização 2, depois de substituir os parâmetros, recebo um erro na linha 28, onde estavam '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

insira a descrição da imagem aqui

Atualize-o funciona :) depois de algumas tentativas e, com a ajuda de Joseph, esse código agora funciona como um encanto, o truque final foi substituir dois valores opcionais por 'Nenhum'.

##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
fonte
3
Eu acho que você precisará usar um script personalizado dentro do seu modelador para usar as instruções if / else corretamente.
Joseph
1
@Joseph isso é o que eu pensei também, o problema é que eu não sou tão bom em scripting como eu gostaria de ser, eu praticamente não têm experiencia em tudo ...
Andreas
1
@ Andreas Confirmo o que Joseph escreveu em seu comentário. No entanto, eu acho que você pode obter mais ajuda da comunidade se você editar a sua pergunta e dar a possibilidade de obter algumas dicas com o Python (acrescentando também uma etiqueta adequada) ...
MGRI
1
@Andreas - Editado meu post. Além disso, você deve aceitar as respostas depois que elas resolverem o seu problema;) #
Joseph
1
@ Joseph Eu editei meu post com o código que está funcionando agora, sua ajuda era muito necessária e estou muito feliz por você ter gasto um pouco do seu precioso tempo para me ajudar com isso :) a partir de agora ele está executando o algoritmo e tenho que esperar pelos resultados, mas parece realmente promissor, obrigado novamente :)
Andreas

Respostas:

8

Como mencionado no meu comentário, um script personalizado pode ser o caminho a seguir nessa situação. Você pode criar um de:

Processing Toolbox > Scripts > Tools > Create new script

O script a seguir define os parâmetros de entrada como opcionais, juntamente com uma instrução if / else , dependendo de qual parâmetro contém uma camada. Portanto, se uma camada foi selecionada BGREN, ela executará a ferramenta de segmentação e definirá a saída; caso contrário, a saída será a camada selecionada Segment_Layer.

Aqui está um script possível:

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

Os parâmetros para o otb:segmentationmeanshiftolhar assustador! Infelizmente, não tenho o Orfeo instalado, portanto não posso testar esta ferramenta. No entanto, os parâmetros são mostrados aqui , você só precisa digitá-los em vez de usar a GUI. Depois de concluído, adicione o script ao seu modelador usando BGRENe Segment_Layercomo camadas de entrada:

Parâmetros de script

Além disso, em seu modelador, pode ser necessário alterar a definição de parâmetro Requerido de BGRENe Segment_Layer:

Definição de parâmetros

Em seguida, conecte a saída do script à sua ferramenta NDVI.


Eu testei isso até certo ponto usando outras ferramentas que funcionavam dependendo da camada de entrada selecionada, espero que funcione para o seu modelador!



EDITAR:

Aqui está o código que você usou ligeiramente modificado (você precisa das vírgulas para separar os parâmetros, Truee as Falseinstruções não requerem aspas ao redor deles, a barra invertida é apenas para facilitar a leitura, mas a incluirá como uma linha):

##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 como uma linha:

##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
fonte
1
Eu estava adicionando um comentário para incentivar o @Andreas a editar sua pergunta e dar a possibilidade de obter dicas com o Python para receber mais ajuda, mas você foi mais rápido!
22417 mgri
1
@mgri - Eu incentivá-lo para postar esse comentário como o OP pode querer editar alguns detalhes em e incentivar espero que outras pessoas para postar uma possível solução :)
Joseph
1
@Joseph maldita que é muito mais do que eu pensei que seria: O mesmo assim vou tentar recriar isso e deixar um feedback se eu tenho que trabalhar, obrigado antecipadamente :)
Andreas
1
Muito bem-vindos! Eu provavelmente fiz overthink este por isso pode ser uma boa idéia para editar a sua pergunta como @mgri sugeriu para que uma solução mais adequada python ou como podem ser postadas =)
Joseph
1
@Andreas - Não é estúpido em tudo, todo mundo tem que aprender desde o início =)
Joseph