付録D:QGIS Rスクリプト構文

Contributed by Matteo Ghetta - funded by Scuola Superiore Sant'Anna

Writing R scripts in Processing is a bit tricky because of the special syntax.

A Processing R script starts with defining its Inputs and Outputs, each preceded with double hash characters (##).

入力の前に、アルゴリズムを配置するグループを指定できます。グループがすでに存在する場合はそこにアルゴリズムが追加されます。存在しない場合は、グループが作成されます。以下の例では、グループの名前は My group です:

##My Group=group

入力

All input data and parameters have to be specified. There are several types of inputs:

  • vector: ##Layer = vector

  • vector field: ##F = Field Layer (where Layer is the name of an input vector layer the field belongs to)

  • raster: ##r = raster

  • table: ##t = table

  • number: ##Num = number

  • string: ##Str = string

  • boolean: ##Bol = boolean

  • elements in a dropdown menu. The items must be separated with semicolons ;: ##type=selection point;lines;point+lines

出力

入力のように、各出力は、スクリプトの先頭で定義する必要があります。

  • vector: ##output= output vector

  • raster: ##output= output raster

  • table: ##output= output table

  • plots: ##output_plots_to_html (##showplots in earlier versions)

  • To show R output in the Result Viewer, put > in front of the command whose output you would like to show.

Syntax Summary for QGIS R scripts

A number of input and output parameter types are offered.

Input parameter types

パラメーター

構文の例

返すオブジェクト

vector

Layer = vector

sf object (or SpatialDataFrame object, if ##load_vector_using_rgdal is specified)

vector point

Layer = vector point

sf object (or SpatialDataFrame object, if ##load_vector_using_rgdal is specified)

vector line

Layer = vector line

sf object (or SpatialDataFrame object, if ##load_vector_using_rgdal is specified)

vector polygon

Layer = vector polygon

sf object (or SpatialPolygonsDataFrame object, if ##load_vector_using_rgdal is used)

multiple vector

Layer = multiple vector

sf object (or SpatialDataFrame objects if ##load_vector_using_rgdal is specified)

Layer = table

csvからのデータフレーム変換、 read.csv 関数のデフォルトオブジェクト

field

Field = Field Layer

選択されたフィールドの名前、例えば "Area"

raster

Layer = raster

RasterBrickオブジェクト、 raster パッケージのデフォルトオブジェクト

multiple raster

Layer = multiple raster

RasterBrickオブジェクト、 raster パッケージのデフォルトオブジェクト

number

N = number

選択された整数または浮動小数点数

string

S = string

ボックスに追加された文字列

longstring

LS = longstring

文字列がボックスに追加され、通常の文字列より長くなる可能性があります

selection

S = selection first;second;third

ドロップダウンメニューで選択した選択項目の文字列

crs

C = crs

string of the resulting CRS chosen, in the format: "EPSG:4326"

extent

E = extent

raster パッケージの範囲オブジェクトでは、値を E@xmin として抽出できます

point

P = point

地図をクリックすると点の座標が得られます

file

F = file

選択されたファイルのパス、例えば「/home/matteo/file.txt」

folder

F = folder

選択されたフォルダのパス、例えば「/home/matteo/Downloads」

A parameter can be OPTIONAL, meaning that it can be ignored.

In order to set an input as optional, you add the string optional before the input, e.g:

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

Output parameter types

パラメーター

構文の例

vector

Output = output vector

raster

Output = output raster

Output = output table

file

Output = output file

注釈

You can save plots as png from the Processing Result Viewer, or you can choose to save the plot directly from the algorithm interface.

スクリプト本体

The script body follows R syntax and the Log panel can help you if there is something wrong with your script.

Remember that you have to load all additional libraries in the script:

library(sp)

ベクター出力の例

入力レイヤーの範囲からランダムな点を作成するオンラインコレクションからのアルゴリズムを見てみましょう:

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

Explanation (per line in the script):

  1. ポイントパターン分析 は、アルゴリズムのグループ

  2. Layer は入力 ベクター レイヤー

  3. Size is a numerical parameter with a default value of 10

  4. Output はアルゴリズムによって作成される ベクター レイヤー、

  5. library(sp) loads the sp library

  6. spatpoly = as(Layer, "Spatial") translate to an sp object

  7. Call the spsample function of the sp library and run it using the input defined above (Layer and Size)

  8. Create a SpatialPointsDataFrame object using the SpatialPointsDataFrame function

  9. Create the output vector layer using the st_as_sf function

That's it! Just run the algorithm with a vector layer you have in the QGIS Legend, choose the number of random point. The resulting layer will be added to your map.

ラスター出力の例

次のスクリプトでは、「automap」Rパッケージの「autoKrige」関数を使用して入力ポイントベクタレイヤの指定されたフィールドから補間値のラスタマップを作成するために、基本的な通常のクリギングを実行します。最初にクリギングモデルを計算し、次にラスタを作成します。ラスターはラスタRパッケージの raster 関数で作成されます:

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

By using ##load_vector_using_rgdal, the input vector layer will be made available as a SpatialDataFrame objects, so we avoid having to translate it from an sf object.

テーブル出力の例

出力がテーブルファイル(CSV)になるように 要約統計 アルゴリズムを編集してみましょう。

スクリプトの本文は以下の通りです:

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

3行目は入力に ベクターフィールド を指定し、4行目は出力テーブルであるべきであるアルゴリズムを伝えます。

最後の行は、スクリプトで作成された Stat オブジェクトを取得し、 csv テーブルに変換します。

コンソール出力の例

We can use the previous example and instead of creating a table, print the result in the Result Viewer:

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

The script is exactly the same as the one above except for two edits:

  1. no output specified (the fourth line has been removed)

  2. the last line begins with >, telling Processing to make the object available through the result viewer

プロットと例

To create plots, you have to use the ##output_plots_to_html parameter as in the following script:

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

The script uses a field (Field) of a vector layer (Layer) as input, and creates a QQ Plot (to test the normality of the distribution).

The plot is automatically added to the Processing Result Viewer.