waigani's diary

QGISを中心にFOSS4Gをいじくる

QGISでプラグインを作成する その5 キャンバスクリック時のイベントを拾う

真似します

どうやってやるのか調べていたら、山手様@月の杜工房にあったので真似させていただきました
QGIS API キャンバスクリック時のイベントを処理する
解説は月の杜工房様を見た方が詳しいです

ソース一式を貼っておきます

この記事で作成したソース一式です
click_test.zip 直

ソース一覧

必要なソースは

 __init__.py
 clicktest.py
 dialog.py
 resources_rc.py
 ui_dialog.py

ですが、clicktest.pyの部分がイベントを拾うところなので、そこだけ載せます

キャンバスクリック時のイベントを拾う

キャンバスをクリックした際に、canvas内の座標と地理座標を取得して、dialogに表示するようにします
QgsMapCanvasクラスではマウスクリックのイベントを拾えません
QgsMapToolクラスを拡張して、キャンバスにセットして対応します

# -*- coding: utf-8 -*-

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *

import resources_rc

class clickTest:

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

    def initGui(self):
        self.action = QAction(QIcon(":icon/qgis-icon.png"), "click Test", self.iface.mainWindow())
        QObject.connect(self.action, SIGNAL("activated()"), self.run)

        self.iface.addToolBarIcon(self.action)
        self.iface.addPluginToMenu("&Click Test", self.action)

        self.toolClick = QgsMapToolClick(self.iface.mapCanvas())

    def unload(self):
        self.iface.removePluginMenu("&Click Test", self.action)
        self.iface.removeToolBarIcon(self.action)

    def run(self):
        canvas = self.iface.mapCanvas()
        canvas.setMapTool(self.toolClick)

#QgsMapToolクラスを拡張
#canvasPressEventに、キャンバス上の座標とその地理座標を表示する動作を追加
class QgsMapToolClick(QgsMapTool):
    def canvasPressEvent(self, event):
    
        #座標を表示するダイアログが作成されていない場合は作成
        if not hasattr(self, 'dlg'):
            from dialog import Dialog 

            self.dlg = Dialog()

        #キャンバス上の座標を取得
        dPos = event.pos()
        
        #地理座標へ変換
        mPos = self.toMapCoordinates(dPos)
        
        #ダイアログに座標を追加表示
        self.dlg.ui.textArea.append(str(dPos.x()) + "," + str(dPos.y()))
        self.dlg.ui.textArea.append(str(mPos.x()) + "," + str(mPos.y()))

        #ダイアログを表示して、一番上に持ってきます
        self.dlg.show()
        self.dlg.raise_()

動作させると

クリックした位置の座標が追記されていきます