9 votos

QGIS 3 Obtener coordenadas a partir del clic del ratón

Estoy trabajando en un pequeño plugin de QGIS Python y quiero obtener las coordenadas X/Y de un clic del usuario en el lienzo. Tengo un pequeño UI llamado desde un botón en una barra de herramientas. Después de llenar la UI con información me gustaría obtener las coordenadas XY. Estoy usando QGIS 3 con Python 3 y QT5.

He intentado utilizar los pasos de Cómo obtener las coordenadas de los puntos al hacer clic con el ratón en PyQGIS pero cuando se ejecuta salta directamente al final sin llamar a la función display_point y no hay reacción a los clics del ratón. ¿Hay algún cambio en la versión actual de QGIS?

Mi código, que está dentro de la clase del plugin y es llamado por un botón de la barra de herramientas sin UI.

def run2(self):
    # 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)
    # Checkpoint
    print("S 1")
    pointTool.canvasClicked.connect( self.display_point )
    canvas.setMapTool( pointTool )
    # Checkpoint
    print("S 3")

def display_point( pointTool ): 

    print('({:.4f}, {:.4f})'.format(pointTool[0], pointTool[1]))
    # Checkpoint
    print("S 2")

0 votos

Probaré la sugerencia de clase de : Cómo obtener coordenadas de puntos al hacer clic con el ratón en PyQGIS arriba en un corto plug in para ver cómo funciona.

3voto

Yada Puntos 9489

En un plugin (desplegado "Always On Top"), con PyQGIS 3, para evitar que salte justo al final sin llamar a la función display_point necesitas los siguientes cambios en tu código:

.
.
.
from PyQt5.QtCore import Qt

from qgis.gui import QgsMapToolEmitPoint
.
.
.
    def __init__(self, iface):
        """Constructor.
.
.
.
        # Create the dialog (after translation) and keep reference
        self.dlg = WhereAmIDialog()
        self.dlg.setWindowFlags(Qt.WindowStaysOnTopHint)
.
.
.
    def initGui(self):
        """Create the menu entries and toolbar icons inside the QGIS GUI."""
.
.
.       
        result = self.pointTool.canvasClicked.connect(self.display_point)
.
.
.
    def display_point(self, point, button):  
        # report map coordinates from a canvas click
        coords = "{}, {}".format(point.x(), point.y())
        self.dlg.lineEdit.setText(str(coords)) 
        self.dlg.show()
.
.
.
    def run(self):
        """Run method that performs all the real work"""
        # make our clickTool the tool that we'll use for now    
        self.canvas.setMapTool(self.pointTool)
.
.
.

Funciona; como se puede observar en la siguiente imagen:

enter image description here

0 votos

Gracias por su respuesta. El "point.x()" es el cambio importante ya que "pointTool[0]" da un error de índice.

0voto

DJYod Puntos 158

Creo que estás cerca: :)

He copiado y pegado el código del enlace a la respuesta de xunilk. Funcionó bien en la consola de Plugins/python.

Si estás usando el plugin, es posible que tengas que incluir 'self' en la definición del método. Además, el pointTool.canvasClicked.connect( self.display_point ) tiene que estar en algún lugar que sea "ejecutado" por el método principal. ¿Se imprime alguna vez "S 1"?

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 )

0 votos

Gracias por su respuesta. Probaré tu solución. "S 1" y "S 3" se muestran, "S 3" no.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X