Спростіть повторювані завдання в QGIS Graphical Modeler


13

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

Чи є ітератори, які можна використовувати в графічному моделярі QGIS для спрощення моделі, показаної вище. Якщо ні, чи є кращий спосіб спростити модель?

Перший стовпець представляє мої вхідні шари, другий стовпчик - перетин, третій стовпець - це результат операції "перетину", четвертий стовпець - операція "атрибут приєднання за місцем розташування", а п'ятий стовпець - результат операції об'єднання.

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

Перший крок - перетинати "порядок1 потоків" з вододілом, а потім перетинати "Порядок2 потоків" з тим же вододілом. Якщо надано файл форм "stream3 stream", тоді слід виконати перетин цього нового шару. Тому лише "order1 потоки" та "order2 потоки" є обов'язковими, решта залежать від передбаченого вододільного шару. Наприклад, якщо вододіл є порядком 4 вододілу, тоді необхідні потоки відносяться до "порядку 4 потоків".

Після завершення перехрестя для всіх доступних вхідних шарів вони потім приєднуються за місцем розташування до вододілу з опціями отримати суму та середнє значення пересічених потоків.

На зображенні показана правильна процедура. Якщо я виконую операцію поза моделером, результати є правильними. Коли я запускаю модель, я отримую цю помилку.

"Помилка виконання алгоритму Order5_plus_wshed 'NoneType' Об'єкт не має атрибута 'dataProvider'".

Це відбувається, якщо я не надав введення для одного з необов'язкових параметрів (тобто вхідних даних, наприклад, "потоки 4 порядку"). Однак, якщо я надаю всі входи, я отримую потрібні мені результати.

Отже, я хотів би запитати, чи є кращий спосіб постановки цього завдання.

Відповіді:


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)

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

Запуск сценарію

Кілька речей, що слід зазначити:

  • Червоне поле містить обов'язкові параметри

  • Зелене поле містить необов'язкові параметри

  • Синє поле містить обов'язковий параметр

  • Чорне поле містить необов'язкові параметри для виведення результатів. Сценарій буде виводити шари лише у тому випадку, якщо вибраний асоційований порядок (наприклад, якщо вхід для порядку 5 не вибрано, але вихід для нього буде, станеться помилка). Тому користувач повинен вибрати входи та відповідні виходи. Це не було навмисно, але особисто я думаю, що це хороший спосіб змусити користувача ретельно перевірити параметри.


Я використовував QGIS 2.12.3 (з плагіном для обробки версії 2.12.2).


2
На недавньому подкасті QGIS у них був створений процес обробки, і він сказав, що через спосіб його побудови ви не можете зараз додавати ітератор безпосередньо в конструктор моделей. Щоб додати, потрібно буде велике перезапис. Тож користувацький сценарій - це, безумовно, спосіб зробити це зараз.
HeikkiVesanto

@Vesanto - Це дуже цікаво, дякую, що включили це. Чи є у вас посилання на цей конкретний подкаст?
Йосип


1
@DennisTG - Вибачте приятелю, я мав би зазначити у своєму дописі, що я використовував QGIS 2.12.3 (з плагіном для обробки версії 2.12.2).
Йосип

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