28.4. Appendice D: Sintassi script R QGIS

Con il contributo di Matteo Ghetta - finanziato da Scuola Superiore Sant’Anna

Scrivere script R in Processing è un po” complicato a causa della sintassi speciale.

Uno script Processing R inizia definendo i suoi Input e Output, ciascuno preceduto da due caratteri hash (##).

Prima degli input, si può specificare il gruppo in cui inserire l’algoritmo. Se il gruppo esiste già, l’algoritmo verrà aggiunto ad esso, altrimenti il gruppo verrà creato. Nell’esempio qui sotto, il nome del gruppo è My group:

##My Group=group

28.4.1. Input

Tutti i dati e i parametri di input devono essere specificati. Ci sono diversi tipi di input:

  • vettore: ##Layer = vector

  • campo vettoriale: ##F = Field Layer (dove Layer è il nome di un layer vettoriale di input a cui il campo appartiene).

  • raster: ##r = raster

  • tabella: ##t = table

  • numero: ##Num = number

  • stringa: ##Str = string

  • booleano: ##Bol = boolean

  • elementi in un menu a discesa. Gli elementi devono essere separati con punto e virgola ;: ##type=selection point;lines;point+lines

28.4.2. In uscita:

Come per gli input, ogni output deve essere definito all’inizio dello script:

  • vectore: ##output= output vector

  • raster: ##output= output raster

  • tabella: ##output= output table

  • grafici: ##output_plots_to_html (##showplots nelle versioni precedenti)

  • Per visualizzare l’output di R nel Visualizzatore di risultati, metti > davanti al comando di cui vuoi vedere l’output.

28.4.3. Sintesi sintassi per gli script QGIS R

Sono disponibili diversi tipi di parametri per gli input e gli output.

28.4.3.1. Tipi di parametri di input

Parametro

Esempio sintassi

Oggetti risultanti

vector

Layer = vettore

oggetto sf (o oggetto SpatialDataFrame, se è specificato ##load_vector_using_rgdal)

vector point

Layer = vettore di punti

oggetto sf (o oggetto SpatialDataFrame, se è specificato ##load_vector_using_rgdal)

vector line

Layer = vettore di linea

oggetto sf (o oggetto SpatialDataFrame, se è specificato ##load_vector_using_rgdal)

vector polygon

Layer = vector polygon

oggetto sf (o oggetto SpatialPolygonsDataFrame, se viene usato ##load_vector_using_rgdal)

multiple vector

Layer = vettore multiplo

oggetto sf (o oggetti SpatialDataFrame se è specificato ##load_vector_using_rgdal)

table

Layer = tabella

conversione di dataframe da csv, oggetto predefinito della funzione read.csv.

field

Field = Campo del Layer

nome del Campo selezionato, ad esempio "Area".

raster

Layer = raster

Oggetti RasterBrick, oggetto predefinito del pacchetto raster.

multiple raster

Layer = raster multiplo

Oggetti RasterBrick, oggetto predefinito del pacchetto raster.

number

N = numero

numero intero o a virgola mobile scelto

string

S = stringa

stringa aggiunta nella casella

longstring

LS = stringa variabile

stringa aggiunta nella casella, può essere più lunga della stringa normale

selection

S = selezione primo;secondo;terzo

stringa dell’elemento selezionato scelto nel menu a tendina

crs

C = SR

stringa del SR risultante scelto, nel formato: "EPSG:4326"

extent

E = estensione

Estensione oggetto raster, puoi estrarre valori come E@xmin.

point

P = punto

quando si clicca sulla mappa, si hanno le coordinate del punto

file

F = file

percorso del file scelto, ad esempio «/home/matteo/file.txt»

folder

F = cartella

percorso della cartella scelta, ad esempio «/home/matteo/Downloads»

Un parametro può essere OPZIONALE, cioè può essere ignorato.

Per impostare un input come opzionale, aggiungi la stringa optional prima dell’input, ad esempio:

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

28.4.3.2. Tipi di parametri di output

Parametro

Esempio sintassi

vector

Output = output vettore

raster

Output = output raster

table

Output = output tabella

file

Output = output file

Nota

Puoi salvare i grafici come png dal Visualizzatore Risultati di Processing, oppure puoi scegliere di salvare il grafico direttamente dall’interfaccia dell’algoritmo.

28.4.3.3. Corpo dello script

Il corpo dello script usa la sintassi di R e il pannello Log può aiutarvi se c’è qualcosa di sbagliato nel vostro script.

Ricorda che devi caricare tutte le librerie aggiuntive nello script:

library(sp)

28.4.4. Esempi

28.4.4.1. Esempio con vettore in uscita

Consideriamo un algoritmo dalla libreria online che crea punti casuali dall’estensione di un layer di input:

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

Spiegazione (per linea nello script):

  1. Point pattern analysis è il gruppo dell’algoritmo

  2. Layer è il vettore in ingresso

  3. Size è un parametro numerico con un valore predefinito di 10

  4. Output è il vettore che sarà creato dall’algoritmo

  5. library(sp) carica la libreria sp

  6. spatpoly = as(Layer, "Spatial") trasforma in un oggetto sp

  7. Chiama la funzione spsample della libreria sp e la esegue usando l’input definito sopra (Layer e Size)

  8. Crea un oggetto SpatialPointsDataFrame usando la funzione SpatialPointsDataFrame

  9. Crea il vettore di output usando la funzione st_as_sf

Questo è tutto! Basta eseguire l’algoritmo con uno layer vettoriale che hai nella Legenda di QGIS, scegliere il numero di punti casuali. Il layer risultante sarà aggiunto alla tua mappa.

28.4.4.2. Esempio con raster in uscita

Il seguente script eseguirà il kriging ordinario di base per creare una mappa raster di valori interpolati da un campo specificato del layer vettoriale di punti in input usando la funzione autoKrige del software R automap. Prima calcola il modello di kriging e poi crea un raster. Il raster viene creato con la funzione raster del software raster 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

Usando ##load_vector_using_rgdal, il layer vettoriale di input sarà reso disponibile come un oggetto SpatialDataFrame, così evitiamo di doverlo tradurre da un oggetto sf.

28.4.4.3. Esempio con tabella in uscita

Modifichiamo l’algoritmo Summary Statistics in modo che l’output sia un file tabella (csv).

Il corpo dello script è il seguente:

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

La terza linea specifica il Vector Field in ingresso e la quarta linea dice all’algoritmo che l’output sarà una tabella.

L’ultima linea utilizzerà l’oggetto Stat creato nello script e lo convertirà in una tabella csv.

28.4.4.4. Esempi con la console di output

Possiamo usare l’esempio precedente e invece di creare una tabella, stampare il risultato nel Visualizzatore di risultati:

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

Lo script è esattamente lo stesso di quello sopra, tranne che per due modifiche:

  1. nessun output specificato (la quarta linea è stata rimossa)

  2. l’ultima linea inizia con >, specificando a Processing di rendere l’oggetto disponibile attraverso il visualizzatore di risultati

28.4.4.5. Esempio con grafico

Per creare grafici, devi usare il parametro ##output_plots_to_html come nel seguente script:

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

Lo script usa un campo (Field) di un layer vettoriale (Layer) come input, e crea un QQ Plot (per testare la normalità della distribuzione).

Il grafico viene aggiunto automaticamente al Visualizzatore risultato di Processing.