QGIS Python コトハジメ その2

プラグインに表示されるだけでは意味が無いので、プラグインがロードされるときに実行されるinitGui()メソッドに初期化設定を行う。

メニューに追加


メニューに追加するには、http://qgis.org/api/classQgisInterface.htmlにあるメソッドを使う。登録したいメニュー、ツールバー別にメソッドが違うらしい。とりあえずプラグインメニューに入れてみよう。

# -*- coding: utf-8 -*-
”’
Comments
”’
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

class DBtoWMS:
def __init__(self, iface):
self.iface = iface
def initGui(self):
self.action = QAction(u”DB-WMS連携”, self.iface.mainWindow())
self.iface.addPluginToMenu(u”DB-WMS連携プラグイン”, self.action)
def unload(self):
pass<

QGISは、QtというUIフレームワークを利用しているそうだ。C++用だが、そのPython用PyQtを利用するらしい。なので、PyQtとQGISのモジュールを5~7行目でインポート。どれがどれに必要かわからないので、基本的なやつをおまじないのように書いている。あとは、エラーが出た時にしらべて追加して凌いでいる。

initGuiメソッドの中で、Qtのアクションの生成とそのアクションをQGISのプラグインへ追加するようにしている。
いくつかのメソッド名が出ているが、Qgsで始まるのはQGISのもので、QXxxxといのはQt用らしい。今回で言うと、QActionはQtのメソッドでメニューバー、ツールバーのアクションを設定する。
self.ifaceは、プラグインが呼び出されるときにQGISのインタフェースクラス「QgisInterface」が渡されているので、それを__init__()でself.ifaceに割り当てて引き継いでいる。「QgisInterface」のメソッドにメニュー関係のものがそろっているので、その一つaddPluginToMenuを利用してプラグインメニューに追加した。

QActionは、アイコンやショートカットキーなどをパラメータとして持つことが出来るらしい。アイコンはそのうち作ろう。

self.actionは、QActionのインスタンス(インスタンスがPython用語じゃなかったらごめんなさい)を割り当てているだけなので名前はなんでもよろしい。今回actionにしただけ。QActionで作ったアクションをaddうんちゃらでメニューやツールバーに割り当てている。

これで実行すると、メニューに登録される。ってことはあれだ、2つメニューを登録したい場合は、

    def initGui(self):
self.action1 = QAction(u”DB-WMS連携”, self.iface.mainWindow())
self.iface.addPluginToMenu(u”DB-WMS連携プラグイン”, self.action1)
self.action2 = QAction(u”DB-WMS連携2″, self.iface.mainWindow())
self.iface.addPluginToMenu(u”DB-WMS連携プラグイン”, self.action2)

ってことですね。出来た!!
plugin02

メニューに登録しただけなので、クリックしても何も起こらん。。

ダイアログを表示


では、メニュークリックでダイアログを出そう。2個メニューあっても邪魔なので、一個に戻して進めます。

Qtでは、クリックとかのイベントをシグナルというらしい。よってアクションでシグナルが発生した場合に呼び出されるメソッドを登録する。QObject命令を使うらしい。

# -*- coding: utf-8 -*-
”’
Comments
”’
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *

class DBtoWMS:
def __init__(self, iface):
self.iface = iface

def initGui(self):
self.action = QAction(u”DB-WMS連携”, self.iface.mainWindow())
self.iface.addPluginToMenu(u”DB-WMS連携プラグイン”, self.action)

QObject.connect(self.action, SIGNAL(“triggered()”), self.dlgMessage)

def unload(self):
pass

def dlgMessage(self):
QMessageBox.critical(None, ‘Message’, ‘AHAHAHAHAHA’, QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

これで、「DB-WMS連携」メニューでtriggeredシグナルが発生すると、dlgMessageが呼びだれる設定となる。Qtのオブジェクトがボタンだったらclickedシグナルといった分かりやすいシグナルがある。triggeredってなんだ??わからんがメニューはこれらしい。

dlgMessageの中では、ダイアログボックスを出すQMessageを呼び出す。
plugin03
動いた!

ヨシ!ダイアログ出す代わりに、行いたい処理を書けば良いってことですな。

次の目標
・アイコンも登録してみるかな。
・プラグイン選んだら、日本が表示されるようにマップを動かしてみる。
・しかし、ソースの素敵な書き方がわからんぞ、このブログシステム

QGIS Python コトハジメ

QGISのプログラミング記事って少ないのね。ちと書いてみようかしらん。
対象はこんなの。

  • Quantum GISのPythonプラグインのプログラミング
  • GISメインではなく、アプリケーションとしてプログラミングがメイン
  • とりあえずWindows上で作る。

需要なさそうだけど、自分が困ったから書く。
目標を決めよう。QGISで困ったのは「データベースと画像の連携」だった。どこかにその機能を持った素敵なプラグインや機能があるのかもしれん。見つからなかった。。
PostGISレイヤーとShapeの連動とかは出来た。しかし、ベクトルはPostGISが持っているので、Shapeと連携してもあまりうれしくなかった。PostGISとWMSレイヤーが連携出来たらいいのに。。PostGISレイヤーでクリックして画像を表示出来るとビューアーとして良い。。

まずは、プラグインの置き場


プラグインの置き場は、PCで共通の置き場とログインユーザー個人用プラグインがある。

  • 共通プラグインにしたい場合は「qgis\python\plugins」にフォルダを作って、Pythonプログラムを置く。

OSGeo4Wをデフォルトインストールしているなら、「C:\OSGeo4W\apps\qgis\python\plugins」となる。

  •  個人用プラグインにしたい場合は「%USERPROFILE%\.qgis\python\plugins」に、以下同文

Windows7だったら、「C:\User\ユーザー名\.qgis\python\plugins」のようだ。
どっちにおいても、自分で使う分には変わらない。個人用でやってみよう。

とりあえず、DBtoWMSというフォルダを作った。

プラグインとして登録されるだけのプラグイン


Python歴3か月なので、よくわかっていないがPythonのパッケージとしてプラグインを作成する(あってる?)ので、まずはパッケージに必要な__init__.pyファイルを作成する。
ここのブログのソースコードの埋め方がわからん。みにくかったらすまん。中身こんなの、UTF-8で保存する。

# -*- coding: utf-8 -*-
”’
Comment
”’
def name():
return u”DB-WMS連携”
def description():
return u”DB-WMS連携”
def version():
return “1.0”
def qgisMinimumVersion():
return “1.8”
def authorName():
return “Sanada Kazushi”
def classFactory(iface):
from dbtowms import DBtoWMS
return DBtoWMS(iface)

一行目は、日本語を使うためのおまじない。この「# -*- coding: utf-8 -*-」を書いておく。定数の前に「u」をつけると日本語で定数が書けるu”定数の文字列”。変数の場合はunicode(変数, “UTF-8”)らしい。

classFactoryはプラグイン本体のオブジェクトを返すメソッドで、ここではDBtoWMSっていうクラスを返しますよ、ってことですね。ifaceパラメータは、プラグインからQGISにアクセスするためのインターフェースと思えばあっているんじゃなかろうか。

その他はプラグイン情報を返すメソッド群になる。name()はプラグイン名とかです。(Pythonってメソッドっていう言い方で良いの?Python用語の間違いが気に入らない方はスルーで。)
他のプラグイン情報にアイコンも指定出来るが、画像の準備があるので後日。

このままQGIS実行すると怒られる。あたりまえか、、classFactoryで呼び出すクラスDBtoWMSが無い。

なので同じフォルダに「dbtowms.py」ファイルを作成する。中身こんなの。

# -*- coding: utf-8 -*-
”’
Comments
”’
class DBtoWMS:
def __init__(self, iface):
self.iface = iface
def initGui(self):
pass
def unload(self):
pass

何もしないプログラムですまん。initGuiが初期化?unloadが終了時に呼ばれるらしいが、何もしないのでpassだ。

そんでQGIS実行。[プラグイン]メニュー から [プラグインの管理]を選択する。QGIS プラグインマネージャが起動する。そんで作ったプラグインが表示されている。
plugin01

うん、ちょろいな。。何もしていないとちょろい。

明日の努力目標
・ソースコードをブログに入れる方法を学ぶ。
・プラグインからダイアログを出す。ツールバーに登録。

AIS信号

AIS、船舶位置情報システムの仕事をしたのだけれど、AIS信号自体のことが気になったので調べた。ぐぐっても断片情報しか出てこなくて困ったけれど http://catb.org/gpsd/AIVDM.html にEricさんという方がまとめて下さっていた。

出典をちゃんとかけば連絡なしで使ってよいそうで、ありがたく使わせていただきました。

すべてを翻訳するのは大変そうなのでざっくり概要を掴むところ、良く使うTypeだけ翻訳してみました。

http://sanakazu.asia/ais/

IT技術者 真田のブログ