jueves, 15 de agosto de 2019

Oriented minimum bounding box con QgsGeometry en PyQGIS 3 (sin Processing)

En el post anterior se determinó la oriented minimum bounding box utilizando el algoritmo correspondiente. No obstante, además de en Processing, el método está también disponible en la clase QgsGeometry. Empleando esta última se desarrolló 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
registry = QgsProject.instance()

polygon = registry.mapLayersByName('polygon1')

feats_polygon = [ feat for feat in polygon[0].getFeatures() ]

geom_ombbox = [ feat.geometry().orientedMinimumBoundingBox() for feat in feats_polygon ]

epsg = polygon[0].crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer&field=area:double&field=angle:double&field=width:double&field=height:double&field=perimeter:double""&index=yes"

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

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(feats_polygon)) ]

for i, feat in enumerate(feats):
    perimeter = 2*geom_ombbox[i][3] + 2*geom_ombbox[i][4] 
    feat.setAttributes([i, geom_ombbox[i][1], geom_ombbox[i][2], geom_ombbox[i][3], geom_ombbox[i][4], perimeter])
    feat.setGeometry(geom_ombbox[i][0])

prov.addFeatures(feats)

registry.instance().addMapLayer(mem_layer)

Ejecutando el código anterior en la Python Console de QGIS, para el vectorial polygon1, se obtiene, tal como se esperaba, el resultado de la imagen siguiente:


La tabla de atributos, además del id, muestra los valores del área, ángulo de rotación, width, heigth y perímetro. Los nombres de los campos son idénticos, aunque no en el mismo orden, que los que se obtienen con Processing.

No hay comentarios: