先日QGISのグラフィカルモデラーを使って便利だったのでGISではなくてCSVのデータの場合でも使えるか試してみました。
QGISのグラフィカルモデラーを使ってみた。(ver.3.22)
今回は国土地理院の災害伝承碑のデータの種別を少し変更して、種別ごとのデータに分割してみたいと思います。
QGISのバージョンは3.22です。
-
インプットデータ
国土地理院のサイトからダウンロードできます。geojsonもダウンロードできますが今回はCSVをダウンロードしてください。
こんな感じのデータです。
文字コードはshift-jisなのでレイヤプロパティのソースで変更してください。
自然災害伝承碑データの提供について -
処理の概要
今回は「災害種別」フィールドに入っている属性をそれぞれ分割して新たな種別でその種別ごとのcsvファイル(レイヤ)を出力したいと思います。
分ける種別は- 地震
- 洪水
- 津波
- 土砂災害
- 高潮+火山+その他
例えば「洪水・土砂災害」と属性が入っていたら「洪水」と「土砂災害」として2レコードにして振り分けます。
-
グラフィカルモデラー
本来は一旦QGIS本体で実現可能か確認してからモデラーを使った方が確実だと思います。
今回は事前に試してできることがわかっていたのでいきなりモデラーで書いていきます。
そしたらちょっとよくわからない不具合が。。。
グラフィカルモデラーでアルゴリズムタブが表示されなくなった
一応解決したので続きを-
入力ファイル
入力タブの「ベクタレイヤ」を選択します。
この「ベクタレイヤ」をせずに一気にアルゴリズムのインプットを書いておいてもいいのですが、inputの場所やファイル名が変わる場合などに実行時にファイルの指定をしておけるようにします。
説明文はわかるように、ジオメトリ不要にしておきます。。
-
文字コードの指定
今回使うデータがShift-JISだったので指定をします。多分UTF-8ならもんだいないのかと。
アルゴリズムタブの「ベクタ一般」→レイヤの文字コードを設定をクリック。
入力レイヤを「アルゴリズム出力の利用」に変更し「ファイルのダウンロード先」を選択し、文字コードに「Shift-JIS」を入力します。(つづりの間違い注意) -
文字で地物を分割
次にアルゴリズムタブの「ベクタ一般」→「文字で地物を分割」をクリックします。
この機能が実はびっくりしました。属性情報の中の区切り文字で複数入力されている場合にそれぞれ別のレコードとして分割してくれる機能なんです。
例えば
1|土砂・津波|あいうえお
2|洪水・地震|かきくけこ
というデータがあった場合に
1|土砂|あいうえお
2|津波|あいうえお
3|洪水|かきくけこ
4|地震|かきくけこ
といった形にしてくれるものです。今回の処理にうってつけの機能でした。
では、入力レイヤを「アルゴリズム出力の利用」に変更し「レイヤの文字コートを設定の出力」を選択し、
分割するフィールドに「災害種別」、区切り文字に「・」を入力します。
ここで気をつけたいのがフィールド名や区切り文字はプルダウン等で出てきませんので全て手入力で間違えないようにしなくてはいけないところですかね。
![スクリーンショット 2022-01-28 14.49.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/75b2ac1d-d4d4-77d0-19e0-c700fa5684fd.png)![スクリーンショット 2022-01-28 15.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/71266f05-2ab9-9a7e-1e31-313db71cd44b.png)
1. フイールド計算機で種別の再振り分け<br>
先程分割した災害種別の属性を今度は新たな定義で新しいフィールドに振り分けをします。
例えば、地震だったら地震となるのですが、高潮や火山災害、その他の場合だけは全て「高潮+火山+その他」に振り分けます。
アルゴリズムタブの「ベクタテーブル」→「フィールド計算機」をクリックします。
入力レイヤを「アルゴリズム出力の利用」に変更し「文字で地物を分割の出力」を選択し、
属性名はとりあえず「saigai」にしておきます。
フィールド型は文字列にします。
フィールド長はCSVなので本当は意味がないのですが、20にしておきます。
最後に計算式の欄に以下のif文を入れます。
if("災害種別"LIKE'%地震%','地震',if("災害種別"LIKE'%洪水%','洪水',if("災害種別"LIKE'%津波%','津波',if("災害種別"LIKE'%土砂%','土砂',if("災害種別"LIKE'%高潮%' OR "災害種別"LIKE'%火山%' OR "災害種別"LIKE'%その他%','高潮+火山+その他',NULL)))))
```<br>
![スクリーンショット 2022-01-28 15.11.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/28ad59d6-f0f4-a715-e73e-d93d454febcb.png)![スクリーンショット 2022-01-28 15.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/d4d75998-8e66-08ea-3308-ea9c476a94a6.png)
1. 属性でレイヤ分割(CSV書き出し)<br>
最後に先程振り分けた「saigai」属性を使用してそれぞれのcsvファイルとして書き出しをおこないます。<br>
アルゴリズムタブの「ベクタ一般」→「属性でレイヤ分割」をクリックします。<br>
入力レイヤを「」アルゴリズム出力の利用」に変更し「フィールド計算機の出力」に変更します。<br>
ユニークID属性を先程決めたフィールド名「saigai」を記入。<br>
入力レイヤの上の「Hide advanced parameters」ボタンを押すと出力ファイルタイプを選べます。<br>
出力ファイルタイプは「CSV」に変更します。<br>
これで処理が終わりなので「出力フォルダ」に名前を記入します。<br>
![スクリーンショット 2022-01-28 15.51.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/db24a4a6-85a8-10f1-b20c-337ccf126d0c.png)![スクリーンショット 2022-01-28 17.58.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/427d1930-7f31-e374-6ed2-e379808ff5df.png)
<br>
これでモデルが完成しました。![スクリーンショット 2022-01-28 16.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/f296fcd1-6980-0a5f-d78f-b05567d75666.png)<br>
1. 実行
実行してみます。モデルデザイナーの実行ボタンを押します。![スクリーンショット 2022-01-28 17.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/b06dfe12-62f9-b9b9-7fc5-6e8bf300495c.png)
インプットのファイルとアウトプットを入れるディレクトリを選択して実行ボタンを押します。<br>
出力されました。<br>![スクリーンショット 2022-01-28 18.00.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/19ce0fd7-e2ed-8c50-e637-56c7194bafe0.png)<br>
pythonにも書き出せました<br>![スクリーンショット 2022-01-28 18.06.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514830/428a9fd3-3a2f-dd1e-a59a-4ae94cdb0ee5.png)
次はQGISのpythonコンソールを使ってみたいと思います。