Creando un plugin para capturar las coordenadas del Map Canvas con un click del ratón en QGIS

En un post anterior, escrito ya hace un buen tiempo, se hizo una descripción introductoria de como utilizar el ‘Plugin builder’ como plantilla para desarrollar plugins en QGIS. El proceso quedó detenido en la modificación de la interface gráfica y en la adición del código para capturar las coordenadas del Map Canvas con un click del ratón; algo que se completará a continuación.

Este código fue inicialmente propuesto por Gary Sherman en su libro “The PyQGIS Programmer’s Guide: Extending QGIS 2.x with Python”. Sin embargo, si se bajan de Internet la muestra del plugin que acompaña el libro y lo instalan en las nuevas versiones de QGIS ni lo reconoce. Las explicaciones acerca de la justificación del código las tienen en el libro. No obstante, si no tienen acceso a éste pueden encontrar la misma argumentación en este tutorial:

http://www.qgisworkshop.org/html/workshop/plugins_tutorial.html

La imagen siguiente refiere la modificación en el Qt Designer de la forma por defecto que crea el ‘Plugin Builder’. Lo más relevante es que se eliminó el buttonBox (OK, Cancel) y se sustituyó por un pushButton con sólo Cancel (lo mismo hubiese sido alcanzado si en el ‘Property Editor’ se desmarca el botón OK de la buttonBox).

plugin1

Las adaptaciones/modificaciones del código generado con el ‘Plugin Builder’ son 8 en total y se reseñan a continuación comentadas y en contexto; para que sean más fáciles las comparaciones.

Las dos primeras:

.
.
.
class WhereAmI:
    """QGIS Plugin Implementation."""

    def __init__(self, iface):
        """Constructor.

        :param iface: An interface instance that will be passed to this class
            which provides the hook by which you can manipulate the QGIS
            application at run time.
        :type iface: QgsInterface
        """
        # Save reference to the QGIS interface
        self.iface = iface
        
        # a reference to our map canvas  (modification 1)
        self.canvas = self.iface.mapCanvas() 
        # this QGIS tool emits as QgsPoint after each click on the map canvas (modification 2)
        self.pointTool = QgsMapToolEmitPoint(self.canvas)
        
        # initialize plugin directory
        self.plugin_dir = os.path.dirname(__file__)
        # initialize locale
        locale = QSettings().value('locale/userLocale')[0:2]
        locale_path = os.path.join(
            self.plugin_dir,
            'i18n',
            'WhereAmI_{}.qm'.format(locale))

        if os.path.exists(locale_path):
            self.translator = QTranslator()
            self.translator.load(locale_path)

            if qVersion() > '4.3.3':
                QCoreApplication.installTranslator(self.translator)

        # Create the dialog (after translation) and keep reference
        self.dlg = WhereAmIDialog()

        # Declare instance attributes
        self.actions = []
        self.menu = self.tr(u'&Where Am I?')
        # TODO: We are going to let the user set this up in a future iteration
        self.toolbar = self.iface.addToolBar(u'WhereAmI')
        self.toolbar.setObjectName(u'WhereAmI')
.
.
.

La tercera:

.
.
.
from PyQt4.QtCore import QSettings, QTranslator, qVersion, QCoreApplication
from PyQt4.QtGui import QAction, QIcon, QMessageBox

from qgis.gui import *  #(modification 3)

# Initialize Qt resources from file resources.py
import resources_rc
# Import the code for the dialog
from where_ami_dialog import WhereAmIDialog
import os.path
.
.
.

La cuarta y la quinta:

.
.
.
    def initGui(self):
        """Create the menu entries and toolbar icons inside the QGIS GUI."""

        icon_path = ':/plugins/WhereAmI/icon.png'
        self.add_action(
            icon_path,
            text=self.tr(u'Where Am I?'),
            callback=self.run,
            parent=self.iface.mainWindow())

        result = self.pointTool.canvasClicked.connect(self.display_point)  #modification4
        QMessageBox.information( self.iface.mainWindow(),"Info", "connect = %s"%str(result) )    #modification 5
.
.
.

Las tres últimas (6, 7 y 8):

.
.
.
    def unload(self):
        """Removes the plugin menu item and icon from QGIS GUI."""
        for action in self.actions:
            self.iface.removePluginMenu(
                self.tr(u'&Where Am I?'),
                action)
            self.iface.removeToolBarIcon(action)
        # remove the toolbar
        del self.toolbar


    def display_point(self, point, button):   #6
        # report map coordinates from a canvas click
        self.dlg.hide()
        coords = "{}, {}".format(point.x(), point.y())
        self.dlg.lineEdit.setText(str(coords))  #it is self.dlg.lineEdit #7
        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    #8
        self.canvas.setMapTool(self.pointTool)
        # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result:
            # Do something useful here - delete the line containing pass and
            # substitute with your code.
            pass

Se tiene una visión completa del código aquí:

Cuando se ejecuta el plugin, se debería tener un resultado equivalente al de la imagen siguiente:

plugin2

Las coordenadas capturadas son del click en “algún lugar” del territorio español.

Esta entrada fue publicada en Plugin, PyQGIS, QGIS, Software Libre. Guarda el enlace permanente.

2 respuestas a Creando un plugin para capturar las coordenadas del Map Canvas con un click del ratón en QGIS

  1. Pingback: Newsletter Octubre 2015 | El Blog de José Guerrero

  2. Pingback: Plugin para determinar las coordenadas de píxel (fila, columna) mediante PyQGIS | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s