Selección de rasgos (features), con PyQGIS, que aparecen sólo en la región visible del Map Canvas

Cuando se efectua un ‘Zoom In’ a una región particular de un archivo vectorial es posible, mediante código PyQGIS, realizar sólo la selección de los features que corresponden a la región visible del Map Canvas. Para ello, se recurre al método ‘extent’ de QgsMapCanvas que permite establecer un objeto de tipo QgsRectangle para dicha zona que luego, en forma de request, se pasa como filtro mediante el método ‘setFilterRect’ para obtener la referida selección.

Con el código a continuación se realiza el request a la zona correspondiente a la de la imagen siguiente; donde se tiene un ‘Zoom In’ al shapefile world_borders.

layer = iface.activeLayer()
mapcanvas = iface.mapCanvas()
rect = mapcanvas.extent()

request = QgsFeatureRequest().setFilterRect(rect)

selected_feats = layer.getFeatures(request)

attr = [ feat.attributes() for feat in selected_feats ]

print attr

print len(attr)

En la Python Console de la imagen siguiente se observa la impresión de sólo 77 atributos de los 3784 rasgos posibles en dicho shapefile.

request1

Por otra parte, con unas cuantas líneas más de código, tal como se tiene a continuación, se puede obtener una memory layer con el request correspondiente.

layer = iface.activeLayer()
mapcanvas = iface.mapCanvas()
rect = mapcanvas.extent()

request = QgsFeatureRequest().setFilterRect(rect)

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

attr = [ feat.attributes() for feat in layer.getFeatures(request) ]

print attr

print len(attr)

crs = layer.crs()
epsg = crs.postgisSrid()

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

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

prov = mem_layer.dataProvider()

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

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

El resultado de la ejecución del código anterior muestra, en la imagen siguiente, un ‘Zoom Out’ de la zona considerada para corroborar que el request produce una selección de rasgos que va un poco más allá de la zona visible. Estos rasgos corresponden a aquellos que son sólo parcialmente visibles con el ‘Zoom In’.

request2

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

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