Упростите повторяющиеся задачи в QGIS Graphical Modeler

13

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

Существуют ли итераторы, которые можно использовать в QGIS, чтобы упростить модель, показанную выше. Если нет, есть ли лучший способ упростить модель?

Первый столбец представляет мои входные слои, второй столбец - это пересечение, третий столбец - это выход из операции «пересечение», четвертый столбец - это операция «атрибут соединения по местоположению», а пятый столбец - результат операции соединения.

Я хотел бы выполнить операции «пересечение» и «объединить атрибут по местоположению» для анализа водораздела. Цель состоит в том, чтобы вычислить линейные морфометрические параметры, такие как общая и средняя длина потоков различных порядков, коэффициенты потока и коэффициент бифуркации.

Первым шагом является пересечение «потоков Order1» с водоразделом, а затем пересечение «потоков Order2» с тем же водоразделом. Если предоставлен шейп-файл «order3 stream», то пересечение для этого нового слоя должно быть выполнено. Поэтому только «потоки порядка 1» и «потоки порядка 2» являются обязательными, а остальные зависят от предоставленного уровня водораздела. Например, если водораздел является водоразделом порядка 4, то требуемые потоки составляют «потоки порядка 4».

Как только пересечение завершено для всех доступных входных слоев, они соединяются по местоположению с водоразделом с помощью опций, чтобы получить сумму и среднее значение пересеченных потоков.

Изображение показывает правильную процедуру. Если я делаю операцию вне моделера, результаты верны. Когда я запускаю модель, я получаю эту ошибку.

Msgstr "Ошибка выполнения алгоритма объекта Order5_plus_wshed 'NoneType' не имеет атрибута 'dataProvider'".

Это происходит, если я не предоставил вход для одного из необязательных параметров (т. Е. Входные данные, например, «потоки порядка 4»). Однако, если я предоставлю все входные данные, я получу необходимые результаты.

Итак, я хотел бы спросить, есть ли лучший способ постановки этой задачи.

DennisTG
источник

Ответы:

12

Я бы поставил перед вами задачу создать собственный сценарий, который обеспечивает большую гибкость, чем разработчик модели, но все же может предоставить аналогичный интерфейс своим пользователям. Вы можете создать один из:

Инструменты обработки> Сценарии> Инструменты> Создать новый скрипт

Затем скопируйте / вставьте скрипт ниже и сохраните его в C:/Users/You/.qgis2/processing/scripts.

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

Я думаю, что скрипт делает то, что вы просили:

  • Первые два заказа являются обязательными, поэтому будут обработаны.

  • IF операторы используются для того, чтобы гарантировать, что любые последующие ордера будут обрабатываться только в том случае, если перед ним стоит правильный (например, order4 будет выполняться только в том случае, если был выбран order3).

  • Кроме того, в консоли Python печатаются сообщения, показывающие, какие заказы обрабатываются.


##Example model=name
##Order1=vector
##Order2=vector
##Order3=optional vector
##Order4=optional vector
##Order5=optional vector
##Watershed=vector
##Order2_Wshed=output vector
##Order3_Wshed=output vector
##Order4_Wshed=output vector
##Order5_Wshed=output vector

order1 = processing.getObject(Order1)
order2 = processing.getObject(Order2)
order3 = processing.getObject(Order3)
order4 = processing.getObject(Order4)
order5 = processing.getObject(Order5)
watershed = processing.getObject(Watershed)

if Order3 is None:
    print 'Processing Order1 and Order2'
else:
    print 'Processing Order1, Order2 and Order3'
    if Order4 is not None:
        print 'Processing Order1, Order2, Order3 and Order4'
        if Order5 is not None:
            print 'Processing Order1, Order2, Order3, Order4 and Order5'

output_1a = processing.runalg("qgis:intersection", order1, watershed, None)
output_1b = processing.runalg("qgis:joinattributesbylocation", output_1a['OUTPUT'], watershed, u'intersects', 0, 0, '', 0, None)
output_2a = processing.runalg("qgis:intersection", order2, watershed, None)
output_2b = processing.runalg("qgis:joinattributesbylocation", output_2a['OUTPUT'], output_1b['OUTPUT'], u'intersects', 0, 0, '', 0, Order2_Wshed)

if Order3 is None:
    pass
else:
    output_3a = processing.runalg("qgis:intersection", order3, watershed, None)
    output_3b = processing.runalg("qgis:joinattributesbylocation", output_3a['OUTPUT'], output_2b['OUTPUT'], u'intersects', 0, 0, '', 0, Order3_Wshed)
    if Order4 is None:
        pass
    else:
        output_4a = processing.runalg("qgis:intersection", order4, watershed, None)
        output_4b = processing.runalg("qgis:joinattributesbylocation", output_4a['OUTPUT'], output_3b['OUTPUT'], u'intersects', 0, 0, '', 0, Order4_Wshed)
        if Order5 is None:
            pass
        else:
            output_5a = processing.runalg("qgis:intersection", order5, watershed, None)
            output_5b = processing.runalg("qgis:joinattributesbylocation", output_5a['OUTPUT'], output_4b['OUTPUT'], u'intersects', 0, 1, 'sum, mean', 0, Order5_Wshed)

Ниже приведен скриншот интерфейса при запуске скрипта (который должен выглядеть примерно так, как при запуске вашей модели):

Запуск сценария

Несколько вещей, чтобы отметить:

  • Красное поле содержит обязательные параметры

  • Зеленый ящик содержит дополнительные параметры

  • Синее поле содержит обязательный параметр

  • Черный ящик содержит дополнительные параметры для вывода результатов. Сценарий будет выводить слои только в том случае, если выбран соответствующий порядок (например, если не выбран вход для order5, а для выхода есть ошибка). Поэтому пользователь должен выбрать входы и соответствующие выходы. Это не было преднамеренным, но лично я думаю, что это хороший способ заставить пользователя тщательно проверить параметры.


Я использовал QGIS 2.12.3 (с плагином Processing версии 2.12.2).

Джозеф
источник
2
На недавнем подкасте QGIS у них был создатель обработки, и он сказал, что из-за того, как он был построен, вы не можете добавить итератор прямо в конструктор моделей. Это потребовало бы обширного переписывания, чтобы добавить. Таким образом, пользовательский скрипт определенно является способом сделать это сейчас.
ХейккиВесанто
@Vesanto - Это очень интересно, спасибо, что включили это. У вас есть ссылка на этот конкретный подкаст?
Джозеф
2
qgispodcast.libsyn.com/… Прямая загрузка: traffic.libsyn.com/qgispodcast/QGIS-episode12.mp3
HeikkiVesanto
1
@DennisTG - приятель извинений, я должен был упомянуть в своем посте, что я использовал QGIS 2.12.3 (с плагином Processing версии 2.12.2).
Джозеф
1
@ Джозеф, это работает для меня. Довольно проницательный, я ценю помощь.
DennisTG