jueves, 31 de agosto de 2017

Generando memory layer de bordes, para capa tipo polígono, e información de interacciones en tabla de atributos

El código que se presenta a continuación produce como salida una memory layer tipo MultiLineString para cada uno de los features que representen bordes entre los rasgos adyacentes de una capa tipo polígono single parts.

En la tabla de atributos de la MultiLineString se crean dos campos que albergan información de la interaccion entre los features, es decir, se imprimen los nombres de los rasgos adyacentes en la capa tipo polígono que dieron lugar al borde.

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from PyQt4.QtCore import QVariant
import itertools

layer = qgis.utils.iface.activeLayer()
epsg = layer.crs().postgisSrid()

vl = QgsVectorLayer("MultiLineString?crs=epsg:" + str(epsg), "Borders", "memory")
pr = vl.dataProvider()
pr.addAttributes([QgsField("NAME1", QVariant.String), QgsField("NAME2", QVariant.String)])
vl.updateFields()

for geom1,geom2 in itertools.combinations(layer.getFeatures(),r=2): 
    if geom1.geometry().intersects(geom2.geometry()):
        geom = geom1.geometry().intersection(geom2.geometry())
        fet = QgsFeature()
        fet.setGeometry(geom)
        fet.setAttributes([geom1.attribute('NAME'), geom2.attribute('NAME')])
        pr.addFeatures([fet])

vl.updateExtents()

QgsMapLayerRegistry.instance().addMapLayer(vl)

Después de ejecutar el código anterior en la Python Console de QGIS se obtiene el resultado que se visualiza en la imagen siguiente:


La tabla de atributos de la derecha corresponde a la capa original y la de la izquierda a la MultiLineString resultante. En la primera se observa el nombre de los rasgos tipo polígono que dieron lugar a cada feature tipo borde.

No hay comentarios: