QGISプラグイン作成でつまづいた時に参考になるといいな

# この記事を書こうと思ったきっかけ
2023年11月28日−12月2日の間、FOSS4G ASIA2023がソウルで開催されておりました。

https://foss4g.asia/2023/

![IMG_5231.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/333eccef-848c-7310-5fe5-86de1b12092b.jpeg)



FOSS4G ASIAの様子などは他の方の投稿に任せるとして、自分は28日のワークショップから参加し、[PyQGIS and plugin development in QGIS for automatic map creation](https://talks.osgeo.org/foss4g-asia-2023/talk/DEXQVW/)という、QGISプラグイン作成のワークショップを受講いたしました。

内容としては、QGISの「plugin Builder」プラグインでプラグインのベースを作って、ちょっとオリジナルに手を加えてみましょう。
といったもので、以下に資料もアップしてくれていますので、気になる方はそちらをご覧ください。

https://github.com/Hamidrezaostadabbas/FOSS4G_Asia_2023


恥ずかしながら自分はワークショップ途中でつまずいて最後までついていけなかったのですが、その後調べてつまづいた箇所をクリアすることができたので、今後プラグインを作る際の忘備録としてもその攻略をメモしておきます。
QGISのプラグインを作ろうとしている人で、以下の点でつまづいた人の助けになればいいなぁと思います。

- なんかresourcesファイルがなんちゃらかんちゃら言われた時
- MacでもQt designerでQGIS Custom Widgetsを使いたい時



# プラグインの雛形を作る

ワークショップではまず初めにQGISのPlugin Builderでプラグインの雛形を作成しました。
- plugin builder 3 をインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/30b19e29-abbb-c856-9f0f-c3402058ffc3.png)


- plugin builder 3を使ってプラグインの情報を入力

1枚目は以下の情報を入力します。
|Title|Description|
|------|-----------|
|Class name|プラグインのクラス名 **PascalCase**で指定。|
|Plugin name|プラグイン名|
|Description|プラグインの説明|
|Module name|Pythonモジュール名。 アンダーラインで区切られた**lower_case** で指定。|
|Version number (0.0.0)| プラグインのバージョン|
|Minimum QGIS version| プラグインが動作するQGISの最低バージョン|
|Author/Company|作成者|
|Email address|作成者のメールアドレス|

2枚目はプラグインの詳細な説明文
3枚目はテンプレートの種類の選択
4枚目は雛形一式にヘルプとかも含めたければチェック
5枚目はプラグインのリポジトリとか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/90daf431-8d86-43aa-7901-456f2eb71430.png)

- 出力先はQGISがプラグインを認識できるよう、それぞれのOSに応じて以下の場所を指定します。
    - windows: `home\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins`
    - mac: `/Users/Library/Application Support/QGIS/QGIS3/profiles/default/python/plugins`
    - Linux: `home/User/local/share/QGIS/QGIS3/profiles/default/python/plugins`
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/fc71e615-787f-2b57-dee0-3f678ea7d125.png)


- これでプラグインの雛形が完成。と思いきや
最後に何やら怪しげなメッセージ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/afb2e010-7113-dd64-8ce6-c5e782572c5a.png)

- 一旦メッセージは無視してQGISでプラグインを呼び出してみます。
プラグインマネージャーから作成したプラグインにチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/7271e1de-3d33-6157-3337-4a00a9c51b3c.png)

するとなんか怒られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/70b48343-f35c-de72-b7f4-de5319df346c.png)


# つまづいた箇所その１〜resources.qrcの変換
Plugin Builderで作成したプラグインの雛形のファイル一式を確認すると`resources.qrc`というファイルがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/46b1c73b-8563-7eed-82d6-ee924077379d.png)


これはQGISのツールバーに表示されるのicon.pngを読み込むファイルですが、これをPythonのコードに変換しなければいけません。


resourcesの変換はpyrcc5というコマンドを使用します。
なんかPATHがきちんと通っていればPlugin Builder実行時にこの変換も済ませてくれるようです。
Plugin Builder実行時に表示されたこのメッセージは、この変換ができていないですよーってことだったんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/afb2e010-7113-dd64-8ce6-c5e782572c5a.png)

ワークショップでは自分も含めてこのresourcesの変換が行われず、つまづいている方が何名かいらっしゃるようでした。

というわけで、resourcesの変換を行います。


- ターミナルでプラグインのフォルダへ移動します。
```
cd /Users/Library/Application Support/QGIS/QGIS3/profiles/default/python/plugins/●●●（プラグイン名）
```


- 変換処理の実行
```
pyrcc5 -o resources.py resources.qrc
```
上のコードを実行するとプラグインフォルダ内に`resources.py`というファイルが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/d3c5cc63-fae7-b45b-8051-d3cc98ae3c75.png)



これで改めてQGISのプラグインマネージャーから作成したプラグインのチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/58b854b2-8776-c6a4-8cab-034dc2b7e072.png)


今度はメッセージが表示されずに、ちゃんとメニューにも表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/de8d70f5-91a1-572c-9890-429b403caf8a.png)


# つまづいた箇所その２〜QGIS Custom Widget 付きQt designer
プラグインを実行するとダイアログには何もない状態なので、プラグインのダイアログを作っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/db91fbc3-151c-0fa4-3909-ed1cee815d8b.png)

ダイアログは、プラグインフォルダ一式にある「〜〜〜.ui」ファイルを編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/5f49abe8-e7fc-161f-4fbc-f4479cc41057.png)


ここでWindowsユーザーの場合、QGISをインストールするとスタートメニューに「Qt Designer with QGIS xxx custom widget」が存在しているので、これを起動してuiファイルを開くと、レイヤの選択などのQGISのプロセッシングでお馴染みのウィジェットも使用することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/e989695f-c767-9823-5cd5-81e1e4fb2358.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/9d468545-ee03-22c0-83a4-3f818a43c07d.png)



Macの人はというとアプリケーションの一覧に出てきてないので、一見わかりにくいですが、
`/Applications/QGIS.app/Contents/MacOS`にある`Designer.app`から起動すれば同じくQGIS custom widgetsを使うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/d97fcfa9-800e-f550-c122-92ef9ca765c7.png)

ワークショップの資料はWindows仕様だったので、自分も含めMacの人はここでも割とつまづいている人がいたように思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/e9e7d70e-2700-cc36-97f0-2f1557e81a95.png)

 
ダイアログの編集もできたら、あとはプラグインファイル一式の「プラグイン名.py」に実際の処理内容を記述すればOKです。
（今回はPushBottonをクリックすると、コマンドにメッセージを表示する。という簡単な処理）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/87261325-4a23-c22f-dcf5-d69f26a8b474.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/0441c1d2-10fd-11d7-e1ae-65948e089364.png)


これにて無事ワークショップの内容をやり遂げることができました。


 # あとがき
ワークショップ中は当然ながら英語で進んでいましたが、資料も手元でじっくりみることができたのと、なんとか質問したりしてなんとなくやっていることが理解できてよかったです。


今回はあくまで、ワークショップでつまづいたところの攻略の内容でしたが、改めてQGISプラグインの作り方を別記事に整理したいと思いますが、それはまた別の話。

韓国では美味しいものいっぱい食べたけど、ちゃんと名前とか覚えてないので、写真だけ載せて供養しておきます。

韓国版[とうきびモナカアイス](https://fumumu.net/275858/)
![IMG_5225.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/ceff7fe7-0e9a-68be-bb99-c287a4ff44b8.jpeg)


トッポギ入り辛いラーメン
![IMG_5233.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/c83e3045-5439-6a90-af79-3fc5cbc3840a.jpeg)

辛いなべ
![IMG_5291.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/bdc000cb-cf98-c5ff-a1d9-9e61eac687af.jpeg)

ユッケ
![IMG_5292.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/336c1584-2a3f-a7bb-d390-46579c5f4ca6.jpeg)

茶碗蒸し
![IMG_5311.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/ec3358fb-5b15-4647-e9ce-8b46fbfa1c88.jpeg)

海鮮たっぷり鍋
![IMG_5330.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/eea07e47-b959-0cbf-f385-3144b76e9e33.jpeg)

サムゲタン（？）だっけ
![IMG_5386.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/943e9369-0646-12bd-59e3-e87d1975f48a.jpeg)

なんかカニとかエビとかチューチューして食べるやつ
![IMG_5434.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/6793dc48-51a0-75ed-047c-ab471ce1a539.jpeg)

空港で買ったキンパとポケモンパン
![IMG_5440.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/3aaa5d74-f99f-774e-3a8a-8f54f8d1a0a9.jpeg)

ではまた。

# 参考ページ
https://gis-oer.github.io/gitbook/book/materials/python/10/10.html#%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC


https://chiakikun.hatenadiary.com/entry/2018/08/16/124941