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:
Publicar un comentario