domingo, 12 de enero de 2020

Clase plantilla con QDialog para visualizar las coordenadas del Map Canvas de QGIS con un click del ratón

En posts anteriores (1, 2, 3) se hizo referencia a la obtención de las coordenadas del Map Canvas de QGIS con un click del ratón mediante la clase QgsMapToolEmitPoint de PyQGIS. En esta nueva entrega vamos a emplear la simplificación producto de la utilización de una clase plantilla con QDialog para el mismo fin.

El código producido se encuentra a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from PyQt5.QtCore import Qt
from qgis.gui import QgsMapToolEmitPoint

class Dlg(QDialog):

    def __init__(self):
        QDialog.__init__(self)
        self.layout = QGridLayout(self)
        self.label1 = QLabel('Coordinates of map')
        self.line_edit = QLineEdit()
        self.line_edit.setFixedWidth(350)

        # Save reference to the QGIS interface
        self.iface = iface
        
        # a reference to our map canvas
        self.canvas = self.iface.mapCanvas() 
        # this QGIS tool emits as QgsPoint after each click on the map canvas
        self.pointTool = QgsMapToolEmitPoint(self.canvas)

        self.layout.addWidget(self.label1, 0, 0)
        self.layout.addWidget(self.line_edit, 1, 0)

        self.pointTool.canvasClicked.connect(self.display_point)
        self.canvas.setMapTool(self.pointTool)

    def display_point(self, point, button):
        # report map coordinates from a canvas click
        coords = "{}, {}".format(point.x(), point.y())
        self.line_edit.setText(str(coords)) 

w = Dlg()
w.setWindowTitle('Map Canvas Coordinates Visor')
w.setWindowFlags(Qt.WindowStaysOnTopHint)
w.show()

Después de ejecutado el script anterior en la Python Console de QGIS, el resultado puede ser visualizado en la imagen siguiente. Cada click del ratón con el ráster de referencia observado abajo permite recuperar en la QLineEdit embebida en el QDialog las coordenadas correspondientes del Map Canvas.


No hay comentarios: