Plugin para determinar las coordenadas de píxel (fila, columna) mediante PyQGIS

Las coordenadas de píxel de un ráster, dadas las coordenadas de un punto sobre éste, pueden ser determinadas si se conocen las coordenadas de su vértice superior y su resolución (tamaño del píxel en las direcciones x, y). En un post pasado, se creó un plugin para capturar las coordenadas del Map Canvas con un click del ratón en QGIS por lo que su código puede servir como base para la creación del plugin deseado.

Faltaría incorporar una QgsMapLayerComboBox, con su filtro respectivo, para obtener a partir de la raster layer correspondiente las coordenadas de su vértice superior y su resolución. Una vez implementado el algoritmo, solo sería necesario desplegar los resultados a través de dos QLineEdit (una para las filas y otra para las columnas).

Las modificaciones se reseñan a continuación en el código condensado siguiente:

.
.
.
from qgis.gui import QgsMapToolEmitPoint, QgsMapLayerComboBox, QgsMapLayerProxyModel
.
.
.
    def __init__(self, iface):
        """Constructor.
.
.
.
        self.wcb = QgsMapLayerComboBox(self.dlg)
        self.wcb.move(155,27)
        self.wcb.setMinimumWidth(168)
        self.wcb.setFilters(QgsMapLayerProxyModel.RasterLayer)
.
.
.
    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))  #it is self.dlg.lineEdit #7
        self.dlg.show()
        
        layer = self.wcb.currentLayer()
        
        if layer is not None:
            
            width = layer.width()
            height = layer.height()
            
            xsize = layer.rasterUnitsPerPixelX()
            ysize = layer.rasterUnitsPerPixelY()
            
            extent = layer.extent()
            
            ymax = extent.yMaximum()
            xmin = extent.xMinimum()
            
            #row in pixel coordinates
            row = int(((ymax - point.y()) / ysize) + 1)

            #row in pixel coordinates
            column = int(((point.x() - xmin) / xsize) + 1)
            
            if row <= 0 or column <=0 or row > height or column > width:
                row = "out of extent"
                column = "out of extent"
                
        else:
            row = "no raster"
            column = "no raster"

        self.dlg.lineEdit_2.setText(str(row))
        
        self.dlg.lineEdit_3.setText(str(column))

    def run(self):
.
.
.

Contiene instrucciones que permiten desplegar advertencias de que no existe capa ráster o que se está fuera de la extensión de la misma.

En la imagen siguiente se tiene el plugin ya desplegado y registrando que para las coordenadas del visor éstas corresponden a la fila 358, columna 659 (la numeración de filas y columnas comienza desde 1) del ráster utah_demUTM2.

raster

A continuación se observa que en las QLineEdit se despliega la leyenda “out of extent” cuando las coordenadas del punto están fuera de la extensión del ráster.

raster2

Por último, el resultado (“no raster”) cuando no existe raster layer:

raster3

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

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