Cómo mover una capa vectorial con base en el centroide mediante PyQGIS

La translación, en geometría euclideana, es una función que mueve cada punto de un objeto una distancia constante en una dirección determinada. Es fácil de implementar en un SIG porque sólo hay que determinar el vector director (diferencia entre el punto al que se quiere mover el objeto y un punto cualquiera de éste) y sumarle sus componentes (x,y) a cada uno de los puntos que constituyen la geometría del objeto a mover.

Para las capas vectoriales, tipo polígono, de la imagen siguiente:

displaced1

se plantea mover la geometría de la izquierda (azul cyan) hasta la posición que ocupa la de la derecha de tal forma que sus centroides coincidan. El código que permite hacer esto se encuentra a continuación:

registry = QgsMapLayerRegistry.instance()

n = registry.count()

layers = registry.mapLayers().values() 

layers_names = [ layers[i].name() for i in range(n) ]

name1 = 'building1'
name2 = 'building2'

idx1 = layers_names.index(name1)
idx2 = layers_names.index(name2)

#features
feat1 = layers[idx1].getFeatures().next()
feat2 = layers[idx2].getFeatures().next()

#polygons geometry
pol1 = feat1.geometry().asPolygon() #polygon1
pol2 = feat2.geometry().asPolygon() #polygon2

#centroid coordinates
c1 = feat1.geometry().centroid().asPoint() #centroid1
c2 = feat2.geometry().centroid().asPoint() #centroid2

pol_t = pol1

n = len(pol_t[0])

#calculating displacement based in centroids
px = c2.x() - c1.x()
py = c2.y() - c1.y()

#translation as an affine transformation
for i in range(n):
    pol_t[0][i].setX(pol1[0][i].x() + px)
    pol_t[0][i].setY(pol1[0][i].y() + py)

#creating a memory layer for displaced polygon (building1)
crs = layers[1].crs()
epsg = crs.postgisSrid()

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

mem_layer = QgsVectorLayer(uri,
                           "building1_displaced",
                           "memory")

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

mem_layer.startEditing()

feat = QgsFeature()

#Set geometry
feat.setGeometry(QgsGeometry.fromPolygon(pol_t))

#set attributes values
feat.setAttributes([1])
mem_layer.addFeature(feat, True)

#stop editing and save changes
mem_layer.commitChanges()

Cuando se ejecuta en la Python Console de QGIS, se efectua la translación del objeto que es almacenado como una nueva capa de memoria (en rojo); tal como se observa en la imagen siguiente:

displaced2

Si se desea preservar de forma permanente esta nueva capa, se puede grabar como shapefile con la opción que se encuentra en ‘Properties’ de la memory layer.

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