Modificando plugin ‘Value Tool’ para incluir índices de fila, columna de un ráster

El plugin ‘Value Tool’ de QGIS es muy útil a la hora de corroborar si nuestras operaciones con ráster han funcionado de la manera adecuada. No obstante, una de las cosas que extraño es que no despliegue el índice de (filas, columna) que algunas veces se requiere también en las comprobaciones. Si se observa atentamente su ejecución nos daremos cuenta que, para todas las capas ráster cargadas en el regístro, el visor del plugin despliega, además del nombre y el value, las coordenadas correspondientes.

Las coordenadas, el vertice superior izquierdo del ráster y el tamaño (x, y) de los píxeles son los parámetros que permiten determinar los referidos índices de (fila, columna). La función ‘printInTable’, del archivo valuewidget.py en el plugin, es la encargada de imprimir en el visor el nombre y el value para cada píxel a medida que se mueve el cursor sobre el ráster. Sin embargo, a esta función, por defecto, no se le pasan como argumento referencias de la posición y las capas desplegadas en el registro. Como esta función está relacionada también con ‘showValues’, son cinco modificaciones que se tienen que hacer para que el plugin no de error cuando se le suministren ambos parámetros.

La porción de código siguiente da cuenta de algunas de las modificaciones sugeridas en la función ‘printInTable’ y el cálculo del índice de (fila, columna):

.
.
.
    def printInTable(self, position, layers):  #added
.
.
.
          #added******************************
          for layer in layers:
              xMin = layer.extent().xMinimum()
              yMax = layer.extent().yMaximum()
              xSize = layer.rasterUnitsPerPixelX()
              ySize = layer.rasterUnitsPerPixelY()
              
              posX = position.x()
              posY = position.y()
              
              row = int((yMax - posY)/ySize + 1)
              col = int((posX - xMin)/xSize + 1)
          
          #***********************************

          self.tableWidget.item(irow,0).setText(layername) 
          self.tableWidget.item(irow,1).setText(value)  
.
.
.

Cuando se recarga el plugin con ‘Reload Plugin’, tomando “prestados” como lugares de impresión de filas y columnas los campos “Layer” y “Value” del objeto QTableWidget, la adecuada disposición de los índices de fila y columna puede observarse en la imagen siguiente:

value_tool

Una vez realizada la comprobación, hay que añadir dos campos adicionales para imprimir de manera independiente los índices de fila, columna. Para ello hay que realizar 9 modificaciones en el archivo ui_valuewidgetbase.py que tienen relación con dos item adicionales del objeto QTableWidget. Una vez incorporadas las modificaciones, el resultado puede observarse en la imagen siguiente:

value_tool2

Para finalmente imprimir las filas y columnas en los campos correspondientes del QTableWidget hay que crearlos también en la función ‘printInTable’ del archivo valuewidget.py. La porción de código siguiente da cuenta de ello:

.
.
.
    def printInTable(self, position, layers):  #added

.
.
.
          if (self.tableWidget.item(irow,0)==None):
              # create the item
              self.tableWidget.setItem(irow,0,QTableWidgetItem())
              self.tableWidget.setItem(irow,1,QTableWidgetItem())
              self.tableWidget.setItem(irow,2,QTableWidgetItem()) #added
              self.tableWidget.setItem(irow,3,QTableWidgetItem()) #added
.
.
.
          self.tableWidget.item(irow,2).setText(str(row))  #added
          self.tableWidget.item(irow,3).setText(str(col))  #added
.
.
.

En la imagen siguiente se observa como se comportan todas las modificaciones realizadas.

value_tool3

Sólo faltan las excepciones, es decir, que imprima para los campos “Row” y “Column” el texto “out of extent”, cuando éste sea el caso, para el campo “Value” del ráster. El trozo de código a continuación las incluye:

.
.
.
    def printInTable(self, position, layers):  #added
.
.
.
          self.tableWidget.item(irow,0).setText(layername) 
          self.tableWidget.item(irow,1).setText(value)
          if value == 'out of extent': #added
              row = 'out of extent'    #added
              col = 'out of extent'    #added
          self.tableWidget.item(irow,2).setText(str(row))  #added
          self.tableWidget.item(irow,3).setText(str(col))  #added
          
          irow+=1
.
.
.

y funciona tal como se espera (ver imagen siguiente).

value_tool4

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

Una respuesta a Modificando plugin ‘Value Tool’ para incluir índices de fila, columna de un ráster

  1. Pingback: Modificando plugin ‘Value Tool’ de QGIS para incluir una QTextBrowser | 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