Cómo crear multi polígonos a partir de pares de segmentos de recta mediante PyQGIS

En una pregunta en stackexchange.com se solicitaba, para ArcGis, cómo crear un polígono que conectara los puntos finales de líneas múltiples usando python. Me pareció fantástico el reto para probar también las bondades de PyQGIS.

Para producir mi código, creé primero el vectorial de segmentos de recta que se observa en la imagen siguiente y en cuya tabla atributiva se despliegan 12 features.

poliline1

La idea principal era que iterativamente, por pares de líneas, se conformaran polígonos de cuatro vértices que darían lugar a cada feature individual del vectorial multi polígono. Este algoritmo puede expresarse de una manera muy cómoda mediante una lista por comprensión de una sola línea (aunque en el código se presenta en dos por legibilidad). Todo el código elaborado se expresa a continuación:

layer = iface.activeLayer()

features = layer.getFeatures()

features = [feature for feature in features]

n = len(features)

geom = [feature.geometry().asPolyline() for feature in features ]

#multi lines as closed shapes
multi_lines = [[geom[i][0], geom[i][1], geom[i+1][1], geom[i+1][0], geom[i][0]]
               for i in range(n-1)]

#multi polygons
mult_pol = [[] for i in range(n-1)]

for i in range(n-1):
    mult_pol[i].append(multi_lines[i])

#creating a memory layer for multi polygon
crs = layer.crs()
epsg = crs.postgisSrid()

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

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

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

mem_layer.startEditing()

#Set features
feature = [QgsFeature() for i in range(n-1)]

for i in range(n-1):
    #set geometry
    feature[i].setGeometry(QgsGeometry.fromPolygon(mult_pol[i]))
    #set attributes values
    feature[i].setAttributes([i])
    mem_layer.addFeature(feature[i], True)

#stop editing and save changes
mem_layer.commitChanges()

Cuando se ejecuta en la Python Console de QGIS se obtiene lo siguiente:

poliline2

un vectorial multi polígono (de partes sencillas) con 11 features; tal como cabría de esperar.

En nuestro curso online de PyQGIS, abordaremos todas las cuestiones fundamentales relativas al manejo de datos Raster con Python y QGIS. Además, también tratamos la temática relativa a PyQGIS para el manejo de datos vectoriales y una introducción a la creación de plugins mediante el ‘Plugin Builder’.

PRÓXIMA SESIÓN EL 20 DE OCTUBRE

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