sábado, 1 de diciembre de 2018

Uso de la clase QgsMapToolIdentifyFeature para obtener los atributos de un archivo vectorial y resaltarlos mediante objetos de la clase QgsRubberBand

La clase QgsMapToolIdentifyFeature permite, mediante un click del ratón, obtener información acerca de los rasgos de un archivo vectorial y mediante objetos de la clase QgsRubberBand se puede resaltar la selección para hacerla reconocible y más atractiva visualmente. No obstante, las rubber band tienen que ser removidas adecuadamente mediante código porque sino persisten en el Map Canvas y es imposible eliminarlas si se pierde la referencia a ellas teniendo que reiniciar QGIS.

El código siguiente emplea una lista, en lugar de un diccionario, para almacenar simultáneamente el id del rasgo y las referencias a las rubber bands del feature seleccionado mediante click del ratón para facilitar luego su remoción una vez que se seleccione otro rasgo.

 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
from qgis.gui import QgsRubberBand, QgsMapToolIdentifyFeature
from PyQt5.QtGui import QColor

def onFeatureIdentified(feature):
    fid = feature.id()
    rbList.append( [feature.id(), QgsRubberBand(iface.mapCanvas(), True)])

    print ("feature selected : " + str(fid))

    for i, item in enumerate(feature.attributes()):
        print (feature.fields().names()[i] + ": " + str(item))

    if len(rbList) == 2:
        iface.mapCanvas().scene().removeItem(rbList[0][1])
        del rbList[0]

    rbList[0][1].setColor( QColor( 'red' ) )
    rbList[0][1].setWidth( 5 )
    rbList[0][1].addGeometry(feature.geometry(), None) 

rbList = [] # To store the created rbs and feature ids

layer = iface.activeLayer()
mc=iface.mapCanvas()
mapTool = QgsMapToolIdentifyFeature(mc)
mapTool.setLayer(layer)
mc.setMapTool(mapTool)
mapTool.featureIdentified.connect(onFeatureIdentified)

El código anterior se probó con un vectorial tipo polígono y después de ejecutado en la Python Console se seleccionó al azar un rasgo, tal como se presenta en la imagen siguiente, donde se observa la creación de la rubber band correspondiente (anillo de color rojo) y en la Python Console se imprimen todos los atributos referentes a ese feature.


Cuando se hace click en otro rasgo se observa en la imagen siguiente, tal como era esperado, que la rubber band anterior es adecuadamente removida y se crea la correspondiente al feature recien clickeado. En la Python Console se imprimen todos los valores de los campos para el atributo seleccionado que se encuentran presentes en la tabla de atributos.


La instrucción para remover manualmente en la Python Console la última rubber band es la siguiente:

1
iface.mapCanvas().scene().removeItem(rbList[0][1])



No hay comentarios: