QGISでプラグインをつくりたい!
この記事は冗長な記述がみられます。この記事自体も冗長です。目次を見て必要な情報に飛ぶかブラウザバックしてください。このタイトルは大言壮語的です。この記事内でプラグインを実際に作ることはありません。
また、筆者の環境はWindows10、QGIS 3.10.14 & 3.16.3です。
- はじめに
- QGISとは?
- QGISのプラグインとは?
- QGISプラグインをつくりたい!
- QGISでPythonを使うためのドキュメントたち
- とりあえずプラグインをつくってみよう!
- IDEでデバッグしたい!
- 資料編
- 次回予告
- おわりに
はじめに
この記事の位置づけや新規性について説明します。
世の中には無数のQGISやQGISプラグインに関するサイト・ページがあります。多くの記事はよくできており、筆者のような初心者がその劣化コピーを書いても仕方がありません。よってこの記事は参考になる記事へのリンクを集成する、「QGISプラグイン展望」としたいと思います。とはいえ全部の記事を網羅することは不可能で見落としも多々あると思います。そのような場合はぜひ筆者におしらせください。随時更新したいと思います。
展望記事なので新規性はあまりありません。残念!
QGISとは?
QGISはオープンソースで開発されているGIS(Geographic Information System:地理情報システム)です。Windows、MacOS、Linux、Androidに対応しているフリーのGISソフトとしては最高峰のものといえるでしょう。
GISとは……?とか、GISまわりの事情についてはインターネットにたくさん情報があるので割愛します。
QGISのプラグインとは?
QGISのプラグインは大きくわけて2種類存在します。1つ目はGISソフトとして必要不可欠なデータ管理や空間解析などの機能を担う”コアプラグイン”、2つ目は利用者が追加して利用する”外部プラグイン”です。
コアプラグインは何もしなくてもQGISをインストールすれば勝手に入っていますが、外部プラグインはQGISのメニューバーにある[プラグイン]タブから導入することになります。
外部プラグインの導入方法は、2つあります。
1つ目はプラグインのおかれたリポジトリに接続してインストールする方法です。QGISとしてはこの方法を推奨しており、デフォルトの状態でQGISのオフィシャルプラグインリポジトリに接続しています。
オフィシャルプラグインリポジトリにあるプラグインで有名なものはQgis2threejsがあります。このプラグインを利用することでDEM(Digital Elavation Model:数値標高モデル、国内のデータは国土地理院の基盤地図情報で公開されている)を3次元化してブラウザ用に出力できます。(実は現在のQGISのコアプラグインでDEMの3次元表現はできるのですが、このプラグインのほうが利便性が高い(といわれています))。
github.com外部のプラグインリポジトリの例としては朝日航洋株式会社が提供している「陰陽図メーカー」プラグインがあります。DEMの高低差情報を陰影で表現する機能はQGISのコアプラグイン内に実装されていますが、陰陽での表現は実装されていません。このプラグインをインストールすることで、QGIS上でできる図形表現の幅が広がることになります。
2つ目は、プラグインのZIPパッケージを読み込ませてインストールする方法です。これは、QGISが推奨する方法ではありません。インターネットの海から信頼できるものをインストールして利用することが求められています(筆者は利用したことがないため具体的なものは紹介しません)。
外部プラグインのインストール方法の手順は以下の通りです。QGISを立ち上げて、メニューバーから[プラグイン]-[プラグインの管理とインストール]をクリックするとダイアログが開かれます。QGISのオフィシャルプラグインリポジトリからインストールする場合は、[全てのプラグイン]を開き、検索窓などを利用して目的のプラグインを探しクリック、[インストール]ボタンを押してインストールします。ダイアログを閉じて、再度[プラグイン]をクリックすると、[Pythonコンソール]の下にインストールしたプラグインが表示されます。
余談ですが、QGISが2.xから3.xにバージョンアップした際、コアプラグインは強化されたものの、Pythonが2.7→3.6、Qtが4→5になり、後方互換性がなくなったため人々が作っていた既存プラグインの多くが使えなくなったらしいです。とはいえ、QGIS3.xは現在開発が続いており、GUIもesri社の製品ほどではないにしろ直感的にわかりやすくなってきていますから、よほどのこだわりがない限り3.xをインストールするほうがよさそうです。
QGISプラグインをつくりたい!
さてここからが本題です。もしあなたが既存のプロセシングやツールに不具合を見つけたり、使い勝手の悪さを感じたり、全く新しい機能を導入したいと思ったらどうしますか?
不具合の場合は、GitHubでissueを作成して問題を指摘したり、書き直したりできるかもしれません。しかし、この方法は長い目でみてソフトを改善することには役立ちますが、手元で起こっている問題の楽な解決ではありません。また、使い勝手が悪い(例えば複数の処理を続けてやりたいとき*1)とか、今はない機能を追加したいときはとりあえずプラグインとして機能を作ってしまえばよいのです。バグ迂回するプロセシングや複雑な処理をまとめて行うものを一回書いてしまえば以後困ることはあまりありません。面倒なことはプラグインにやらせましょう。
面倒なことをやらせるといえばPythonですが、実はQGISのプラグインはPythonで記述できます(しかし、QGIS自体はC++で作られており、C++でもプラグインは書けます)。
PythonでPlugin開発をするメリットは
- 日本語・英語ともにQGISプラグイン開発の資料が豊富
- QGIS公式的にもおすすめっぽい
- (個人的には)Pythonの話は身近で聞くので困ったときに質問しやすい
- ArcGISで自動化したいときはArcPyというPythonのパッケージを使うらしい(のでPythonに慣れているとGISまわりでは潰しが効く可能性が高い)
- 習得しやすい(ということになっている)らしい
などが挙げられます。
ところが私はPythonのことをまるで知りません。インターネットと英語とバトルしながら、QGISでPythonプラグインを書くための勉強スタートです。
QGISでPythonを使うためのドキュメントたち
ここでQGISをPythonで動かす方法について参考資料を提示します。
まずQGISの一般的な操作については多くの書籍やウェブページが用意されていますが、日本語文献で一番のおすすめは、「GIS実習オープン教材」です。
この文献の後半に「GIS初中級者のためのPython入門」という章が設けられています。基本的なPythonの使い方がわかる……とはいえません。入門といいつつ、非常に簡素な説明ですから、必要な知識はインターネットなり書物なりを参照して理解をする必要があります。また、一部リンクがC++の公式ガイドに飛んでいたりと一筋縄にはいかないところがあるため注意して読みましょう。
英語文献では公式のドキュメントが最重要です(一部は日本語に訳されていますが、十分ではないため最初から英語を読むことを推奨します)。基本的にあらゆることが書かれており、Pythonについても例外ではありません。
QGIS上のPythonでの開発については、上記ドキュメント内にある"PyQGIS Developer Cookbook" が最も基本的かつ強力なツールです。網羅的に追うことができる量ではないので適宜参照しています。
また、公式のドキュメントとしてはもう一つ、"QGIS Python API"に関するページがあります。
このページでは、QGISで用意されているクラスに関して必要な情報が集積しています。実際にコードを書いていくときに逐一参照します。
現在のところ、PythonをQGISで扱うにあたって特に必要な文書はこの3点であると思われます。また有益な情報があれば更新します。
とりあえずプラグインをつくってみよう!
それではいきなりですがプラグインを作ってみましょう。インターネット上にはプラグインを作る話がたくさんあるので、ここではあっさりと説明します。
手順は2段階です。
簡単ですね!
QGIS上でのプラグインの導入
簡単にプラグインを作るために、2つのプラグインをQGISオフィシャルリポジトリからインストールします(プラグインのホームページを掲載していますが、インストールはQGIS上で行ってください)。
①Plugin Builder 3
このプラグインを利用するととても簡単にプラグイン作成に必要なファイルを生成することができます。難しいことが何一つなく、コードを書く必要もありません。このプラグインでは3種類のテンプレートが利用できます(詳細後述)。
②Plugin Reloader
このプラグインはとても単純です。Pythonで書かれたプラグインをリロードすることができます。プラグインの中身を書き換えQGISで動作を確認するときにいちいちQGISを再起動してプラグインを読み込む手間を省いてくれます。
この2つのプラグインがなければプラグインをつくれないというものではありませんが、楽なので楽をしましょう。
プラグインを実際につくってみる(つくらない)
ここまでの準備でとりあえずプラグインをつくることができるようになりました。それでは作っていく……のではなく、プラグイン作成に役立つページを紹介します。
Plugin Builderを利用してプラグインを作成するとき、プラグインの形態として3つの中から選ぶことになります。自動で生成されるプラグインのファイル構成もそれぞれ異なるため作業は3つに分かれることとなります。まずはじめに3つのプラグインの形態の個別のお役立ちページを紹介したのち、共通部分と注意点を記述します。
①"Tool button with dialog"を選ぶ場合
"Tool button with dialog"は一番数の多いプラグインの形態でしょう。プラグインはプラグインのメニュー内に置かれ、起動するとダイアログボックスが出現し、その中で何らかの操作と処理が行われることになります。
この形態のプラグインについては「GIS実習オープン教材」内で丁寧に説明されています。
また、こちらのブログも参考になります。
他にも↓のようなページもあります。
管見の限り、"Tool button with dialog"が一番メジャーで、扱いやすいと思われます。また、QGISのプラグインを作り方を紹介している記事のほとんどはこの方法について話しています。
②"Tool button with dock widget"を選ぶ場合
dockとは?については"Qt dock"などとググるとわかりやすいと思います。QGISでいえば、ソフトを立ち上げた際に左右にある「ブラウザ」や「レイヤ」といった、メインウィンドウに組み込まれているけれど別の領域として扱われている部分です(雑)。この部分に出てくるプラグインをつくれるということですが、おそらくこの機能はほとんど使われておらず、インターネット上でも紹介記事は見つかりませんでした。理由としては常駐させておきたいプラグインの機能はだいたいコアに実装済みだからというのがありそうですが、真実はわかりません。知っている方がいれば教えてください。
お役立ちページを書いたよという方や知ってるという方がいればぜひコメントをお願いします。
ちょっと触った感じでは1番目に紹介した"Tool button with dialog"に近いようで、注意すべき点(後述)も共通です。
③"Processing provider"を選ぶ場合
最後に、プラグインをプロセシングとして作る方法です。これを選ぶと、「プロセシングツールボックス」内、QGISのコアプラグインの下にツールが追加されます。ツールをダブルクリックするとバッファなどのツールと同じようにダイアログが表示され、利用することができます。
この方法の解説で最もわかりやすいのは下記ページです。基本的なことは一通り押さえられています。
共通部分と注意点
①、②、③と作り方を紹介しましたが、共通する基本事項と、注意点について記述していきます。
まず、共通する基本事項として、QGISのプラグインのデフォルトの保存場所です。Windowsでは、
C:\Users\{UserName}\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins
にあります。先ほどインストールしたPlugin Builderもここにあると思いますので確認してみてください。
次に注意点です。①”Tool button with dialog"と②"Tool button with dock widget"を選んでプラグインを作成する場合、Plugin Builderで作成したプラグインをそのまま動かすことはできません。
pluginフォルダ内にある"resources.qrc"というファイルをPythonに変換する必要があります。この手順については先に挙げた「GIS実習オープン教材」に掲載されているとおりに行ってください。
また、QGISをインストールした際に付属しているQt Designerを利用して、dialogやdock widgetのGUIを編集することができます。Qt Designerの使い方については
このページが詳細であると思われます。
ここまでくればあとはプラグインの中身を書くだけです。参考に挙げたサイトを参照しながら、それぞれ必要なファイルを編集していきます。(このあたりは次回の実際にプラグインを作る話のときに書こうと思います)。
QGISのPythonについては前節で挙げた2つの公式サイトを、現在あるプロセシングの改良などQGISの本体を見ながらやりたい人は
がおすすめです。
出来たら、先にインストールしたPlugin Reloaderを使ってプラグインをロードしなおし、実行してください。おそらく動くはずです。だめならどこかにエラーが出ます。
IDEでデバッグしたい!
さて、今のままではQGISのプラグインを書ける作れるといってもテキストエディタでコードを書いて目で見てエイヤ!とQGIS上でプラグインをリロードすることしかできません。開発環境でデバッグできるほうが便利ですね。ということでみなさん大好き環境構築です。なお、私の現在の環境はWindows 10 20H2・QGIS 3.10.14 スタンドアローンインストール(OSGeo4Wネットワークインストーラを利用していない)です。試した方法については試したよと書いておきますので参考にしてください。
なお、超・ド・初心者なので致命的な間違いがあるかもしれません。発見した際にはぜひご指摘ください。
以下では導入したい環境にあわせておすすめ記事の紹介します。
- Visual Studio on Windows10
- VS Code on Windows10 & MacOS
- そのほかのIDE on いろいろなOS
Visual Studio on Windows10
私はこの方法で環境を作りました。
QGIS3に付属のPython等を使えるようにするためのパス設定 - chiakikunのブログ
を参照して環境変数を設定したらあとは手順の通りにやるだけです。簡単。
同様のブログがこちらです。
QGISプラグインをVisual Studio 2017でデバッグする - embeddedなブログ
どちらかをみれば十分かと。
VS Code on Windows10 & MacOS
実はこの方法を一番最初に試したのですが沼ってしまい丸一日消えました。
Macに関しては2本記事があったので紹介します。
Debugging QGIS 3.x python plugins on OSX using VS Code · GitHub
Windowsに関してはあまりなくちょっとよくわからないといったところなのですが、
RemoteDebuggingQgisVsCode.md · GitHub
という記事がありましたので紹介します。
VSCodeでRemote Attachをする方法は、大きく2つに分かれています。1つ目は"DebugVS"というプラグインをQGISに入れる方法、2つ目はデバッグしたいプラグインに直接コードを追加する方法です。今回紹介した記事のうち前者2つはDebugVSを導入する方法、最後のものが直接コードを追加する方法です。
1つ目のDebugVSというプラグインはプラグイン自体に不具合があることがIssueで示唆されており、実際手元の環境でもプラグイン内でエラーが出ました。また、必要なモジュールが最新版では動かないなどの謎があります。
2つ目に関してはプラグインのソースにいちいちコードを足すのは面倒なので少し試しただけですがどうもうまくいきませんでした。
どちらの方法でも私はうまくいかなかったため、VS Codeでやることはあきらめた次第です(そもそもVS CodeってIDEではないですしお🍣)。
そのほかのIDE on いろいろなOS
公式ドキュメントにはいろんなことが書いてありますが、どうも内容が古い部分もありそうです。
こちらではPyscripter on Windows、Eclipse on Windows、PyCharm on Ubuntu、そしてIDEではありませんがPDEの利用方法が掲載されています。しかしここではOSGeo4Wもインストールしている前提ですから気を付けてください。
ここまでの内容で、QGIS上で動作するプラグインを開発できる環境は準備できると思われます。ここからは蛇足です。
資料編
この節では本文中で紹介しきれなかったプラグイン作成方法の記事を紹介します。
プラグイン作成の手順に関する記事
QGIS3でpythonプラグインを作ってみた その1 ベース作成 - Qiita
QGIS3.x系向けプラグイン作成手順や各種処理の実装方法について - Qiita
QGIS 3 Plugin Tutorial - Plugin development reference guide » GIS • OPS
[QGIS] プラグインを作って動かすまでの手順 │ Web備忘録
以上の記事はQGIS3系でのプラグイン開発についての概要がわかりやすく説明しています。これまでの記事でよくわからないところがあった場合、補完的に利用できる可能性が高いです。
プラグイン作成に関する書籍
Pythonではじめるマップアプリケーションプラグイン (PDF版) - dayjournal - BOOTH
読んでいないのに紹介するのは気が引けるのですが、日本語書籍でQGISのプラグインを扱ったものはこれぐらいしかないと思われます。QGISの公式ページの書籍紹介欄にも載っていたので素性は確かなのではないでしょうか(無責任)。
次回予告
私はQGISの不具合の一つに悩まされています。
それは、プロセシングツールとして用意されている距離行列(distance matrix)で線形距離行列(N*k×3)を選択し、「計算する近傍点の個数」を1にしたとき、つまり最近傍の点を調べようとしたときに、実際には最近傍の点ではない点が選択されることがあることです。
例えば以下の写真は東京都の都市公園と鉄道駅の距離を調べた際のdistance matrixの属性テーブルです。最近傍を調べた右では上千葉砂原公園から最も近い駅をお花茶屋駅、1131.1mとしています。一方、上千葉砂原公園から日本中にある鉄道駅までの距離を計算させて短い順にソートしたものが左の属性テーブルです。ここでは亀有駅が1109.6mで最短となっており、お花茶屋駅は2番目です。また、左右を見比べてわかる通り、最近傍で計算した距離自体は間違っていないようです。
これは距離行列のプロセシングにバグがある可能性を示唆する結果です。
とりあえずの解決策として、いったんある点からすべての点までの距離を測って保存し、それぞれソートすることが考えられるでしょう。また、中長期的な解決のため、GitHubでissueを作成することで開発に貢献することもできます(実はすでにissueが立っているようですが1年半以上放置されているようにみえます)。
しかし、今現在の困りに対して楽な解決策がありません。例えば今回の東京都の都市公園の数は6390個で、それぞれの最近傍駅があっているのかを手作業で確認するのは困難ですし、いちいちCSVなどで書きだしたりDBとしていじったりは面倒です。
ということで、もし存在すれば、次回はこの距離行列の問題を解決するためのプラグインの話をしようと思います。
おわりに
QGISはプラグインのカスタマイズ次第、作り方次第で多様な表現・処理ができるところがとてもよいと思います。バグがあったり修正が遅かったりするのは仕方ないことですが、QGISの開発者になったり、Githubでissueを出したりして貢献することもできます。
最近はQGISのガイド本が多数販売されるようになってきており、日本語ドキュメントの少なさやまとまりのなさは解消されつつあるように思います。
将来的にはpix2pixをQGISのプラグインとして実装できれば楽しいなと考えています。python2系での実装という先行事例もあるので、3系できちんと動くものを作りたいといったところです。
それではよきGISライフを。
*1:プロセシングを続けて処理したいときはグラフィカルモデラ―を利用することがおすすめです。