Cómo producir buffers, alrededor de puntos, con diferentes números de lados en PyQGIS

Los buffers circulares son la forma más extendida para producir este tipo de zonas alrededor de puntos. No obstante, es posible cualquier forma poligonal. La manera más sencilla de producirlos es modificando el segundo parámetro del método ‘buffer’ de la clase QgsGeometry de PyQGIS. Sin embargo, esto sólo produce polígonos con lados que son múltiplos de 4. Para producir polígonos con valores intermedios de lados (por supuesto, de 3 en adelante) modifiqué un procedimiento que emplea el método ‘linspace’ de la librería numpy de Python.

El código completo para producir buffers pentagonales (con radio de 1000 m) es el siguiente:

import numpy as np

bufferLength = 1000
polygonSides = 5

layer = qgis.utils.iface.activeLayer()

points = [ feat.geometry().asPoint() for feat in layer.getFeatures() ]

epsg = layer.crs().postgisSrid()

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

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

prov = mem_layer.dataProvider()

for i, point in enumerate(points):
    outFeat = QgsFeature()

    outFeat.setGeometry(QgsGeometry.fromPolygon([[ QgsPoint(point[0] + np.sin(angle)*bufferLength, point[1] + np.cos(angle)*bufferLength)
                        for angle in np.linspace(0, 2*np.pi, polygonSides, endpoint = False) ]]))
    
    outFeat.setAttributes([i])
    prov.addFeatures([outFeat])

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Después de ejecutado en la Python Console de QGIS se obtiene:

buffers1

Por otra parte, si en lugar de polígonos se desean polilíneas, el código siguiente logra el efecto deseado.

import numpy as np

bufferLength = 1000
polygonSides = 5

layer = qgis.utils.iface.activeLayer()

points = [ feat.geometry().asPoint() for feat in layer.getFeatures() ]

epsg = layer.crs().postgisSrid()

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

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

prov = mem_layer.dataProvider()

for i, point in enumerate(points):
    outFeat = QgsFeature()

    outFeat.setGeometry(QgsGeometry.fromPolyline([ QgsPoint(point[0] + np.sin(angle)*bufferLength, point[1] + np.cos(angle)*bufferLength)
                        for angle in np.linspace(0, 2*np.pi, polygonSides + 1, endpoint = True) ]))
    
    outFeat.setAttributes([i])
    prov.addFeatures([outFeat])

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Después de ejecutado en la Python Console de QGIS se obtiene lo siguiente:

buffer2

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

Una respuesta a Cómo producir buffers, alrededor de puntos, con diferentes números de lados en PyQGIS

  1. Pingback: Cómo producir rejillas (grid) hexagonales mediante PyQGIS | El Blog de José Guerrero

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