waigani's diary

QGISを中心にFOSS4Gをいじくる

QGISでプラグインを作成する その6 rubberbandでの図形選択

真似します

また、山手様@月の杜工房にあったので真似させていただきました
QGIS API 要素を選択

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

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

ソース一覧

必要なソースは

 __init__.py
 sweeptest.py
 resources_rc.py

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

rubberbandの表示

QgsMapToolクラスを拡張して、rubberbandの表示を行います
rubberbandの表示には、QgsRubberBandクラスが用意されていますので使用します
マウスイベントの開始時、移動時、リリース時の動作を追加します

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

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

import resources_rc

class sweepTest:

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

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

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

        self.toolSweepSelect = QgsMapToolSweepSelect(self.iface.mapCanvas())

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

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

#QgsMapToolクラスを拡張
#canvasPressEventでrubberband開始
#canvasMoveEventでrubberbandの範囲変更
#canvasReleaseEventでrubberband範囲の図形選択
class QgsMapToolSweepSelect(QgsMapTool):
    def __init__(self, canvas):
        QgsMapTool.__init__(self, canvas)
        self.canvas = canvas
        self.rubberBand = QgsRubberBand(canvas, True)
        self.pressed = False

    def canvasPressEvent(self, event):
        ll = self.toMapCoordinates(QPoint(event.pos().x(), event.pos().y()))
        self.rubberBand.addPoint(ll, False)
        self.rubberBand.addPoint(ll, False)
        self.rubberBand.addPoint(ll, False)
        self.rubberBand.addPoint(ll, True)
        self.pressed = True
        
    def canvasMoveEvent(self, event):
        if self.pressed == True:
            ll = self.rubberBand.getPoint(0)
            ur = self.toMapCoordinates(QPoint(event.pos().x(), event.pos().y()))
            self.rubberBand.movePoint(1, QgsPoint(ll.x(), ur.y()))
            self.rubberBand.movePoint(2, ur)
            self.rubberBand.movePoint(3, QgsPoint(ur.x(), ll.y()))
    
    def canvasReleaseEvent(self, event):
        layer = self.canvas.currentLayer()        
        if layer == None or layer.type() != QgsMapLayer.VectorLayer:
            self.rubberBand.reset()
            self.pressed = False
            return

        layer.select(self.rubberBand.asGeometry().boundingBox(), False)
            
        self.rubberBand.reset(True)
        self.pressed = False

動作させると

rubberband範囲にかかるカレントレイヤーの図形が選択されます