内容が古くなっている可能性がありますのでご注意下さい。
現在開発が進められているQGIS 3.0では、以下のような大きな変更があるため、既存のQGIS 2.x用に開発したプラグインはそのままでは動作しなくなります。
- Qt4 → Qt5 へアップデート
- PyQt4 → PyQt5 へアップデート
- Python 2.7 → Python 3 へアップデート
- QGIS APIの改良
詳しくはこちらに書かれています。
そこで、QGIS 2.x用に開発し、LODチャレンジ2015で基盤技術部門の優秀賞を受賞したQGISプラグイン GetLinkDataをQGIS 3.0用に移植することにします。GetLinkDataは、オープンデータ活用支援プラットフォームLinkData.orgからQGISにデータを取り込むためのプラグインです。
QGIS 3.0のインストール
開発中のQGIS 3.0は、Windows環境ではOSGeo4Wを使用してインストールすることができます。2017年3月31日時点では開発版 2.99 masterというのが3.0系の最新版です。
QGIS 3.0用のプラグインは、
C:\Users\<ユーザ名>\.qgis3\python\plugins
にインストールされます。
試しに、ここにQGIS 2.x用に開発したGetLinkDataプラグインをコピーし、QGIS 2.99を起動して「プラグイン」メニューから「プラグインの管理とインストール…」を選択すると、以下のようなエラー画面が表示されます。
プラグイン開発環境
QGIS 3.0用のプラグインの開発には、以下のものが必要です。
- Qtの開発環境(Qt Creator)
- PyQt5
- Python 3
- makeコマンド(Windowsの場合はGnuWin32のmakeコマンド)
既にQGIS 2.x用のプラグイン開発環境があれば、Python 3をこちらからダウンロードしてインストールし、
pip3 install pyqt5
コマンドを実行してPyQt5をインストールします。
さらに、QGIS 3.0用のPlugin Builder 3プラグインをQGISにインストールします。
プラグインのテンプレート作成
はじめにPlugin Builder 3を使用してQGIS 3.0用プラグインのテンプレートを作成し、生成されたファイルにQGIS 2.x用に開発した内容を反映させることにします。
Plugin Builderを起動し、最初の画面ではプラグイン名やクラス名等を指定します。
プラグイン名はGetLinkData3に変更しますが、クラス名やモジュール名はQGIS 2.x用と同じにします。これは、開発済みのコードを最大限そのまま流用するためです。
次に、プラグインの説明を入力します。
ツールボタンとダイアログによるプラグインのテンプレートを選択し、メニューとメニュー項目名を指定します。
次の画面では、とりあえずすべてチェックを付けたままにしておきます。
プラグイン公開のURL等を指定し、「実験的」なプラグインとしておきます。
以上で完了です。GetLinkDataフォルダにテンプレートが生成されました。
UIの開発
次に、プラグインのUIを開発します。Plugin Builderが生成したダイアログボックスのテンプレート(今回の例ではget_link_data_dialog_base.ui)をQtCreatorで編集するのが通常の流れですが、QGIS 2.x用に作成したget_link_data_dialog_base.uiをそのまま流用します。さらに、icon.pngも既存のファイルで上書きし、makeコマンドを実行します。
PyQt5がインストールされていないと、makeコマンドで実行されるpyrcc5が見つからずエラーになります。
ここまでに作成したファイル一式をGetLinkDataフォルダごと
C:\Users\<ユーザ名>\.qgis3\python\plugins
の下にコピーし、QGISを起動して「プラグイン」メニューから「プラグインの管理とインストール…」を選択すると、
今回はエラーになりません。
「Web」メニューまたはツールバーのボタンでGetLinkData3を起動すると、
ダイアログボックスも正しく表示されました。
今回は、QGIS 2.x(Qt4/PyQt4)用に開発したUI定義のファイルをそのまま使うことができましたが、場合によっては修正が必要になるかもしれません。
プログラムの作成
Plugin Builderが生成したget_link_data.pyに、開発済みのプログラムを移植します。ここでは、
- PyQt4 → PyQt5 による変更
- Python 2.7 → Python 3 による変更
- QGIS APIの仕様変更
に注意が必要です。
今回の移植では、
- Python 2.7のurllib2が廃止され、urllib.request、urllib.parse、urllib.errorになった
- QGISプラグインライブラリの仕様変更で、レイヤの追加が
QgsMapLayerRegistry.instance().addMapLayer() から QgsProject.instance().addMapLayer()になった
というのが大きな変更点でした。
国際化対応
QGIS 2.x用に作成した国際化対応のためのファイルをi18nサブフォルダにコピーすると、日本語を表示することができました。
QGISプラグインの国際化対応については、前回の記事を参考にして下さい。
今回作成したGetLinkData3はGitHubで公開しています。
https://github.com/midoriit/GetLinkData3
2017.4.1 追記
DBpediaの情報からベクタレイヤを作成するPediaLayerプラグインも、QGIS 3.0用を作成しました。
https://github.com/midoriit/PediaLayer3
2018.3.16 追記
QGIS 3.0の正式版(QGIS 3.0.0 ‘Girona’)におけるAPIの仕様変更に対応し、GitHubのリポジトリを更新しました。