sábado, 10 de agosto de 2019

Utilizando "boundingboxes" en PyQGIS 3 Processing

En el post anterior se consideró la rotación de rasgos de una capa vectorial, en sentido horario, un angulo determinado a partir de un punto de rotación; que si no se especifica se toma como el centroide por defecto. El ángulo no era arbitrario. Su valor corresponde a aquel que la recta de la figura siguiente mantiene con el eje X.


El objetivo es obtener la longitud de la capa vectorial proyectada sobre la recta respectiva y ello se determina fácilmente a partir de la geometría de la bounding box del vectorial rotado. El código a continuación determina las coordenadas del centroide del vectorial a rotar, ejecuta la rotación y salva el vectorial rotado en disco, usa la capa resultante para producir su bounding box pero esta vez almacenada en memoria para, finalmente, rotarla en sentido contrario y exhibirla en la Map View de QGIS.

 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import processing

registry = QgsProject.instance()

polygon1 = registry.mapLayersByName('polygon1')
angle = 26.081262365320853

feat = [ feat for feat in polygon1[0].getFeatures() ]

X = feat[0].geometry().centroid().asPoint()[0]
Y = feat[0].geometry().centroid().asPoint()[1]

anchor = str(X) + "," + str(Y)

parameters = { 'ANCHOR' : anchor, 
               'ANGLE' : angle, 
               'INPUT' : polygon1[0], 
               'OUTPUT' : '/home/zeito/pyqgis_data/rotated.shp' }

tmp = processing.run("native:rotatefeatures", parameters)

rotated = QgsVectorLayer(tmp['OUTPUT'], 'rotated', 'ogr')
provider = rotated.dataProvider()

path = provider.dataSourceUri().split('|')[0]

parameters = { 'INPUT' : path, 
               'OUTPUT' : 'memory' }

tmp = processing.run("native:boundingboxes", parameters)

bbox = QgsVectorLayer(tmp['OUTPUT'], 'bbox', 'ogr')

for feat in bbox.getFeatures():
 print( feat.geometry().boundingBox().width())

parameters = { 'ANCHOR' : anchor, 
               'ANGLE' : -angle, 
               'INPUT' : bbox, 
               'OUTPUT' : 'memory' }
               
tmp = processing.runAndLoadResults("native:rotatefeatures", parameters)

El resultado de ejecución del código anterior se puede observar en la imagen siguiente. Además, imprime en la Python Console el valor de 66217.6143791941 que corresponde a la longitud del vectorial proyectado sobre la recta.


No hay comentarios: