miércoles, 14 de junio de 2017

Obtener el valor de un atributo de una capa vectorial mediante un click del ratón con PyQGIS

Esto puede ser realizado mediante la clase QgsMapToolEmitPoint la cual permite generar, al inicio, las coordenadas de un punto a cada click del ratón en la Map View de QGIS. Estas coordenadas se emplean para generar un QgsPoint y comprobar posteriormente si está dentro o fuera de algún rasgo del vectorial. Si está dentro del feature, se recupera su id para acceder entonces al value del atributo empleando el nombre del campo correspondiente. El código completo se tiene 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
from qgis.gui import QgsMapToolEmitPoint

def display_point(point, mouse_button): 

    coords = "Map Coordinates: {:.4f}, {:.4f}".format(point.x(), point.y())

    print coords

    layer = iface.activeLayer()
    feats = [ feat for feat in layer.getFeatures() ]

    geo_pt = QgsGeometry.fromPoint(QgsPoint(point.x(), point.y()))

    id = -1

    for feat in feats:
        if geo_pt.within(feat.geometry()):
            id = feat.id()
            break

    if id != -1:
        print feats[id].attribute('name')
    else:
        print "no feature selected"

# a reference to our map canvas 
canvas = iface.mapCanvas() 

# this QGIS tool emits as QgsPoint after each click on the map canvas
pointTool = QgsMapToolEmitPoint(canvas)

pointTool.canvasClicked.connect(display_point)

canvas.setMapTool(pointTool)

Cuando se ejecuta el código anterior, cada click del ratón en el Map Canvas de QGIS imprime en la Python Console los valores de las coordenadas del punto y posteriormente el value del campo seleccionado (en la imagen siguiente se observa que éste corresponde a 'name'). La imagen a continuación también revela que los dos primeros puntos fueron clickeados fuera de cualquier rasgo y los restantes dentro de alguno de ellos. La tabla de atributos del vectorial permite corroborar que los del campo 'name' fueron obtenidos según lo esperado.


No hay comentarios: