viernes, 16 de agosto de 2019

Convex Hull con QgsGeometry en PyQGIS 3 (sin Processing)

En el post anterior se determinó la oriented minimum bounding box utilizando el método disponible en la clase QgsGeometry. Una ligera manipulación de ese código permite, para el mismo vectorial, determinar la Convex Hull que puede simplificar las geometrías tipo polígono. El código se presenta a continuación:

 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
registry = QgsProject.instance()

polygon = registry.mapLayersByName('polygon1')

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

geom_conv_hull = [ feat.geometry().convexHull() for feat in feats_polygon ]

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

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

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

prov = mem_layer.dataProvider()

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

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(geom_conv_hull[i])

prov.addFeatures(feats)

registry.instance().addMapLayer(mem_layer)

La ejecución del código anterior en la Python Console de QGIS hace posible el resultado de la imagen siguiente. Se puede observar que el vectorial subyacente presenta muchos menos vértices que aquel del cual se origina. Esta simplificación resulta útil para, por ejemplo, determinar con menos iteraciones la oriented minimum bounding box si se emplea directamente el algoritmo.


No hay comentarios: