En un post anterior se consideró la forma de obtener las coordenadas del Map Canvas mediante un click del ratón utilizando una clase personalizada en PyQGIS. Este procedimiento fue conducido a través de la Python Console. Sin embargo, en un plugin hay que saber ubicar la clase dentro del plugin y modificar los parámetros de entrada para que en lugar de imprimir a la Python Console lo haga, por ejemplo, en un elemento Qt como una QTextBrowser.
La necesidad de un plugin para ello es debido a que la oferta actual en QGIS 3 es limitada y este tipo de clase permite suplir el desempeño de uno que extraño de la versión anterior de QGIS: Value Tool (para obtener values de rásteres de manera dinámica).Aunque Value Tool emplea una QTableWidget, el código condesado referido al plugin desarrollado aquí (como prueba) satisface mis necesidades y se incluye 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | . . . from qgis.core import QgsRaster from qgis.gui import QgsMapToolEmitPoint . . . class PrintClickedPoint(QgsMapToolEmitPoint): def __init__(self, canvas, dlg): self.canvas = canvas self.dlg = dlg QgsMapToolEmitPoint.__init__(self, self.canvas) def canvasMoveEvent( self, e ): raster = self.canvas.currentLayer() try: provider = raster.dataProvider() extent = raster.extent() xSize = raster.rasterUnitsPerPixelX() ySize = raster.rasterUnitsPerPixelY() point = self.toMapCoordinates(self.canvas.mouseLastXY()) xmin, ymin, xmax, ymax = extent.toRectF().getCoords() row = int((ymax - point[1])/ySize) col = int((point[0] - xmin)/xSize) value = provider.identify(point, QgsRaster.IdentifyFormatValue).results()[1] message = '(row: {}, col: {}, value: {:.4f})'.format(row, col, value) self.dlg.textBrowser.setText(message) except AttributeError: message = "There is not raster layer" self.dlg.textBrowser.setText(message) except TypeError: message = "Out of raster extension" self.dlg.textBrowser.setText(message) . . . def add_action( . . . okBtn = self.dlg.okButton okBtn.clicked.connect( self.values ) return action . . . def values(self): self.canvas_clicked = PrintClickedPoint( self.iface.mapCanvas(), self.dlg) self.iface.mapCanvas().setMapTool( self.canvas_clicked ) def run(self): . . . |
En la imagen siguiente se observa el desempeño del plugin. De manera dinámica, con el movimiento del cursor, la QTextBrowser imprime los valores de los índices de fila y columna (el primer píxel corresponde al 0,0) y los values correspondiente a cada celda. Si nos movemos fuera de la extensión del ráster una excepción en el código lo advierte.
No hay comentarios:
Publicar un comentario