17.33. Nutzung von R-Skripten in der Prozessierung

Module contributed by Matteo Ghetta - funded by Scuola Superiore Sant’Anna

Die Verarbeitungsumgebung (mit der Erweiterung Processing R Provider) macht das Schreiben und Ausführen von R Skripten innerhalb von QGIS möglich.

Warnung

R muss auf Ihrem Rechner installiert und die PATH-Variable korrekt gesetzt sein. Die Verarbeitungsumgebung ruft die externen R Packete nur auf. Sie kann sie nicht selbst installieren. Stellen Sie daher sicher, dass die externen Pakete direkt in R installiert werden. Im Benutzerhandbuch Kapitel findet man dazu weitere Informationen.

Bemerkung

Wenn es Probleme mit Paketen gibt, fehlen unter Umständen für die Verarbeitung erforderliche Pakete wie sp, rgdal und raster.

17.33.1. Hinzufügen von Skripten

Das Hinzufügen eines Skriptes ist einfach. Der einfachste Weg ist das Öffnen der Werkzeugkiste. In der Werkzeugleiste der Werkzeugkiste wählt man dann Create new R script… aus dem R Menü (durch das R Symbol gekennzeichnet). Man kann auch ein Skript im Texteditor erstellen und es anschließend im R Skript Ordner (processing/rscripts) ablegen. Sobald es dort abgelegt wurde, wird es zur Bearbeitung in der Werkzeugkiste verfügbar. Man klickt dazu mit der rechten Maustaste auf den Skriptnamen und wählt Edit Script…).

../../../_images/r_intro_1.png

Bemerkung

Wenn Sie R nicht in der Verarbeitungsumgebung finden, müssen Sie es unter Optionen ▶ Verarbeitung ▶ Datenanbieter aktivieren.

Es öffnet sich ein Fenster R Script Editor. Hier müssen einige Parameter definiert werden, bevor das Skript an sich erstellt werden kann.

../../../_images/r_intro_2.png

17.33.2. Erstellung von Plots

In dieser Anleitung erstellen wir einen Box-Plot für ein Feld eines Vektorlayers.

Öffnen das QGIS Projekt r_intro.qgs im Ordner exercise_data/processing/r_intro/.

17.33.2.1. Skript Parameter

Öffnen Sie den Editor und beginnen mit dem Schreiben am Anfang.

Sie müssen einige Parameter vor dem Hauptteil des Skripts festlegen:

  1. Der Name der Gruppe (plots in diesem Fall) in der Sie Ihr Skript stellen wollen (wenn die Gruppe nicht existiert, wird sie erstellt):

    ##plots=group
    

    Sie finden Ihr Skript in der plots R Gruppe in den Verarbeitungswerkzeugen.

  2. Sie müssen der Verarbeitung mitteilen, dass Sie ein Plot (in diesem Beispiel) darstellen möchten:

    ##showplots
    

    Sie erhalten dann in der Ergebnisanzeige einen Link zum Plot (das kann unter Ansicht ▶ Bedienfelder und mit Verarbeitung ▶ Ergebnisanzeige ein- oder ausgeschaltet werden).

  3. Sie müssen der Verarbeitung auch die Eingabedaten vorgeben. In diesem Beispiel wollen wir ein Plot für ein Feld eines Vektorlayers erstellen:

    ##Layer=vector
    

    Die Verarbeitung weiß nun, dass die Eingabe eine Vektordatei ist. Der Name Layer ist nicht wichtig, entscheidend ist der Parameter vector.

  4. Als Letztes müssen Sie das Eingabefeld des Vektorlayers vorgeben (unter Nutzung des Namens, den Sie oben vergeben haben - Layer):

    ##X=Field Layer
    

    Die Verarbeitung weiß nun, dass Sie ein Feld Layer benötigen und es X nennen.

  5. Man kann den Namen des Skriptes auch mit Hilfe von name definieren:

    ##My box plot script=name
    

    Wenn nichts vorgegeben ist, wird der Dateiname als Name des Skriptes verwendet.

17.33.2.2. Skript Hauptteil

Nachdem wir den Kopf des Skriptes festgelegt haben, können wir die Funktionalität hinzufügen:

boxplot(Layer[[X]])

boxplot ist der Name der R Funktion. Der Parameter Layer ist der Name, den wir für den Eingabedatensatz vorgegeben haben. X ist der vorgegebene Name des Feldes im Datensatz.

Warnung

Der Parameter X muss innerhalb doppelter eckiger Klammern stehen ([[]]).

Das fertige Skript sollte wie folgt aussehen:

##Vector processing=group
##showplots
##Layer=vector
##X=Field Layer
boxplot(Layer[[X]])
../../../_images/r_intro_3.png

Speichern Sie das Skript im voreingestellten Pfad entsprechend des Vorschlags der Verarbeitung (processing/rscripts). Wenn Sie name im Kopf des Skriptes nicht definiert haben, wird das Skript in der Verarbeitungsumgebung mit dem Dateinamen bezeichnet.

Bemerkung

Sie können das Skript an einem beliebigen Ort speichern. Die Verarbeitung übernimmt das Skript dann nicht automatisch in die Verarbeitungsumgebung und es muss manuell hinzugefügt werden.

Starten Sie jetzt das Skript durch Drücken auf die ausführen Schaltfläche im Editorfenster:

../../../_images/r_intro_4.png

Nutzen Sie nach dem Schließen des Editorfensters die Textbox der Verarbeitung, um Ihr Skript zu finden:

../../../_images/r_intro_5.png

Sie können nun die erforderlichen Parameter im Fenster des Verarbeitungsalgorithmus eintragen:

  • wählen Sie sample_points als Layer

  • wählen Sie value als X Feld

Klicken Sie auf Starte.

../../../_images/r_intro_6.png

Die Ergebnisanzeige sollte sich automatisch öffnen. Falls das nicht geschieht, klicken Sie auf Verabeitung ▶ Ergebnisanzeige.

Wenn Sie auf den Link in der Ergebnisanzeige klicken, sehen Sie das Folgende:

../../../_images/r_intro_7.png

Bemerkung

Sie können das Bild nun durch Rechtsklick auf den Plot kopieren und speichern.

17.33.3. Erstellen eines Vektorlayers

Sie können außerdem einen Vektorlayer erstellen und ihn automatisch in QGIS laden.

The following example has been taken from the Random sampling grid script that can be found in the online collection of R scripts (the scripts in this online collection can be found in https://github.com/qgis/QGIS-Processing/tree/master/rscripts).

Das Ziel dieser Übung ist die Erstellung eines zufälligen Punktlayers mit Hilfe der spsample Funktion aus dem sp Paket. Dabei soll die Ausdehnung über einen Eingabevektorlayer begrenzt werden.

17.33.3.1. Skript Parameter

Wie vorhin müssen wir zuerst einige Parameter oberhalb des Hauptteiles des Skriptes vorgeben:

  1. Geben Sie den Namen der Gruppe vor, in die das Skript soll. In diesem Fall ist das Point pattern analysis:

    ##Point pattern analysis=group
    
  2. Define an input parameter (a vector layer) that will constrain the placement of the random points:

    ##Layer=vector
    
  3. Geben Sie einen Eingabeparameter für die Anzahl der zu erzeugenden Punkte vor (Size, der Vorgabewert ist 10):

    ##Size=number 10
    

    Bemerkung

    Da ein Vorgabewert (10) vorhanden ist, kann der Nutzer den Parameter so belassen oder einen eigenen Wert eingeben.

  4. Geben Sie vor, dass ein Ausgabevektorlayer erzeugt wird (bezeichnet mit Output):

    ##Output=output vector
    

17.33.3.2. Skript Hauptteil

Sie können jetzt den Hauptteil der Funktion hinzufügen:

  1. Verwenden Sie die Funktion spsample:

    pts=spsample(Layer, Size, type="random")
    

    Die Funktion verwendet den Layer, um die Platzierung der Punkte zu beschränken (wenn der Layer eine Linie ist, müssen die Punkte auf der Linie liegen; wenn es ein Polygon ist, müssen die Punkte innerhalb des Polygons liegen). Die Anzahl der Punkt entspricht der Vorgabe im Parameter Size. Das Stichprobenverfahren ist random.

  2. Erstellen Sie die Ausgabe (der Parameter Output):

    Output=SpatialPointsDataFrame(pts, as.data.frame(pts))
    

Das fertige Skript sollte wie folgt aussehen:

##Point pattern analysis=group
##Layer=vector
##Size=number 10
##Output=output vector
pts=spsample(Layer, Size, type="random")
Output=SpatialPointsDataFrame(pts, as.data.frame(pts))
../../../_images/r_intro_8.png

Speichern Sie es und klicken Sie auf die Schaltfläche zum Starten.

Geben Sie in dem neu geöffneten Fenster die richtigen Parameter ein:

../../../_images/r_intro_9.png

und klicken Sie auf Starte.

Der Ergebnislayer wird im Inhaltsverzeichnis eingefügt und die Punkte werden im Kartenfenster angezeigt:

../../../_images/r_intro_10.png

17.33.4. Textausgabe und grafische Ausgabe mit der R - Syntax

Die Verarbeitung (mit dem Processing R Provider plugin) nutzt eine spezielle Syntax, um die Ergebnisse aus R zu erhalten:

  • > vor einem Kommando, wie in >lillie.test(Layer[[Field]]) bedeutet, dass das Ergebnis an die R Ausgaeb gesendet wird (Ergebnisanzeige)

  • + nach einem Plot erlaubt sich überlagernde Plots. Zum Beispiel plot(Layer[[X]], Layer[[Y]]) + abline(h=mean(Layer[[X]]))