viernes, 6 de enero de 2017

Cómo escoger rasgos dentro de una cierta distancia de un rasgo seleccionado (vectorial de línea) mediante PyQGIS

Si se quieren determinar todos los ragos (features) que están dentro de 100 m de un rasgo seleccionado (de un vectorial de línea) se puede usar el código 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
layer = iface.activeLayer()

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

#selected feature fid = 0
geom_buffer = feats[0].geometry().buffer(100, -1)

#erasing selected feature in original list
del feats[0]

new_feats = [feat for feat in feats
             if feat.geometry().intersects(geom_buffer) ]

epsg = layer.crs().postgisSrid()

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

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

prov = mem_layer.dataProvider()

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

prov.addFeatures(new_feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)


Esto produce una memory layer con los rasgos que se ajustan a esta condición.

Para probar el código anterior se usó la capa de línea de la imagen siguiente; donde el rasgo seleccionado (id=0) fue previamente visualizado como buffer utilizando su formato WKT en el plugin QuickWKT de QGIS.



Después de correr el código anterior, la memory layer (capa roja en la imagen siguiente) se obtuvo tal como se esperaba:


No hay comentarios: