29.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
29.4.1. In ingresso
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
29.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.
29.4.3. Sintesi sintassi per gli script QGIS R
Sono disponibili diversi tipi di parametri per gli input e gli output.
29.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 |
field |
Field = Campo del Layer |
nome del Campo selezionato, ad esempio |
raster |
Layer = raster |
Oggetti RasterBrick, oggetto predefinito del pacchetto |
multiple raster |
Layer = raster multiplo |
Oggetti RasterBrick, oggetto predefinito del pacchetto |
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: |
extent |
E = estensione |
Estensione oggetto |
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
29.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.
29.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)
29.4.4. Esempi
29.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):
Point pattern analysis
è il gruppo dell’algoritmoLayer
è il vettore in ingressoSize
è un parametro numerico con un valore predefinito di 10Output
è il vettore che sarà creato dall’algoritmolibrary(sp)
carica la libreria spspatpoly = as(Layer, "Spatial")
trasforma in un oggetto spChiama la funzione
spsample
della libreriasp
e la esegue usando l’input definito sopra (Layer
eSize
)Crea un oggetto SpatialPointsDataFrame usando la funzione
SpatialPointsDataFrame
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.
29.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
.
29.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
.
29.4.4.4. Esempio 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:
nessun output specificato (la quarta linea è stata rimossa)
l’ultima linea inizia con
>
, specificando a Processing di rendere l’oggetto disponibile attraverso il visualizzatore di risultati
29.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.