martes, 27 de febrero de 2018

Creando buffers cuadrados alrededor de puntos con PyQGIS3

Este es un tópico que ya sido considerado aquí pero con la versión anterior de QGIS. Lo rescato en este momento para que se observe que no toda la transición a la nueva versión es difícil. El único cambio en el código señala que la clase QgsMapLayerRegistry ha sido eliminada y sus prestaciones incluidas en QgsProject.

Como ya se señaló en su oportunidad, crear buffers cuadrados alrededor de puntos usando PyQGIS no es muy difícil. En la clase QgsGeometry existe el método (‘buffer’) y para ello sólo hay que seleccionar previamente todos los rasgos.

Para convertir el buffer circular en uno cuadrado sólo basta aplicar a la geometría el método ‘boundingBox’ y expresar el resultado en el formato WKT (Well Known Text). Estas geometrías pueden incorporarse fácilmente en una ‘memory layer’ para visualizar finalmente el resultado. El código completo (para crear buffers de 1000 m alrededor del punto) se encuentra a continuación. Incluye, además, la posibilidad de añadir a la tabla atributiva de la ‘memory layer’ campos con las coordenadas (x,y) y el id de cada punto.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
layer = iface.activeLayer()

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

epsg = layer.crs().postgisSrid()
 
uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer&field=x:real&field=y:real&field=point_id:integer""&index=yes"
 
mem_layer = QgsVectorLayer(uri,
                           'square_buffer',
                           'memory')
 
prov = mem_layer.dataProvider()
 
for i, feat in enumerate(feats):
    point = feat.geometry().asPoint()
    new_feat = QgsFeature()
    new_feat.setAttributes([i, point[0], point[1], feat.id()])
    tmp_feat = feat.geometry().buffer(1000, -1).boundingBox().asWktPolygon()
    new_feat.setGeometry(QgsGeometry.fromWkt(tmp_feat))
    prov.addFeatures([new_feat])
 
QgsProject.instance().addMapLayer(mem_layer)

La ejecución del código anterior en la Python Console de QGIS permite, para el vectorial de la imagen siguiente, comprobar que este produce los resultados esperados.


No hay comentarios: