QGIS Modeler якщо / else умова, власний сценарій для Modeler


10

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

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

Я хочу, щоб це було так, якщо вибрано Input для "Сегментного шару", що він не повинен виконувати "Сегментацію (переміщення коштів)" і використовує "Сегментний шар" замість цього як Вхід для наступного процесу.

Вхідні дані для "Сегментації (змінення коштів)" наступні

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

Оновіть після спроби реалізувати відповідь Джозефа: я використав наступний код і отримав цю помилку введіть тут опис зображення

Оновлення 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

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

Оновлення працює: після декількох спроб, і за допомогою Джозефа цей код тепер працює як шарм, останньою хитрістю було замінити два необов'язкові значення на "None".

##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
Я думаю, що вам потрібно буде використовувати користувальницький скрипт всередині свого моделера, щоб правильно використовувати оператори if / else .
Йосип

1
@ Джозеф, ось що я теж думав, проблема в тому, що я не такий хороший у написанні сценаріїв, як хотів би бути, я майже не маю досвіду взагалі ...
Андреас

1
@Andreas Я підтверджую те, що написав Йосиф у своєму коментарі. Однак, я думаю, ви можете отримати додаткову допомогу від громади, якщо ви відредагуєте своє запитання і надасте можливість отримати підказки з Python (додавши також належний тег) ...
mgri

1
@Andreas - Редагував моє повідомлення. Також слід приймати відповіді після того, як вони вирішили вашу проблему;)
Йосип

1
@Joseph Я відредагував свою посаду за допомогою вже працюючого коду, ваша допомога була дуже потрібна, і я дуже радий, що ви взяли частину свого дорогоцінного часу, щоб допомогти мені в цьому :) На сьогодні це виконується алгоритм, і мені потрібно чекати за результати, але це виглядає по-справжньому багатообіцяю, ще раз дякую :)
Андреас

Відповіді:


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, тому не можу перевірити цей інструмент. Однак тут показані параметри , вам просто потрібно ввести їх замість GUI. Закінчивши, додайте сценарій у свій моделер, використовуючи 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 для отримання додаткової допомоги, але ви були швидшими!
mgri

1
@mgri - Я б закликав вас опублікувати цей коментар, оскільки ОП може захотіти відредагувати деякі деталі та сподіваюся заохотити інших опублікувати можливе рішення :)
Жозеф

1
@ Джозеф чорт, це набагато більше, ніж я думав, що це буде: O все одно я спробую відтворити це і залиште зворотній зв'язок, якщо я змусив його працювати, заздалегідь дякую :)
Андреас

1
Найпривітніший! Я, мабуть, переосмислив це, тож може бути гарною ідеєю відредагувати своє запитання так, як @mgri запропонував, щоб було розміщено більш підходяще рішення python або подібне =)
Джозеф

1
@Andreas - Зовсім не дурно, всі повинні вчитися з самого початку =)
Йосип
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.