domingo, 21 de octubre de 2018

Selección avanzada de rasgos con objetos de QgsFeatureRequest en PyQGIS 3

El método 'getFeatures' de QgsVectorLayer también admite como argumento un objeto de la clase QgsFeatureRequest sobre el cual se le puede pasar un string (unicode) con una consulta o requerimiento tipo SQL con base en los campos de atributos. Esto permitirá seleccionar solo aquellos rasgos que satisfagan el requerimiento.

Para probar el código se va a usar el vectorial tipo polígono de la imagen siguiente:


El objetivo es seleccionar solo los rasgos que pertenezcan a la 'class = 4' de la tabla de atributos. El campo 'area' servirá para corroborar que la selección de rasgos fue la adecuada porque también se imprimirá con su id original.

El código completo es el siguiente:

 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
layer = iface.activeLayer()

request = QgsFeatureRequest().setFilterExpression (u'"class" = 4')

selected_feats = layer.getFeatures(request)

idx = [ feat.attributes()[0] for feat in selected_feats ]

iterator = layer.getFeatures(request)

feats = [ feat for feat in iterator ]

for feat in feats:
    area = feat.geometry().area()
    print (u"area[{}] = {:.2f}".format(idx[feats.index(feat)], area))

epsg = layer.crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri, 
                           'mem_layer', 
                           'memory')

prov = mem_layer.dataProvider()

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    mem_layer.addFeature(feat)

prov.addFeatures(feats)

QgsProject.instance().addMapLayer(mem_layer)

cuyo resultado (en color verde) después de la ejecución debería parecerse a lo siguiente:


El código es muy similar al que se usó en PyQGIS 2 en este otro post:

Selección avanzada de rasgos con objetos de QgsFeatureRequest en PyQGIS





No hay comentarios: