PyQGIS में माउस क्लिक के लिए प्रोग्रामिक रूप से जाँच करें?


19

मैं जानना चाहता हूं कि क्यूजीआईएस में माउस क्लिक की जांच कैसे करें। मैं एक अजगर प्लगइन लिखने की कोशिश कर रहा हूं और पहले से ही QGIS में मौजूद "सिलेक्ट सिंगल फीचर" टूल के समान कार्यक्षमता प्रदान करना चाहता हूं।

मैंने QGIS एपि डॉक्स की जांच की और पाया

QgsMapCanvas::CanvasProperties::mouseButtonDown

यह आशाजनक लगता है। मेरे पास एक QgsMapCanvas वस्तु है, लेकिन मैं नहीं देख सकता कि माउसबटनडाउन विशेषता का उपयोग कैसे किया जाए।

मैं क्यूजीआईएस एपीआई के लिए पूरी तरह से नया हूं।

जवाबों:


23

एक नया उपकरण बनाने के लिए सबसे अच्छा तरीका है जैसे चयन एकल सुविधा उपकरण QgsMapToolवर्ग से विरासत में मिला है । जब आपका टूल सक्रिय होता है, जिसका उपयोग करके सेट किया जा सकता है QgsMapCanvas::setMapTool, तो कोई भी कीबोर्ड या क्लिक की जाने वाली घटनाएँ आपके कस्टम टूल पर दी जाएगी।

यहाँ एक बुनियादी QgsMapToolवर्ग है

class PointTool(QgsMapTool):   
    def __init__(self, canvas):
        QgsMapTool.__init__(self, canvas)
        self.canvas = canvas    

    def canvasPressEvent(self, event):
        pass

    def canvasMoveEvent(self, event):
        x = event.pos().x()
        y = event.pos().y()

        point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)

    def canvasReleaseEvent(self, event):
        #Get the click
        x = event.pos().x()
        y = event.pos().y()

        point = self.canvas.getCoordinateTransform().toMapCoordinates(x, y)

    def activate(self):
        pass

    def deactivate(self):
        pass

    def isZoomTool(self):
        return False

    def isTransient(self):
        return False

    def isEditTool(self):
        return True

आप वह कर सकते हैं जिसकी आपको आवश्यकता है canvasReleaseEvent, आदि

इस उपकरण को सक्रिय करने के लिए आप बस करें:

tool = PointTool(qgis.iface.mapCanvas())
qgis.iface.mapCanvas().setMapTool(tool)

आपकी प्रतिक्रिया के लिए धन्यवाद। इसकी ठीक वही है जो मुझे चाहिए। हालांकि, जब मैं इस समाधान को लागू करने का प्रयास करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है class PointTool(QgsMapTool): NameError: name 'QgsMapTool' is not defined:। कोई विचार?
रोबर्ट

1
आपको from qgis.gui import QgsMapToolशीर्ष पर उपयोग करने की आवश्यकता होगी
नाथन डब्ल्यू

आखिरी सवाल ... फिर आप इस टूल को कैसे निष्क्रिय करेंगे?
रॉबर्ट रॉबर्ट

कुछ और, या करने के लिए maptool सेट करें NoneQgsMapCanvas.mapTool()आपके द्वारा किए जाने के बाद इसे पुनर्स्थापित करने का उपयोग करके उपयोगकर्ता ने जो चुना था, मैं उसे बचाऊंगा।
नाथन डब्ल्यू

@NathanW "कुछ और पर maptool सेट करने के लिए" का अर्थ यह भी है कि मैं उपकरण पट्टी पर 'पैन मैप' पर क्लिक करता हूं, है ना?
वणिक १२

3

मुझे लगता है कि आप QGIS "कैनवसक्लिप्ड" का उपयोग करने के संयोजन के साथ कर सकते हैं, लेकिन प्रतिक्रिया से निपटने के लिए SIGNAL / SLOTS भी:

result = QObject.connect(self.clickTool, SIGNAL("canvasClicked(const QgsPoint &, Qt::MouseButton)"), self.handleMouseDown)

देखने की कोशिश नहीं की, लेकिन आपको कुछ और जानकारी देनी चाहिए। यहां एक ट्यूटोरियल है जहां कोई बहुत ही मूल प्लगइन बनाने के लिए इसका उपयोग कर रहा है।


1
वे बिल्ट इन QgsMapToolEmitPointक्लास का उपयोग कर रहे हैं जो आपको एक टूल के लिए बुनियादी शुरुआत देगा। PyQt में संकेतों से जुड़ने का एक अच्छा तरीका इस वाक्य रचना का उपयोग कर रहा हैself.clickTool.canvasClicked.connect(self.handleMouseDown)
नाथन डब्ल्यू

1

कुछ इस तरह से प्रयास करें (यह एक बिंदु का चयन करना है):

def run(self):
    self.pointEmitter = QgsMapToolEmitPoint(self.iface.mapCanvas())
    QObject.connect( self.pointEmitter, SIGNAL("canvasClicked(const QgsPoint, Qt::MouseButton)"), self.selectNow)
    self.iface.mapCanvas().setMapTool( self.pointEmitter )

def selectNow(self, point, button):
  #QMessageBox.information(None, "Clicked coords", " x: " + str(point.x()) + " Y: " + str(point.y()) )

  layer = self.iface.activeLayer()
  if not layer or layer.type() != QgsMapLayer.VectorLayer:
     QMessageBox.warning(None, "No!", "Select a vector layer")
     return

  width = self.iface.mapCanvas().mapUnitsPerPixel() * 2
  rect = QgsRectangle(point.x() - width,
                      point.y() - width,
                      point.x() + width,
                      point.y() + width)

  rect = self.iface.mapCanvas().mapRenderer().mapToLayerCoordinates(layer, rect)

  layer.select([], rect)
  feat = QgsFeature()

  ids = []
  while layer.nextFeature(feat):
    ids.append( feat.id() )

  layer.setSelectedFeatures( ids )

मैं self.clickTool.canvasClicked.connect(self.handleMouseDown)सिंटैक्स का उपयोग संकेतों से जुड़ने के लिए करूँगा क्योंकि यह बहुत साफ है।
नाथन डब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.