R on Q

FOSS4G Advent Calendar 2022 14日目。 QGIS の Processing R Provider プラグインのご紹介です。

:::note warn
すみません。
この記事は書きかけです。
:::


# R （R 言語）とは

R とは統計解析用の言語です。一見するとググラビリティの低い名前の言語ですが、アルファベット1文字はかえって他の影響が少ないのか、 Google 検索であれば特に問題なく R 言語と認識してくれます。

R では、平均などをとるために使われる数値の一次元配列（ベクトル）はもちろん、複数の情報を管理できる表形式のデータフレームなどのデータ構造を利用することができます。また（ GIS 系のライブラリを使うことで）データフレームの中に位置情報も含めることができるため、 GIS データも取り扱うこともできます。

高度な統計分析用途でももちろん有用ですが、 GIS データに対して、属性や空間関係で結合したりや集計するなども容易に行うことができます。このへんの処理は QGIS でも可能ですが、 R も結構得意です。

# Processing R Provider

とはいえ、入力や中間出力されたデータの内容を地図上で確認しながら処理方針を定めていったり、既存の GIS 機能と組み合わせたいなどで QGIS を使いたいケースは往々にしてあるでしょう。

Processing R Provider プラグインは、 R で記述した処理を、 QGIS のプロセシングツールの処理メニューの中に簡便に追加することができるプラグインです。追加した処理は通常のプロセシングメニューとしてやグラフィカルモデラーで利用することができます。

プラグイン作者は North Road 社で、メンテナは QGIS のコア開発にも携わっている Nyall Dawson 氏です。

https://plugins.qgis.org/plugins/processing_r/

## インストール

### R のインストール

Processing R Provider でスクリプトを動かすエンジンとして R 本体が必要となります。下記より R をダウンロードしてインストールしてください。

#### Windows

https://cran.r-project.org/bin/windows/base/

#### MacOS

https://cran.r-project.org/bin/macosx/

### プラグインのインストール

プラグインのインストールは、いつものとおり QGIS の「プラグインの管理とインストール」から `Processing R Provider` を探してインストールすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215290/7fb9678c-eb93-7d96-050e-6f7cfcc82e33.png)

ここでプロセシングツールボックスが次のような表示になっていれば成功です。上部の R アイコンが表示されない場合は、 QGIS を再起動することで表示されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215290/42574c74-5d5f-60f8-7fe6-464580aae851.png)

### プラグインの環境設定

次に QGIS 側で R の設定を行う必要があります。

[設定] → [オプション] → [プロセシング] → [プロバイダ] → [R] より `R folder` と `Use 64 bit Version` を適切な値にします。 Windows の場合、 `R folder` は通常 `C:\Program Files\R\R-x.y.z` など、 bin フォルダなどの親フォルダを指定します。

なお R 自身の 32 bit のサポートは R 4.1.x までなので、いま新たに R をインストールした人は 64 bit 版しかインストールされていないはずです。ですので `Use 64 bit Version` にチェックをつけるようにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215290/67b21b87-125f-d91b-bcf8-39e76e7af2e2.png)

# 使い方

## 使ってみる

数値型の属性をもつベクタデータを用意して、プロセシングツールボックスにある [R] → [Example Scripts] → [Min_Max] を起動してみます。

ここで次のようなダイアログがでたら環境設定が間違えている可能性があります。 :-(

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215290/7b3aaa07-1507-57d5-78d3-9182727915a5.png)

起動できると次のようなプロセシングツールでよくあるウィンドウが表示されます。このサンプルは対象のレイヤの、特定の属性について最小値と最大値を求めるツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215290/37a616d9-8dcc-1bde-700e-811efce51e71.png)

### 必要なライブラリのインストール

初回起動時には R で GIS データを扱うために必要なライブラリをインストールするため、時間がかかります。手元で新しい環境を作って試してみると10分くらいかかりました。

## スクリプトの書式

先ほどの処理の元となったスクリプトが以下となります。

```
##Example scripts=group
##Min_Max=name
##Layer=vector
##Field=Field Layer
##Min=output number
##Max=output number
##Summary=output string

Min <- min(Layer[[Field]])
Max <- max(Layer[[Field]])
Summary <- paste(Min, "to", Max, sep = " ")
```

`##` からはじまる行はメタデータや入出力の内容を宣言するもので、それ以降が本処理です。 Processing R Provider を使うと、宣言に応じて自動的にプロセシングツール用のダイアログで起動してくれます。

Python 用のプロセシングツール用のインタフェースなどは用意されており、 Python でも新たにメニューを追加することができます。ただ、そのために必要な記述は若干面倒です。

https://qiita.com/tohka383/items/f8e3c91c32184aef3d7a

### 基本文法

文法は、以下のとおり左辺に変数名、右辺にそのタイプを記載します。

```
variable_name=variable_type [default_value/from_variable]
```

### メタデータ

```
##Example scripts=group
##Min_Max=name
```

上記は `Example scripts` というグループ（フォルダ）内の `Min_Max` という名前のツールであることを宣言しています。

### 入力

```
##Layer=vector
```

`Layer` という名前で、ベクタ形式の入力レイヤを使用することを宣言しています。

```
##Field=Field Layer
```

`Field` という名前で、先ほど選択した `Layer` レイヤの属性を使用することを宣言しています。

### 出力

```
##Min=output number
##Max=output number
##Summary=output string
```

右辺に `output` キーワードがあるため、これらは出力として返される変数であることを意味しています。今回のサンプルはそれぞれ `number` や `string` だったためプロセシングツールのログ欄に文字として出力されます。

もちろん出力結果をレイヤ形式で指定することもできます。

### その他

そのほか、

https://north-road.github.io/qgis-processing-r/script-syntax/

# サンプル

プロセシングツールの理念的には、処理の単位は細かく用意し、組み合わせて目的を達成する方が正義だとは思いますが、ここでは目的を達する処理をひとまとめにしたスクリプトを書いてみます。

## 最頻（ KDE ）

- ポリゴンレイヤ A
  - 種別を表す `Type` 属性
- 点レイヤ B
  - 種別を表す `Type` 属性
  - 数値形式の `Value` 属性

上記のようなふたつのレイヤがあったとき、ポリゴン A の内部に存在する点 B の集計を行う。ただし、種別 `Type` が一致するものを集計の対象とし、集計方法は最頻とする。

といった処理を行いたいとします。

QGIS のプロセシングツールでやるとしたら、条件で集計対象を指定するためにまず「属性でレイヤ分割」で分割したのち、分割された属性ごとにそれぞれを「空間結合（集計つき）」し、「ベクタレイヤのマージ」でまとめるとかでしょうか？　属性の取り得る値が固定されていればまだいいですが、不定であれば難しそうです。



:::note warn
すみません。
今週末には仕上げたいと思います。
:::