Vereinfachen Sie sich wiederholende Aufgaben in QGIS Graphical Modeler

13

Bildbeschreibung hier eingeben

Gibt es Iteratoren, die in QGIS Graphical Modeler verwendet werden können, um das oben gezeigte Modell zu vereinfachen? Wenn nicht, gibt es eine bessere Möglichkeit, das Modell zu vereinfachen?

Die erste Spalte repräsentiert meine Eingabe-Layer, die zweite Spalte ist die Kreuzung, die dritte Spalte ist die Ausgabe der Operation "Kreuzung", die vierte Spalte ist die Operation "Attribut nach Position verbinden" und die fünfte Spalte ist das Ergebnis der Verknüpfungsoperation.

Ich möchte Operationen "Schnittmenge" und "Attribut nach Standort verbinden" für eine Analyse der Wasserscheide ausführen. Ziel ist die Berechnung von linearen morphometrischen Parametern wie der Gesamtlänge und der mittleren Länge von Strömen unterschiedlicher Ordnung, des Stromverhältnisses und des Bifurkationsverhältnisses.

Der erste Schritt besteht darin, "Order1-Ströme" mit der Wasserscheide zu schneiden und dann die "Order2-Ströme" mit derselben Wasserscheide zu schneiden. Wenn ein Shapefile "order3 stream" bereitgestellt wird, sollte der Schnittpunkt für diese neue Ebene ausgeführt werden. Daher sind nur "order1 streams" und "order2 streams" obligatorisch, der Rest hängt von der bereitgestellten Wasserscheide ab. Wenn es sich bei der Wasserscheide beispielsweise um eine Wasserscheide der Ordnung 4 handelt, sind bis zu "Ströme der Ordnung 4" erforderlich.

Sobald die Überschneidung für alle verfügbaren Eingabe-Layer abgeschlossen ist, werden sie durch die Position mit der Wasserscheide verbunden. Dabei haben Sie die Möglichkeit, die Summe und den Mittelwert der überschnittenen Streams abzurufen.

Das Bild zeigt die korrekte Vorgehensweise. Wenn ich die Operation außerhalb des Modellierers durchführe, sind die Ergebnisse korrekt. Wenn ich das Modell laufen lasse, erhalte ich diesen Fehler.

"Fehler beim Ausführen des Algorithmus Order5_plus_wshed 'NoneType' Objekt hat kein Attribut 'dataProvider'".

Dies tritt auf, wenn ich für einen der optionalen Parameter keine Eingabe gemacht habe (z. B. "order4 streams"). Wenn ich jedoch alle Eingaben mache, erhalte ich die Ergebnisse, die ich brauche.

Daher möchte ich fragen, ob es einen besseren Weg gibt, diese Aufgabe einzurichten.

DennisTG
quelle

Antworten:

12

Die Art und Weise, wie ich Ihre Aufgabe einrichten würde, wäre, ein benutzerdefiniertes Skript zu erstellen , das mehr Flexibilität bietet als der Modellierer, aber dennoch eine ähnliche Oberfläche für seine Benutzer bereitstellen kann. Sie können eines erstellen aus:

Verarbeitungs-Toolbox> Skripte> Werkzeuge> Neues Skript erstellen

Dann kopieren / einfügen das Skript unten und speichern Sie es in C:/Users/You/.qgis2/processing/scripts.

Das folgende Skript versucht zu emulieren, was Ihr Modell tut. Das Skript ist keine endgültige Lösung (vor allem seit den Paramater I für die verwendete Überschneidung und Join - Attribut von Standort - Tools unterscheiden von dem, was Sie definiert) , aber hoffentlich können Sie es als Vorlage verwenden , um auf das Skript zu erweitern und verbessern Ihre Bedürfnisse anpassen . Um es auszuführen, wählen Sie es einfach in der Processing Toolbox aus, nachdem es gespeichert wurde.

Ich denke, das Skript macht das, was Sie gefragt haben:

  • Die ersten beiden Bestellungen sind obligatorisch und werden bearbeitet.

  • IF Anweisungen werden verwendet, um sicherzustellen, dass alle nachfolgenden Bestellungen nur verarbeitet werden, wenn die richtige vorangestellt ist (z. B. Bestellung4 wird nur ausgeführt, wenn Bestellung3 ausgewählt wurde).

  • Außerdem werden in der Python-Konsole Nachrichten gedruckt, in denen angegeben ist, welche Bestellungen verarbeitet werden.


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

Unten sehen Sie einen Screenshot der Benutzeroberfläche beim Ausführen des Skripts (der ähnlich aussehen sollte, wenn Sie Ihr Modell ausführen):

Skript wird ausgeführt

Einige Dinge zu beachten:

  • Das rote Kästchen enthält obligatorische Parameter

  • Das grüne Kästchen enthält optionale Parameter

  • Das blaue Kästchen enthält obligatorische Parameter

  • Die Blackbox enthält optionale Parameter für die Ausgabe der Ergebnisse. Das Skript gibt Layer nur dann aus, wenn die zugehörige Reihenfolge ausgewählt ist (z. B. wenn die Eingabe für order5 nicht ausgewählt ist, die Ausgabe jedoch, tritt ein Fehler auf). Daher muss der Benutzer die Eingänge und die relevanten Ausgänge auswählen. Dies war nicht beabsichtigt, aber ich persönlich denke, es ist eine gute Möglichkeit, den Benutzer zu zwingen, die Parameter sorgfältig zu überprüfen.


Ich habe QGIS 2.12.3 verwendet (mit Processing Plugin Version 2.12.2).

Joseph
quelle
2
In einem kürzlich veröffentlichten QGIS-Podcast hatten sie den Ersteller der Verarbeitung aktiviert, und er sagte, dass Sie aufgrund der Art und Weise, in der er erstellt wurde, keinen Iterator direkt im Model Builder hinzufügen können. Das Hinzufügen würde ein umfangreiches Umschreiben erfordern. Daher ist ein benutzerdefiniertes Skript definitiv der richtige Weg, dies vorerst zu tun.
HeikkiVesanto
@ Vesanto - Das ist sehr interessant, danke, dass du das aufgenommen hast. Haben Sie einen Link zu diesem bestimmten Podcast?
Joseph
1
@DennisTG - Entschuldigung Kumpel, ich hätte in meinem Beitrag erwähnen sollen, dass ich QGIS 2.12.3 (mit Processing Plugin Version 2.12.2) verwendet habe.
Joseph
1
@ Joseph, es funktioniert für mich. Sehr aufschlussreich, ich schätze die Hilfe.
DennisTG