Appendix D: QGIS R script syntaxis

Bijgedragen door Matteo Ghetta - mogelijk gemaakt door Scuola Superiore Sant’Anna

Schrijven van scripts voor R in Processing kan een beetje ingewikkeld zijn vanwege de speciale syntaxis.

Elk script van R voor processing begint met de Inputs en de Outputs, voorafgegaan door dubbele tekens hash (##).

Voor de invoeren, mag de groep met algoritmen, waarin het script moet worden geplaatst, worden gespecificeerd. Als de groep al bestaat, zal het algoritme daaraan worden toegevoegd, anders zal een nieuwe groep worden gemaakt. In het voorbeeld hieronder is de naam van de groep My group:

##My Group=group

Invoer

Alle gegevens en parameters voor de invoer moeten worden gespecificeerd. Er zijn verschillende soorten invoer:

  • vector: ##Layer = vector

  • vector field: ##F = Field Layer (waar Layer de naam is van een invoer vectorlaag waartoe het veld behoort)

  • raster: ##r = raster

  • table: ##t = table

  • number: ##Num = number

  • string: ##Str = string

  • boolean: ##Bol = boolean

  • elementen in een keuzemenu. De items moeten worden gescheiden door puntkomma’s ;: ##type=selection point;lines;point+lines

Uitvoer

Net als voor de invoer dient elke uitvoer te worden gedefinieerd aan het begin van het script:

  • vector: ##output= output vector

  • raster: ##output= output raster

  • table: ##output= output table

  • plots: ##output_plots_to_html (##showplots in eerdere versies)

  • Weergeven van uitvoer voor R in Resultaten bekijken, plaats > voor de opdracht waarvan u de uitvoer wilt weergeven.

Overzicht van syntaxis voor scripts van R in QGIS

Een aantal typen parameter voor in- en uitvoer worden aangeboden.

Typen parameters voor invoer

Parameter

Voorbeeld van syntaxis

Teruggeven van objecten

vector

Layer = vector

sf object (of SpatialDataFrame object, als ##load_vector_using_rgdal is gespecificeerd)

vector point

Layer = vector point

sf object (of SpatialDataFrame object, als ##load_vector_using_rgdal is gespecificeerd)

vector line

Layer = vector line

sf object (of SpatialDataFrame object, als ##load_vector_using_rgdal is gespecificeerd)

vector polygon

Layer = vector polygon

sf object (of SpatialPolygonsDataFrame object, als ##load_vector_using_rgdal wordt gebruikt)

meerdere vector

Layer = multiple vector

sf object (of SpatialDataFrame objects als ##load_vector_using_rgdal is gespecificeerd)

tabel

Layer = table

dataframe conversie van csv, standaard object van de functie read.csv

veld

Field = Field Layer

naam van het geselecteerde veld, bijv. "Area"

raster

Layer = raster

RasterBrick object, standaard object van pakket raster

meerdere raster

Layer = multiple raster

RasterBrick objecten, standaard object van pakket raster

getal

N = number

gekozen integer of floating number

tekenreeks

S = string

string toegevoegd in het vak

longstring

LS = longstring

string toegevoegd in het vak, zou langer kunnen zijn dan een normale tekenreeks

selectie

S = selection first;second;third

string van het geselecteerde item uit d ekeuzelijst

crs

C = crs

string van het gekozen resulterende CRS, in de indeling: "EPSG:4326"

bereik

E = extent

Object Extent van het pakket raster, u kunt waarden uitnemen zoals E@xmin

punt

P = point

indien aangeklikt op de kaart, heeft u de coördinaten van het punt

bestand

F = file

pad van het gekozen bestand, bijv. “/home/matteo/file.txt”

map

F = folder

pad van de gekozen map, bijv. “/home/matteo/Downloads”

Een parameter kan OPTIONAL zijn, wat betekent dat hij kan worden genegeerd.

Voor het instellen van een invoer als optioneel, voegt u de string optional toe voor de invoer, bijv:

##Layer = vector
##Field1 = Field Layer
##Field2 = optional Field Layer

Typen parameters voor uitvoer

Parameter

Voorbeeld van syntaxis

vector

Output = output vector

raster

Output = output raster

tabel

Output = output table

bestand

Output = output file

Notitie

U kunt plots opslaan als png vanuit Processing Resultaten bekijken of u kunt er voor kiezen om het plot direct op te slaan vanuit de interface van het algoritme.

Tekst van het script

De tekst van het script volgt de syntaxis van R en het paneel Log kan u helpen als er iets mis is met uw script.

Onthoud dat u alle aanvullende bibliotheken in het script moet laden:

library(sp)

Voorbeeld met uitvoer als vector

Laten we een algoritme nemen uit de online collectie dat willekeurige punten maakt uit het bereik van een invoerlaag:

##Point pattern analysis=group
##Layer=vector polygon
##Size=number 10
##Output=output vector
library(sp)
spatpoly = as(Layer, "Spatial")
pts=spsample(spatpoly,Size,type="random")
spdf=SpatialPointsDataFrame(pts, as.data.frame(pts))
Output=st_as_sf(spdf)

Uitleg (per regel in het script):

  1. Point pattern analysis is de groep van het algoritme

  2. Layer is de invoer **vector**laag

  3. Size is een numerieke parameter met een standaard waarde van 10

  4. Output is de **vector**laag die zal worden gemaakt door het algoritme

  5. library(sp) laadt de bibliotheek sp

  6. spatpoly = as(Layer, "Spatial") vertaalt naar een sp object

  7. Roep de functie spsample van de bibliotheek sp aan en voer die uit met de hierboven gedefinieerde invoer (Layer en Size)

  8. Maak een object SpatialPointsDataFrame met de functie SpatialPointsDataFrame

  9. Maak de vector uitvoerlaag met de functie st_as_sf

Dat is alles! Voer eenvoudigweg het algoritme uit met een vectorlaag die aanwezig is in de legenda van QGIS, kies het aantal willekeurige punten. De resulterende laag zal aan uw kaart worden toegevoegd.

Voorbeeld met uitvoer als raster

Het volgende script zal basis normale Kriging uitvoeren om een rasterkaart met geïnterpoleerde waarden te maken uit een gespecificeerd veld van de invoer punt vectorlaag door de functie autoKrige te gebruiken van het pakket voor R automap. Het zal eerst het model voor Kriging berekenen en dan een raster maken. Het raster wordt gemaakt met de functie aster van het rasterpakket voor R:

##Basic statistics=group
##Layer=vector point
##Field=Field Layer
##Output=output raster
##load_vector_using_rgdal
require("automap")
require("sp")
require("raster")
table=as.data.frame(Layer)
coordinates(table)= ~coords.x1+coords.x2
c = Layer[[Field]]
kriging_result = autoKrige(c~1, table)
prediction = raster(kriging_result$krige_output)
Output<-prediction

Door ##load_vector_using_rgdal te gebruiken zal de invoer vectorlaag beschikbaar worden gemaakt als een object SpatialDataFrame, waarmee we vermijden dat het moet worden vertaald vanuit een object sf.

Voorbeeld met uitvoer als tabel

Laten we het algoritme Summary Statistics bewerken zodat de uitvoer een tabelbestand (csv) is.

De tekst vor het script is het volgende:

##Basic statistics=group
##Layer=vector
##Field=Field Layer
##Stat=Output table
Summary_statistics<-data.frame(rbind(
    sum(Layer[[Field]]),
    length(Layer[[Field]]),
    length(unique(Layer[[Field]])),
    min(Layer[[Field]]),
    max(Layer[[Field]]),
    max(Layer[[Field]])-min(Layer[[Field]]),
    mean(Layer[[Field]]),
    median(Layer[[Field]]),
    sd(Layer[[Field]])),
  row.names=c("Sum:","Count:","Unique values:","Minimum value:","Maximum value:","Range:","Mean value:","Median value:","Standard deviation:"))
colnames(Summary_statistics)<-c(Field)
Stat<-Summary_statistics

De derde regel specificeert het Vector Field in invoer en de vierde regel vertelt het algoritme dat de uitvoer een tabel zou moeten zijn.

De laatste regel zal het object Stat , gemaakt in het script, nemen en het naar een csv-tabel converteren.

Voorbeeld met uitvoer naar het scherm

We kunnen het voorgaande voorbeeld gebruiken en in plaats van een tabel te maken, het resultaat afdrukken in Resultaten bekijken:

##Basic statistics=group
##Layer=vector
##Field=Field Layer
Summary_statistics<-data.frame(rbind(
sum(Layer[[Field]]),
length(Layer[[Field]]),
length(unique(Layer[[Field]])),
min(Layer[[Field]]),
max(Layer[[Field]]),
max(Layer[[Field]])-min(Layer[[Field]]),
mean(Layer[[Field]]),
median(Layer[[Field]]),
sd(Layer[[Field]])),row.names=c("Sum:","Count:","Unique values:","Minimum value:","Maximum value:","Range:","Mean value:","Median value:","Standard deviation:"))
colnames(Summary_statistics)<-c(Field)
>Summary_statistics

Het script is exact hetzelfde als dat hierboven met slechts twee bewerkingen:

  1. er wordt geen uitvoer gespecificeerd (de vierde regel is verwijderd)

  2. de laatste regel begint met > wat Processing zegt om het object af te drukken in Identficatieresultaten

Voorbeeld met plot

Voor het maken van plots moet u de parameter ##output_plots_to_html gebruiken, zoals in het volgende script:

##Basic statistics=group
##Layer=vector
##Field=Field Layer
##output_plots_to_html
####output_plots_to_html
qqnorm(Layer[[Field]])
qqline(Layer[[Field]])

Het script gebruikt een veld (Field) van een vectorlaag (Layer) als invoer en maakt een QQ Plot (om de normaliteit van de verdeling te testen).

Het plot wordt automatisch toegevoegd aan Resultaten bekijken van Processing.