6

I want to get x/y coordinates of a point on mouse click for a point and need to use those coordinates to evaluate other values as per other modules already define.

How can I get x/y coordinates on mouse click in QGIS and print those in PyQGIS?

Taras
  • 32,823
  • 4
  • 66
  • 137
sudhanshud
  • 401
  • 3
  • 9

1 Answers1

16

You need QgsMapToolEmitPoint class to do that. Following code works well for that purpose:

from qgis.gui import QgsMapToolEmitPoint

def display_point( pointTool ): 

    print '({:.4f}, {:.4f})'.format(pointTool[0], pointTool[1])

# a reference to our map canvas 
canvas = iface.mapCanvas() 

# this QGIS tool emits as QgsPoint after each click on the map canvas
pointTool = QgsMapToolEmitPoint(canvas)

pointTool.canvasClicked.connect( display_point )

canvas.setMapTool( pointTool )

However, if you prefer a class, following code can also be used:

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())
        print '({:.4f}, {:.4f})'.format(point[0], point[1])

canvas_clicked = PrintClickedPoint( iface.mapCanvas() )
iface.mapCanvas().setMapTool( canvas_clicked ) 
xunilk
  • 29,891
  • 4
  • 41
  • 80
  • 1
    This worked, thank you. May be you could add how to unset the listener: unsetMapTool(canvas_clicked) – Rodrigo E. Principe Jul 29 '19 at 14:11
  • When you try to use your own maptool in this case, it does not output anything to the console - is there are a reason for that? So lets say you set canvas.setMapTool( pointTool ) - it outputs noting to the console, yet the crosshair shows on the mapcanvas. Thanks @xunilk – user1655130 Nov 17 '20 at 19:22
  • I'm adding these lines to a function inside a plugin, and nothing happens... not even the crosshair. Error log is "NoneType: None" (I can keep working with the plugin, just the focus shifts from the plugin dialog to QGIS, that's all)... – S.E. Apr 21 '22 at 16:07