グラフィカルモデラーの勧め

# 1.はじめに
QGISのグラフィカルモデラーは数回作成したことがある程度ですが、とても便利なツールだと思います。
Advent Calender の時季を迎えて何を書こうか迷っていましたが、[前回記事](https://qiita.com/fukuoka1960/items/f6f47cd7e38188f8ca22)で触れた国土基本図図郭をグラフィカルモデラーで作成し、それをネタにして記事にすることを思いつきました。

ちなみに「3.グラフィカルモデラーの構築」でも述べていますが、記事作成の下調べをしていた時に国土基本図図郭と地域メッシュを生成するQGIS用のプラグインが公開されていることに気づきました。試してみましたが、使い勝手はとても良いと思います。
プラグインは[こちらで公開（Qgis3用 国土基本図図郭, 地域メッシュ生成プラグイン）](https://epoppo.github.io/JapanBasemap/)されています。

なおこの記事で作るグラフィカルモデラーは、プラグインでは対象となっていなかったLevel1250の国土基本図図郭を作成することができます。Level1250の図郭を使う機会の多い方には、この記事をお読み頂けるとうれしいです。また、記事で作成したグラフィカルモデラーは、[こちらからダウンロード](https://drive.google.com/file/d/1GC0L_wtFIWAL5_bLEgRDojeDAdoBaCbF/view?usp=sharing)できます。
ダウンロードしたファイルは、プロセッシングツールボックス上部左端のアイコンから「ツールボックスにモデルを追加」で取り込むことができます。
![fig00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/5177f245-faf0-0e37-f4c2-58e2f70aef57.png)
# 2.グラフィカルモデラーとは
グラフィカルモデラーは、複雑な工程を1つのアルゴリズムとして構築するために用意されたツールで、入力データに対して複数な処理をする仕組みをノーコード、あるいはローコードで作り上げることができるという優れものです。
既存で用意されたツールをブロックのように組み合わせることで、プログラミングに精通していない人でも、比較的容易に組み上げることができます。
また、モデルをPythonスクリプトで出力する機能も備えていますので、Pythonの学習などにも役立つかもしれません。
## 2-1 モデルデザイナーの立ち上げ
グラフィカルモデラーは、モデルデザイナーを使って作成を行います。
モデルデザイナーは、メニューの「プロセッシング － グラフィカルモデラー」若しくはプロセッシングツールボックス上部左端のアイコンから「モデルを新規作成」をクリックして立ち上げます。
![fig01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/69035151-51cd-61df-57a2-85967df32b7c.png)
また、既存のグラフィカルモデルを右クリックして表示されたメニューから「モデルを編集」を選ぶと、登録済みのグラフィカルモデラーをモデルデザイナーで開いて編集することができます。
## 2-2 モデルデザイナーの画面
上部に①メニューと②ツールバー、左に③パネル類、右に④モデル編集枠が配置されています。
![fig02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/d772a1fd-9c4d-acdb-41be-8c655dc8deb3.png)
### 2-2-1 メニュー
「モデル」にはファイル操作関連、「編集」にはモデル編集枠内での操作関連、「ビュー」には拡大・縮小等の表示操作関連の項目が登録されています。
### 2-2-2 ツールバー
ツールバーには、メニュー項目の中から良く使うものと矢印マークの「Undo」、「Do」のアイコンが登録されています。
通常は、メニューを開かずにツールバーのみで操作を行うことが可能かと思います。
### 2-2-3 パネル類
上部に「入力・アルゴリズム」パネル、下部に「変数・モデルのプロパティ」パネルが配置されています。どちらもパネルの下にタブがあり、これで「入力とアルゴリズム」や「変数とモデルのプロパティ」を切り替えて使います。

「入力」パネルには、ファイル、レイヤ、地物、設定など、アルゴリズムに入力する項目が用意されています。ダブルクリックあるいはドラッグ＆ドロップでモデル編集枠に配置することができます。

「アルゴリズム」パネルには、プロセッシングツールボックスにあるアルゴリズムが用意されています。こちらもダブルクリックあるいはドラッグ＆ドロップでモデル編集枠に配置することができます。

「変数」パネルでは、グラフィカルモデラー内での変数と値を設定できますが、この機能はまだ使ったことはありません。変数を有効に使う機会に恵まれたときには、改めて記事を書きたいと思います。

「モデルのプロパティ」には、「名前」と「グループ」を入力します。
「名前」の入力は必須で、これがモデル名となります。「グループ」にグループ名を入力するとグループ毎にモデルが仕分けされます。こちらの入力は必須では無く、モデル数が多くなってきてから入力すると良いと思います。
### 2-2-4 新機能（残念仕様？）
久しぶりに触ってみたら、「モデルをプロジェクトに保存」という見慣れないアイコンがありました。
下図右端のアイコンです。どうやら3.24から追加された機能のようです。
![fig03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/8a1f3558-0a1b-dbdd-a0f7-190b5485432b.png)
これが何かを確かめてみたところ、メニューの「プロジェクト － モデル」にグラフィカルモデラーが登録されました。プロジェクトのメニューにモデルという項目が増えていたことには気がついていましたが用途がわからず、ようやく謎が解けました。
![fig04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/e674ed4c-1013-9dcd-3995-31f1a150bbdf.png)
ただ何らかの意図や理由はあるとは思いますが、この登録はプロジェクト毎になっていて、新規にQGISを立ち上げると登録が消えます。消えずに残っていればプラグインの代用として活用しやすくなると感じたので、ちょっと残念に思いました。
# 3.グラフィカルモデラーの構築
前回投稿の「国土基本図図郭の作成」を題材に、グラフィカルモデラーを作成します。
基本的には手作業をアルゴリズムに置き換え、1つ1つブロックを組み合わせるような作業になります。グラフィカルモデラーは非プログラマーでも容易に自動作業を組めるように設計されたものですので、一度お試しくだされば、容易に習得することができると思います。
作業はQGIS3.28で行っています。

国土基本図図郭と地域メッシュを作成してくれるQGIS3用のプラグインが、現在、公開されています。インストールして試してみましたが、使い勝手を良く感じました。
国土基本図図郭や地域メッシュを使う機会のある方には、お勧めのプラグインだと思います。ご関心のある方は、[こちら](https://epoppo.github.io/JapanBasemap/)をご覧ください。
とても良いプラグインなのですが、Level1250についてはマイナーなため作成対象から漏れているようです。
## 3-1 入力の配置
「入力」パネルから「座標参照系（CRS）」と「文字列（String）」を配置します。
「座標参照系（CRS）」は地物を作成するときに必須で、適用地域によって切り替える必要があるパラメータですので用意する必要があります。
「文字列（String）」は、グリッドの作成範囲を規定するためのものになります。この作成範囲は「-160000,160000,-300000,300000」で一定ですが、これを「グリッドを作成」の設定内に書き込むとプロジェクトのCRSで適用されます。一方、文字列の入力値とした場合を試したところ、入力の「座標参照系（CRS）」で適用される仕様となっていました。そのことから「文字列（String）」を配置することとしました。

それでは「入力」パネルから「座標参照系（CRS）」を配置します。
![fig05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/6ed045e8-d367-762a-1651-094e6ac2bca6.png)
「説明」欄に入力する文字が表示されますので、モデル編集枠内に表示されるパーツが何かを一目でわかるようにしてください。
デフォルト値は私の居住地が秋田県ですので、一番使う機会の多い「JGD2011 平面直角座標 10系」を指定しています。ここは、使い勝手の良いように設定してください。
QGISを使い始めて間もない方のためにJGD2011 平面直角座標とEPSGコードの一覧表を示しておきます。EPSGコードでフィルタリングすると、目的のCRSを見つけやすいと思います。
|座標参照系（CRS）|EPSGコード|
|:---------------------------------------:|:----------:|
|JGD2011 / Japan Plane Rectangular CS I |6669|
|JGD2011 / Japan Plane Rectangular CS II |6670|
|JGD2011 / Japan Plane Rectangular CS III |6671|
|JGD2011 / Japan Plane Rectangular CS IV |6672|
|JGD2011 / Japan Plane Rectangular CS V |6673|
|JGD2011 / Japan Plane Rectangular CS VI |6674|
|JGD2011 / Japan Plane Rectangular CS VII |6675|
|JGD2011 / Japan Plane Rectangular CS VIII |6676|
|JGD2011 / Japan Plane Rectangular CS IX |6677|
|JGD2011 / Japan Plane Rectangular CS X |6678|
|JGD2011 / Japan Plane Rectangular CS XI |6679|
|JGD2011 / Japan Plane Rectangular CS XII |6680|
|JGD2011 / Japan Plane Rectangular CS XIII |6681|
|JGD2011 / Japan Plane Rectangular CS XIV |6682|
|JGD2011 / Japan Plane Rectangular CS XV |6683|
|JGD2011 / Japan Plane Rectangular CS XVI |6684|
|JGD2011 / Japan Plane Rectangular CS XVII |6685|
|JGD2011 / Japan Plane Rectangular CS XVIII |6686|
|JGD2011 / Japan Plane Rectangular CS XIX |6687|

「入力」パネルから「文字列（String）」を配置します。
![fig06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/1bfb2e16-04a0-aaff-ded9-890e2d9cbdff.png)
先ほどと同様に「説明」にはわかりやすい説明、デフォルト値にはグリッドの作成範囲である「-160000､160000,-300000､300000」を入力します。
## 3-2 アルゴリズムの配置
### 3-2-1 Level50000図郭のアルゴリズム
「アルゴリズム」パネルの「ベクタ作成」から「グリッドを作成」を配置します。
![fig07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/db3cf065-c509-d9c2-2dd8-854831b1110d.png)
「Description」は「説明」が未翻訳になっているだけなので、わかりやすい説明を入力します。
「グリッドタイプ」以下の入力項目の左端のアイコンは、パラメータのタイプを設定するものです。

|アイコン|パラメータのタイプ|説　　　　明|
|:--:|:--------:|:------------:|
|![icon01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/5434a130-3565-bc5e-afb1-849149de9bd1.png)|値（Value）|値選択または値入力|
|![icon02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/950abf02-98d1-754c-9c1c-b5f73218e251.png)|事前計算済値|式ダイアログの計算による計算値|
|![icon03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/75de6fc8-91a0-1340-d8c6-5f3e49bdee26.png)|モデル入力|モデルに配置した入力からの値|
|![icon04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/85c99b68-1854-d177-a6fd-3debc3820768.png)|アルゴリズム出力|モデルに配置したアルゴリズムからの出力値|

「グリッドタイプ」は「値（Value）」で、「長方形（plygon）」を選択します。
「グリッドの範囲」は「モデル入力」で「範囲」を選択します。
「水平方向の間隔」と「垂直方向の間隔」は「値（Value）」で、それぞれ「40000」と「30000」を入力します。
「出力グリッドのCRS」は「モデル入力」で「座標参照系（CRS）」を選択します。
以上を設定して「OK」ボタンをクリックします。

「アルゴリズム」パネルの「ベクタテーブル」から「フィールド計算機」を配置します。
![fig08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/061f7d73-2ed9-dc22-5b5f-d108639ff20a.png)
「Description」には、わかりやすい説明を入力します。フィールド計算機など複数回使うアルゴリズムは、以後の作業で「アルゴリズムからの出力値」で適切に選択するために、見分けがつくような表現にするのが良いと思います。

「属性名」は、計算結果を出力するフィールド名になります。基本的に任意のもので構いませんが後の作業に影響しますので、この記事を参考にお試しになる場合は「値（Value）」で「code50000」としてください（以下でフィールド計算機を使う場合も同様の作業となります）。

「入力レイヤ」には、「アルゴリズム出力」で「アルゴリズム"Level50000グリッドを作成"の"グリッド"」を選択します。
「フィールド型」には、「値（Value）」で「テキスト（string）」を選択してください。
「フィールド長」には、「値（Value）」で適切な数値を入力します。作業例では「6」としていますが、「2」以上の数値であれば大丈夫です。

計算式には、次の式を入力します。
```
char( abs( "top" - 300000) / 30000 + 65 ) || char(( "left" + 160000) / 40000 + 65 )
```
式の意味は、以前の記事「[国土基本図図郭の作成](https://qiita.com/fukuoka1960/items/f6f47cd7e38188f8ca22)」をご覧ください。
「出力レイヤ」が未入力ですと、QGIへのレイヤとして出力されません。出力が不要な場合は、未入力で構いません。
作業例では「Level_50000」と入力しています。

以上の結果使って、次の「Level5000図郭のアルゴリズム」では「属性の空間結合」を行いますが、「空間インデックス」が無いと作業時間が非常に要することがあります。そこで、「空間インデックス」を作成しておきます。
「アルゴリズム」パネルの「ベクタ一般」から「空間インデックス」を配置します。
![fig09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/8c2ecb38-ef7d-1412-8f4d-17c8c6162213.png)
「Description」には、わかりやすい説明を入力します。
「入力レイヤ」には、「アルゴリズム出力」で「アルゴリズム"Level50000のcodeを計算"の"出力レイヤ"」を選択します。

### 3-2-2 Level5000図郭のアルゴリズム
以下は同様の作業の繰り返しになる部分が多くなりますので、類似作業は画像掲載のみとします。

「アルゴリズム」パネルの「ベクタ作成」から「グリッドを作成」を配置します。
![fig10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/4ee15fde-35e3-e9a7-43d4-4b6d7ac1e0a3.png)

次に「属性の空間結合」を行いますので、「空間インデックス」を作成します。
「アルゴリズム」パネルの「ベクタ一般」から「空間インデックス」を配置します。
![fig11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/df182d82-cb18-b67f-f1c2-5da64adf9f05.png)

「Level_50000」から「code50000」の値を取得します。
「アルゴリズム」パネルの「ベクタ一般」から「属性の空間結合」を配置します。
![fig12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/b9e03626-24ad-78ee-2ea6-16eba96dc8f4.png)
「地物を結合するレイヤ」には結合先の「アルゴリズム"空間インデックス（Level50000の空間インデックスを作成"の"インデックス作成済み"、「比較対象」には結合対象の「アルゴリズム"空間インデックス（Level50000code計算後"の"インデックス作成済み"を選択します。
「統合型」は、接するだけの地物が対象となるのを避けるため、「もっとも重なる地物の属性のみ（1対1）」を選択します。

「アルゴリズム」パネルの「ベクタテーブル」から「フィールド計算機」を配置します。
![fig13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/18fdfa8f-de74-9fc9-3dc6-942230a18ad2.png)
計算式は次のとおりです。
```
"code50000" || to_string(( abs(( "top" - 300000 )/ 3000 ))% 10) || to_string((("left" + 160000)/ 4000) % 10)
```
「アルゴリズム」パネルの「ベクタ一般」から「空間インデックス」を配置します。
![fig14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/1ddbab68-7682-5377-e402-c593c631603f.png)
### 3-2-3 Level2500図郭のアルゴリズム
「アルゴリズム」パネルの「ベクタ作成」から「グリッドを作成」を配置します。
![fig15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/ec559082-b4bb-b744-f68c-e0246db8a4c8.png)
「アルゴリズム」パネルの「ベクタ一般」から「空間インデックス」を配置します。
![fig16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/57bb44d9-eff2-fe84-324d-a49b15e682c6.png)
「アルゴリズム」パネルの「ベクタ一般」から「属性の空間結合」を配置します。
![fig17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/c680756c-6f73-6d90-e79a-9b69a0ae2537.png)
「アルゴリズム」パネルの「ベクタテーブル」から「フィールド計算機」を配置します。
![fig18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/c4f1dfe8-eb1e-5b79-2f03-37bc5ffc4ebe.png)
計算式は、次のとおりです。
```"
code5000" || to_string( ((abs(( "top" - 300000 )/ 1500 ))% 2)* 2 +(("left" + 160000)/ 2000) % 2 + 1)
```
「アルゴリズム」パネルの「ベクタ一般」から「空間インデックス」を配置します。
![fig19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/5bd0b036-d4dc-dd50-c81b-7a0966d5cba4.png)
### 3-2-4 Level1250図郭のアルゴリズム
土砂災害の基礎調査などでは、Level2500を4分割した単位で整理されたファイルで成果が作成されています。国土交通省や国土地理院の資料から、この図郭単位についてみつけることができなかったのですが、前までの流れを継承してLevel1250とこの記事では呼ぶこととします。
この図郭コードは、ハザードマップ作成時にオルソ画像などの不足箇所をクライアントに伝えるために頻繁に使っていました。自分のため追加したものですが、類似業務に携わっている方にはお役立てるかと思います。
なお図郭数が増える関係で、この図郭を加えると「属性の空間結合」に処理時間が長くなります。この機能が不要な方は、以下のアルゴリズムをあえて追加する必要はありません。

「アルゴリズム」パネルの「ベクタ作成」から「グリッドを作成」を配置します。
![fig20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/8f17bc81-9b56-0d8f-8979-eb25bc4af42b.png)
「アルゴリズム」パネルの「ベクタ一般」から「空間インデックス」を配置します。
![fig21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/59e86cdb-693b-87dc-51fd-55138164218f.png)
「アルゴリズム」パネルの「ベクタ一般」から「属性の空間結合」を配置します。
![fig22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/c93879c2-12d8-ece4-f3ba-8d257f8c9b6e.png)
「アルゴリズム」パネルの「ベクタテーブル」から「フィールド計算機」を配置します。
![fig23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/5965268e-3bf2-e516-fdfd-d07016f89459.png)
入力式は次のとおりです。
```
"code2500" || to_string( ((abs(( "top" - 300000 )/ 750 ))% 2)* 2 +(("left" + 160000)/ 1000) % 2 + 1)
```
## 3-3 仕上がり
作業終了後のモデルデザイナーの画面を掲載します。
![fig24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/796d0a65-1836-5c28-4383-d6e086c16c73.png)
# 4.カスタマイズについて
記事を参考に自作なさる場合は問題ありませんが、グラフィカルモデラーをダウンロードして使用なさる場合は、カスタマイズすると使いやすくなると思います。
QGISへ登録した後であれば、プロセッシングツールボックスの一番下に「モデル」というカテゴリーが尽かされます。登録されたグラフィカルモデラーの上で右クリックして「編集」を選ぶと、モデルデザイナーで開いて編集することができます。
## 4-1 参照座標系（CRS）のカスタマイズ
使用する「参照座標系（CRS）」は、私が居住する秋田県に合わせて「JGD2011 / Japan Plane Rectangular CS X （EPSG:6678）」としています。ここは最もお使いになられる「参照座標系（CRS）」へ変更してください。
## 4-2 出力レイヤのカスタマイズ
不要なレベルは出力後にレイヤパネルから削除することを想定していますが、最初から出力させたくない場合は、「フィールド計算機」の「出力レイヤ」を空欄にしてください。
## 4-3 必要とする図郭に関するカスタマイズ
Level1250のアルゴリズムは最も時間の掛かる処理です。この図郭が不要な方は、削除すると処理がとても早くなります。
# 5.さいごに
動作ですが「属性の空間結合」を使っている関係で、少し遅くなっています。進捗バーの進みが90%位から遅くなり、全体でおおよそ1～2分程度を要すると思います。
また正式はコードの頭に軽番号が付くのですが、省略しています。必要な場合は、フィールド計算機で付加すれば良いだけなので手間では無いと思いますが、自動で付加できたら改善したいと思います。
# 6.追記
【2022年12月7日追記】
MIERUNEさんがYoutubeで「[グラフィックモデラーで処理を自動化してみよう / QGISオンラインセミナー](https://www.youtube.com/watch?v=OixKyCu8tq4)」という動画を12月5日に公開していました。
動画で見る方が文章を読むよりわかりやすいと思いますので、はじめてグラフィカルモデラーに触れる方などは、是非ともご覧になってください。