Uprość powtarzalne zadania w QGIS Graphical Modeler


13

wprowadź opis zdjęcia tutaj

Czy istnieją iteratory, które można zastosować w graficznym modelerze QGIS w celu uproszczenia pokazanego powyżej modelu? Jeśli nie, czy istnieje lepszy sposób uproszczenia modelu?

Pierwsza kolumna reprezentuje moje warstwy wejściowe, druga kolumna to przecięcie, trzecia kolumna to wynik operacji „przecięcie”, czwarta kolumna to operacja „łącz atrybut przez lokalizację”, a piąta kolumna to wynik operacji łączenia.

Chciałbym przeprowadzić operacje „przecięcie” i „połączyć atrybut przez lokalizację” w celu analizy przełomu. Celem jest obliczenie Liniowych parametrów morfometrycznych, takich jak całkowita i średnia długość strumieni różnych rzędów, stosunki strumieni i stosunek rozwidlenia.

Pierwszym krokiem jest przecięcie „porządków1 strumieni” z działem wodnym, a następnie przecięcie „strumieni porządków2” z tym samym działem wodnym. Jeśli podany jest plik kształtowy „strumień3 zamówienia”, należy wykonać przecięcie tej nowej warstwy. Dlatego obowiązkowe są tylko „strumienie rzędu 1” i „strumienie rzędu 2”, reszta zależy od dostarczonej warstwy zlewni. Na przykład, jeśli przełom jest zlewem rzędu 4, wówczas wymagane strumienie są w górę do „uporządkuj 4 strumienie”.

Po zakończeniu przecięcia dla wszystkich dostępnych warstw wejściowych są one następnie łączone według położenia do zlewu z opcjami uzyskania sumy i średniej przeciętych strumieni.

Obraz pokazuje prawidłową procedurę. Jeśli wykonam operację poza modelerem, wyniki są prawidłowe. Po uruchomieniu modelu pojawia się ten błąd.

„Błąd wykonywania algorytmu Order5_plus_wshed Obiekt„ NoneType ”nie ma atrybutu„ dataProvider ””.

Dzieje się tak, jeśli nie podałem danych wejściowych dla jednego z opcjonalnych parametrów (tj. Danych wejściowych, np. „Strumienie order4”). Jednak jeśli podam wszystkie dane wejściowe, otrzymam wyniki, których potrzebuję.

Chciałbym więc zapytać, czy istnieje lepszy sposób na skonfigurowanie tego zadania.

Odpowiedzi:


12

Sposób, w jaki skonfigurowałbym twoje zadanie, to stworzenie niestandardowego skryptu, który zapewnia większą elastyczność niż modelarz, ale nadal może zapewnić podobny interfejs dla swoich użytkowników. Możesz utworzyć jeden z:

Przetwarzanie Przybornik> Skrypty> Narzędzia> Utwórz nowy skrypt

Następnie skopiuj / wklej poniższy skrypt i zapisz go w C:/Users/You/.qgis2/processing/scripts.

Poniższy skrypt próbuje naśladować to, co robi Twój model. Skrypt nie jest ostatecznym rozwiązaniem (zwłaszcza, że ​​parametry użyte dla atrybutu Przecięcie i Połącz według narzędzi lokalizacji mogą różnić się od zdefiniowanych przez Ciebie), ale mam nadzieję, że możesz go użyć jako szablonu do rozszerzenia i ulepszenia skryptu, aby dostosować go do twoich potrzeb . Aby go uruchomić, po prostu wybierz go z Przybornika przetwarzania po zapisaniu.

Myślę, że skrypt robi to, o co prosiłeś:

  • Pierwsze dwa zamówienia są obowiązkowe, więc zostaną przetworzone.

  • IF instrukcje służą do zapewnienia, że ​​wszelkie kolejne zamówienia zostaną przetworzone tylko wtedy, gdy poprawne je poprzedzi (np. zamówienie4 uruchomi się tylko, jeśli wybrano zamówienie3).

  • Ponadto komunikaty są drukowane w konsoli Python, pokazując, które zamówienia są przetwarzane.


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

Poniżej znajduje się zrzut ekranu interfejsu podczas uruchamiania skryptu (który powinien wyglądać podobnie do uruchomionego modelu):

Uruchamianie skryptu

Kilka rzeczy do zapamiętania:

  • Czerwone pole zawiera obowiązkowe parametry

  • Zielone pole zawiera parametry opcjonalne

  • Niebieskie pole zawiera parametr obowiązkowy

  • Czarna skrzynka zawiera opcjonalne parametry do generowania wyników. Skrypt będzie generował warstwy tylko wtedy, gdy zostanie wybrana powiązana kolejność (np. Jeśli dane wejściowe dla zamówienia 5 nie zostaną wybrane, ale dane wyjściowe dla nich wystąpią, wystąpi błąd). Dlatego użytkownik musi wybrać wejścia i odpowiednie wyjścia. Nie było to zamierzone, ale osobiście uważam, że to dobry sposób, aby zmusić użytkownika do dokładnego sprawdzenia parametrów.


Użyłem QGIS 2.12.3 (z wtyczką Processing plugin 2.12.2).


2
W ostatnim podcastu QGIS mieli twórcę przetwarzania, a on powiedział, że ze względu na sposób, w jaki został zbudowany, nie można teraz dodać iteratora bezpośrednio do konstruktora modeli. Dodanie wymagałoby obszernego przepisania. Skrypt niestandardowy jest więc na pewno sposobem na zrobienie tego.
HeikkiVesanto

@ Vesanto - To bardzo interesujące, dziękuję za uwzględnienie tego. Czy masz link do tego konkretnego podcastu?
Joseph


1
@DennisTG - Koledzy z przeprosin, powinienem wspomnieć w swoim poście, że korzystałem z QGIS 2.12.3 (z wtyczką Processing wersja 2.12.2).
Joseph

1
@Joseph, to działa dla mnie. Dość wnikliwe, doceniam pomoc.
DennisTG
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.