QGISプラグインの開発(4)

この記事は1年以上前に書かれました。
内容が古くなっている可能性がありますのでご注意下さい。


現在開発が進められている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のリポジトリを更新しました。

QGISプラグインの開発 12345