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

Matteo Ghettaの寄稿 - Scuola Superiore Sant'Anna による資金提供

プロセシングでRスクリプトを書くのは、特殊な構文のため、少しコツがいります。

プロセシングのRスクリプトは、まず 入力出力 を定義し、それぞれの前に二重のハッシュ文字(##)を付けます。

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

##My Group=group

31.4.1. 入力

すべての入力データとパラメータは指定する必要があります。入力は何種類かあります:

  • ベクタ: ##Layer = vector

  • ベクタのフィールド: ##F = Field Layer (ここで Layer はフィールドが属する入力ベクタレイヤの名前です)

  • ラスタ: ##r = raster

  • 表: ##t = table

  • 数値: ##Num = number

  • 文字列: ##Str = string

  • ブール値: ##Bol = boolean

  • ドロップダウンメニューの要素。項目はセミコロン ; で区切らなければなりません: ##type=selection point;lines;point+lines

31.4.2. 出力

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

  • ベクタ: ##output= output vector

  • ラスタ: ##output= output raster

  • 表: ##output= output table

  • プロット: ##output_plots_to_html (以前の版では##showplots)

  • R の出力を 結果ビューアー に表示するには、出力を表示したいコマンドの前に > を置きます。

31.4.3. QGIS Rスクリプトの構文の概要

たくさんの入出力パラメータ型が用意されています。

31.4.3.1. 入力パラメータの型

パラメータ

構文の例

返すオブジェクト

vector

Layer = vector

sfオブジェクト(または、##load_vector_using_rgdalが指定されたときはSpatialDataFrameオブジェクト)

vector point

Layer = vector point

sfオブジェクト(または、##load_vector_using_rgdalが指定されたときはSpatialDataFrameオブジェクト)

vector line

Layer = vector line

sfオブジェクト(または、##load_vector_using_rgdalが指定されたときはSpatialDataFrameオブジェクト)

vector polygon

Layer = vector polygon

sfオブジェクト(または、##load_vector_using_rgdalが指定されたときはSpatialPolygonsDataFrameオブジェクト)

multiple vector

Layer = multiple vector

sfオブジェクト(または、##load_vector_using_rgdalが指定されたときはSpatialDataFrameオブジェクト)

table

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

結果として選ばれたCRSの文字列。形式は "EPSG:4326"

extent

E = extent

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

point

P = point

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

file

F = file

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

folder

F = folder

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

パラメータは OPTIONAL つまり、無視できるようにできます。

入力をオプションとして設定するためには、その入力の に文字列 optional を追加します、例えば:

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

31.4.3.2. 出力パラメータの種類

パラメータ

構文の例

vector

Output = output vector

raster

Output = output raster

table

Output = output table

file

Output = output file

注釈

プロセシング結果ビューア からプロットを png として保存することも、アルゴリズムインターフェースから直接プロットを保存することもできます。

31.4.3.3. スクリプト本体

スクリプト本体はR構文に従い、 Log パネルはスクリプトに問題がある場合に役立ちます。

スクリプトですべての追加ライブラリを読み込む必要があることを 覚えてください:

library(sp)

31.4.4.

31.4.4.1. ベクタ出力の例

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

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

説明(スクリプトの行ごと):

  1. Point pattern analysis(ポイントパターン分析) はアルゴリズムのグループ

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

  3. Size は、numerical(数値) パラメタであり、デフォルト値は10

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

  5. library(sp) は、sp ライブラリを読み込む

  6. spatpoly = as(Layer, "Spatial") は、spオブジェクトに翻訳する

  7. sp ライブラリの spsample 関数を呼び出し、上で定義した入力(LayerSize)を使って実行する

  8. SpatialPointsDataFrame 関数を使って SpatialPointsDataFrame オブジェクトを生成する

  9. st_as_sf 関数を使って出力ベクタレイヤを生成する

それでおしまい!あとはQGIS凡例中にあるベクタレイヤでアルゴリズムを実行し、ランダムなポイントの数を選択するだけです。結果のレイヤが地図に追加されます。

31.4.4.2. ラスター出力の例

次のスクリプトでは、「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

##load_vector_using_rgdal を使うと、入力ベクタレイヤは SpatialDataFrame オブジェクトとして使用できるようになり、sf オブジェクトから変換する必要がなくなります。

31.4.4.3. テーブル出力の例

出力がテーブルファイル(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 テーブルに変換します。

31.4.4.4. コンソール出力の例

前の例を使用して、テーブルを作成する代わりに、 結果ビューア で結果を印刷できます:

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

スクリプトは、2つの編集を除いて、上のものとまったく同じです:

  1. 出力は指定されていません(4行目は取り除かれています)

  2. 最後の行は > で始まるので、プロセシングに結果ビューアからオブジェクトを利用できるようにするよう指示しています

31.4.4.5. プロットと例

プロットを作成するには、次のスクリプトのように ##output_plots_to_html パラメータを使用する必要があります:

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

このスクリプトは、ベクタレイヤ(Layer)のフィールド(Field)を入力として使用し、*QQプロット*(分布の正規性をテストする)を作成します。

プロットは自動的にプロセシング 結果ビューア に追加されます。