6

Are there any procedures when working with QgsMapCanvas (pyqgis, qgis) in order to obtain a pair of coordinates by clicking on the map canvas?

Are there any sample Python codes that demonstrate this?

PolyGeo
  • 65,136
  • 29
  • 109
  • 338
Gabriel Asato
  • 485
  • 3
  • 12

2 Answers2

5

This example from http://www.qgisworkshop.org shows the components you would need to get what you want. It's for a slightly older version of QGIS but should be a good starting point.http://www.qgisworkshop.org/html/workshop/plugins_tutorial.html#implement-map-canvas-click-action

Github Repo: https://github.com/cugos/qgisworkshop_org

The code is copied from http://www.qgisworkshop.org/html/_static/activate_click_1.py

#This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License.
#http://creativecommons.org/licenses/by-sa/3.0/
#Feel free to use this material, but we ask that you please retain  attribution as per the license
#Copyright (C) 2011 CUGOS
#Copyright (C) 2011 Aaron Racicot
#Copyright (C) 2011 Greg Corradini
# Import the PyQt and QGIS libraries
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *
# Initialize Qt resources from file resources.py
import resources
# Import the code for the dialog
from vector_selectbypointdialog import vector_selectbypointDialog

class vector_selectbypoint:
    def __init__(self, iface):
        # Save reference to the QGIS interface
        self.iface = iface
        # refernce to map canvas
        self.canvas = self.iface.mapCanvas()
        # out click tool will emit a QgsPoint on every click
        self.clickTool = QgsMapToolEmitPoint(self.canvas)
        # create our GUI dialog
        self.dlg = vector_selectbypointDialog()

    def initGui(self):
        # Create action that will start plugin configuration
        self.action = QAction(QIcon(":/plugins/vector_selectbypoint/icon.png"), \
            "some text that appears in the menu", self.iface.mainWindow())
        # connect the action to the run method
        QObject.connect(self.action, SIGNAL("triggered()"), self.run)

        # Add toolbar button and menu item
        self.iface.addToolBarIcon(self.action)
        self.iface.addPluginToMenu("&some text that appears in the menu", self.action)

        # connect our custom function to a clickTool signal that the canvas was clicked
        result = QObject.connect(self.clickTool, SIGNAL("canvasClicked(const QgsPoint &, Qt::MouseButton)"), self.handleMouseDown)
        #QMessageBox.information( self.iface.mainWindow(),"Info", "connect = %s"%str(result) )

    def unload(self):
        # Remove the plugin menu item and icon
        self.iface.removePluginMenu("&some text that appears in the menu",self.action)
        self.iface.removeToolBarIcon(self.action)

    def handleMouseDown(self, point, button):
        self.dlg.clearTextBrowser()
        self.dlg.setTextBrowser( str(point.x()) + " , " +str(point.y()) )
        #QMessageBox.information( self.iface.mainWindow(),"Info", "X,Y = %s,%s" % (str(point.x()),str(point.y())) )

    # run method that performs all the real work
    def run(self):
        # make our clickTool the tool that we'll use for now
        self.canvas.setMapTool(self.clickTool)

        # show the dialog
        self.dlg.show()
        result = self.dlg.exec_()
        # See if OK was pressed
        if result == 1:
            # do something useful (delete the line containing pass and
            # substitute with your code
            pass
wildintellect
  • 501
  • 2
  • 8
  • Link only answers are not ideal for this forum because in time they may break. Please update your answer with additional content. – artwork21 Jul 22 '14 at 21:04
  • I've copied the code example from the site, which is also on github. Thankfully it was under a compatible CC license. – wildintellect Aug 20 '14 at 18:48
4

The following code returns a list of XY Coordinates of the region in a map canvas where clicked.

from qgis.gui import QgsMapToolEmitPoint

class PrintClickedPoint(QgsMapToolEmitPoint):
    def __init__(self, canvas):
        self.canvas = canvas
        QgsMapToolEmitPoint.__init__(self, self.canvas)

    def canvasPressEvent( self, e ):
        point = self.toMapCoordinates(self.canvas.mouseLastXY())
        point = list(point)
        print point

canvas_clicked = PrintClickedPoint( iface.mapCanvas() )
iface.mapCanvas().setMapTool( canvas_clicked )
raosaeedali
  • 707
  • 6
  • 21