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

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

QGISプラグインの国際化対応

ウィキペディアの情報をDBpedia Japaneseから取得してベクタレイヤを作成する「PediaLayer」プラグインを機能拡張します。前回作成したバージョンでは、情報の取得範囲をレイヤで指定しましたが、今回の機能拡張によりマップキャンバスでも指定できるようにします。また、国際化対応の方法についても解説します。

ダイアログボックスの編集
はじめに、Plugin Builderプラグインが生成したUI定義ファイル「pedia_layer_dialog_base.ui」をQt Creatorで編集します。範囲をマップキャンバスで指定するかレイヤで指定するかを選択するラジオボタンを追加します。

ラベルは英語表記にしておき、Qtの国際化機能を用いて後で日本語化します。

プログラムの作成
pedia_layer.pyは、runメソッドの中で、ダイアログボックスで[OK]ボタンがクリックされたときの処理が変更になります。

# calculate coordinates
if self.dlg.radioButton_l.isChecked() == True:
    index = self.dlg.comboBox.currentIndex()
    if index == -1:
        return
    layer = layers[index]
    extent = layer.extent()
    srcCrs = layer.crs()
elif self.dlg.radioButton_m.isChecked() == True:
    canvas = self.iface.mapCanvas()
    layers = self.iface.legendInterface().layers()
    if len(layers) == 0:
        return
    extent = canvas.extent()
    srcCrs = canvas.mapSettings().destinationCrs()
else:
    return

「レイヤ」のラジオボタンがチェックされていた場合は、選択されたレイヤから範囲と座標参照システム(CRS)を取得します。レイヤが選択されていない場合(index == -1)はreturnします。
「マップキャンバス」のラジオボタンがチェックされていた場合は、マップキャンバスから範囲と座標参照システム(CRS)を取得します。レイヤが1つもない場合(len(layers) == 0)はマップキャンバスから範囲を取得できないため、returnします。

国際化
Qtプログラムの国際化の手順は以下の通りです。

  • pylupdate4コマンドでソースファイルから翻訳すべき文字列を抽出して.tsファイルを作成する。
  • linguistコマンドで.tsファイルに翻訳した文字列を入力する。
  • lreleaseコマンドで.tsファイルから.qmファイルを作成する。

まず、以下のコマンドを実行します。

pylupdate4 pedia_layer.py pedia_layer_dialog_base.ui -ts PediaLayer_ja.ts

pedia_layer.pyとpedia_layer_dialog_base.uiから翻訳すべき文字列が抽出され、PediaLayer_ja.tsファイルが作成されます。
次に、以下のコマンドを実行し、linguistのGUIを起動します。

linguist PediaLayer_ja.ts

linguistのGUIで翻訳した文字列を入力します。

翻訳が完了したら.tsファイルを保存してlinguistを終了します。
最後に、以下のコマンドを実行してバイナリ形式のPediaLayer_ja.qmファイルを作成します。

lrelease PediaLayer_ja.ts

PediaLayer_ja.tsファイルとPediaLayer_ja.qmファイルはi18nサブフォルダに格納します。

実行例
以上で、ベクタレイヤやラスタレイヤを用いずに、マップキャンバスで範囲を指定してDBpediaから情報を取得できるようになりました。
以下の例では、タイルレイヤプラグインを使用して地理院タイルを表示し、マップキャンバスで範囲指定してDBpediaから取得した結果を表示しています。

完全なソースコード一式はGitHubで公開しています。

QGISプラグインの開発 1234