Rotación de archivos vectoriales con método ‘rotate’ de QgsGeometry en PyQGIS

En posts anteriores (1, 2) se emplearon los conceptos del álgebra líneal para producir código (incluyendo plugins) que rotaba diferentes tipos de archivos vectoriales (punto, línea y polígono). Estos códigos permitían la rotación individual de cada rasgo y su recomposición final bajo la forma de una memory layer.

En la clase QgsGeometry de PyQGIS existe el método ‘rotate’ que realiza esta labor en el sentido de las agujas del reloj. Sin embargo, si se trata de aplicar a los rasgos individuales de cada vectorial (lo que se da en llamar de “partes sencillas” o “single part”), QGIS hace “crash” y se cierra de manera abrupta. Sólo funciona de manera adecuada si el vectorial es Multi Part (múltiples rasgos y un sólo registro para todos ellos); tal como el de la imagen siguiente:

rotate1

El código a continuación permite rotar el vectorial de la imagen anterior 60 grados en sentido antihorario alrededor de un punto situado aproximadamente en el centro del feature de la izquierda. El resultado se almacena en una memory layer que puede ser convertida directamente a “single part” antes de ser guardada como shapefile.

# select the active layer
layer = iface.activeLayer()

# get feature of the layer
feature = layer.getFeatures().next()

print feature

geom = feature.geometry()

print geom

pt = QgsPoint(412573.453889, 4447678.2183)

geom.rotate(-60, pt)

#Extract CRS from route
CRS = layer.crs().postgisSrid()
 
URI = "Polygon?crs=epsg:"+str(CRS)+"&field=id:integer""&index=yes"
 
#Create polygon layer for buffer
mem_layer = QgsVectorLayer(URI,
                        "rotated",
                        "memory")
 
#add Map Layer to Registry
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
 
#Prepare mem_layer for editing
mem_layer.startEditing()
 
#Set feature for rotated layer
feat = QgsFeature()
 
#Set geometry for rotated layer
feat.setGeometry(geom)
 
#set attributes values for rotated layer
feat.setAttributes([1])
  
mem_layer.addFeature(feat, True)
 
#stop editing and save changes
mem_layer.commitChanges()

A continuación, la imagen refleja la ejecución del código anterior en la Pyton Console.

rotate2

La capa rotada también admite rotación; tal como se puede observar en la imagen siguiente:

rotate3

Esta entrada fue publicada en PyQGIS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s