Условие QGIS Modeler if / else, пользовательский скрипт для Modeler

10

Я хочу сделать простую функцию if / else внутри моей Модели, и я хотел знать, возможно ли это или нет.

введите описание изображения здесь

Я хочу, чтобы это делалось так, если выбран Вход для «Сегментного слоя», чтобы он не выполнял «Сегментацию (означает смещение)» и использует вместо этого «Сегментный слой» в качестве Входных данных для следующего процесса.

Входные данные для «Сегментации (среднее смещение)» следующие

введите описание изображения здесь

Обновление после попытки реализовать ответ Джозефа: я использовал следующий код и получил эту ошибку введите описание изображения здесь

Обновление 2, после замены параметров я получаю сообщение об ошибке в строке 28, это было «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

введите описание изображения здесь

Обновите это работает :) после нескольких попыток и с помощью Джозефа этот код теперь работает как талисман, последний трюк заключался в замене двух необязательных значений на «Нет».

##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
источник
3
Я думаю, вам нужно будет использовать собственный скрипт внутри вашего моделера, чтобы правильно использовать операторы if / else .
Иосиф
1
@ Джозеф, я тоже так думал. Проблема в том, что я не настолько хорош в написании сценариев, как хотелось бы, у меня практически нет опыта работы ...
Андреас
1
@ Андреас Я подтверждаю, что Джозеф написал в своем комментарии. Тем не менее, я думаю, что вы можете получить больше помощи от сообщества, если вы отредактируете свой вопрос и дадите возможность получить некоторые подсказки с помощью Python (добавив также правильный тег) ...
mgri
1
@Andreas - отредактировал мой пост. Кроме того, вы должны принять ответы после того, как они решили вашу проблему;)
Джозеф
1
@ Джозеф Я отредактировал свой пост с помощью работающего кода, ваша помощь была очень нужна, и я очень рад, что вы потратили немного своего драгоценного времени, чтобы помочь мне с этим :) На данный момент он выполняет алгоритм, и мне нужно подождать за результаты, но это выглядит действительно многообещающе, спасибо еще раз :)
Andreas

Ответы:

8

Как уже упоминалось в моем комментарии, в этой ситуации можно использовать собственный скрипт . Вы можете создать один из:

Processing Toolbox > Scripts > Tools > Create new script

Следующий скрипт устанавливает необязательные входные параметры вместе с оператором if / else в зависимости от того, какой параметр содержит слой. Поэтому, если для слоя был выбран слой BGREN, он выполнит инструмент сегментации и установит выходные данные; в противном случае на выходе будет выбран слой Segment_Layer.

Вот возможный скрипт:

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

Параметры otb:segmentationmeanshiftвыглядят страшно! К сожалению, у меня не установлен Orfeo, поэтому я не могу протестировать этот инструмент. Тем не менее, параметры показаны здесь , вам просто нужно ввести их вместо использования графического интерфейса. Сделав это, добавьте скрипт в ваш моделер, используя BGRENи в Segment_Layerкачестве входных слоев:

Параметры скрипта

Кроме того, в вашей программе моделирования вам может потребоваться изменить определение обязательного параметра BGRENи Segment_Layer:

Определение параметра

Затем подключите вывод скрипта к вашему инструменту NDVI.


Я протестировал это в некоторой степени, используя другие инструменты, которые работали в зависимости от того, какой входной слой был выбран, так что, надеюсь, он будет работать для вашего моделиста!



РЕДАКТИРОВАТЬ:

Вот код, который вы использовали немного измененный (вам нужны запятые для разделения параметров, Trueа Falseоператоры не требуют кавычек вокруг них, обратная косая черта предназначена только для удобства чтения, но будет включать ее в виде одной строки):

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

Или как однострочник:

##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
Я добавил комментарий, чтобы побудить @Andreas отредактировать свой вопрос и дать возможность получить некоторые подсказки с помощью Python для получения дополнительной помощи, но вы были быстрее!
МГРИТЕ
1
@mgri - Я бы посоветовал вам опубликовать этот комментарий, так как ФП может захотеть отредактировать некоторые детали и, надеюсь, побудить других опубликовать возможное решение :)
Джозеф
1
@ Джозеф, черт побери, это намного больше, чем я думал: O, во всяком случае, я постараюсь воссоздать это и оставить отзыв, если я его
Andreas
1
Наиболее желанный! Я, вероятно, задумался над этим, так что, возможно, будет хорошей идеей отредактировать ваш вопрос, как предложила @mgri, чтобы можно было опубликовать более подходящее решение для Python или что-то подобное =)
Джозеф,
1
@Andreas - совсем не глупо, все должны учиться с самого начала =)
Джозеф