5 votos

QGIS 3 Obtén coordenadas del clic del ratón

Estoy trabajando en un pequeño QGIS Python plugin y quieres obtener las coordenadas X/Y de que un usuario haga clic en el lienzo. Tengo una pequeña interfaz de usuario llamada de botón en una barra de herramientas. Después del llenado de la interfaz de usuario con la información que me gustaría obtener las coordenadas XY. Estoy usando QGIS 3 con Python 3 y dlls de qt5.

He intentado seguir los pasos del Cómo obtener co coordenadas de puntos en el mouse (ratón haga clic en PyQGIS pero cuando se ejecuta salta a la derecha hasta el final sin llamar a la display_point función, y no hay reacción a los clicks del ratón. ¿Hay algún cambio en la actual versión de QGIS?

Mi código, que está en el interior del plugin de clase y llamado por un botón de la barra de herramientas sin interfaz de usuario.

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")

5voto

DJYod Puntos 158

Creo que estás cerca: :)

Copié y pegué el código del enlace a la respuesta de xunilk. Funcionó bien en la consola de Plugins / python.

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

 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 )
 

3voto

Yada Puntos 9489

En un complemento (que se muestra "Siempre en la parte superior"), con PyQGIS 3, para evitar que salte hasta el final sin llamar a la función display_point, necesita los siguientes cambios en su 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:

introduzca la descripción de la imagen aquí

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: