Contar y extraer nodos (vértices) para vectoriales de línea o polígono mediante PyQGIS

Siguiendo con las pruebas mediante PyQGIS en esta oportunidad me tocó explorar, usando get_patt, los métodos de la clase QgsGeometry que tienen ‘vert’ o ‘Vert’ como parte de su texto. Los resultados fueron los siguientes:

>>>get_patt('ver',L)
['convertToMultiType', 'overlaps', 'vertexAt']
>>>get_patt('Ver',L)
['adjacentVertices', 'closestVertex', 'closestVertexWithContext', 'deleteVertex', 'insertVertex', 'moveVertex', 'sqrDistToVertexAt']

Centré mi atención en ‘vertexAt’ y después de leerme su documentación asumí que se podía usar para contar vértices en vectoriales tipo polilínea o polígono y extraer sus nodos como vectoriales de puntos. El método ‘vertexAt’, aplicado a objetos de la clase QgsGeometry, devuelve un objeto de la clase QgsPoint (sus coordenadas) desde el índice 0 hasta aquel que representa el número de vértices del vectorial correspondiente. Cuando el índice supera el número de vértices del vectorial entonces el QgsPoint devuelto es (0,0). El código propuesto es el siguiente:

ls = iface.mapCanvas()

layer=ls.currentLayer()

#select feature
layer.select(0)

feat = layer.selectedFeatures()[0]

#get geometry
geom = feat.geometry()

n=0

ver = geom.vertexAt(0)

points=[]

#count vertex and extract nodes
while(ver != QgsPoint(0,0)):
    print ver
    n +=1
    points.append(ver)
    ver=geom.vertexAt(n)
    
print "vertex number =",  n

#Extract CRS from route
CRS = layer.crs().postgisSrid()

URI = "Point?crs=epsg:"+str(CRS)+"&field=id:integer""&index=yes"

#create memory layer

mem_layer = QgsVectorLayer(URI,
                            "Points",
                            "memory")
                             
 
#add Map Layer to Registry
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
 
#Prepare mem_layer for editing
mem_layer.startEditing()

#Set feature
feature = QgsFeature()
 
#Set geometry
feature.setGeometry(QgsGeometry.fromMultiPoint(points))

#set attributes values 
for i in range(n):
 
    feature.setAttributes([i])
    mem_layer.addFeature(feature, True)
 
#stop editing and save changes
mem_layer.commitChanges()

layer.deselect(0)

#zoom to Active Layer
iface.zoomToActiveLayer()

Probando con diferentes vectoriales (polilínea y polígono para diferentes proyecciones) se obtuvieron resultados satisfactorios. A continuación algunas imágenes de las pruebas. Para un vectorial tipo polígono (WGS 84/UTM 19N):

vertex

donde el número de vértices es 15 (14 + 1) porque para un vectorial tipo polígono (o polilínea cerrada) el primer y último punto deben coincidir.

Para dos vectoriales tipo polílínea (WGS 84/UTM 12N):

vertex2

El resultado que se observa en la Python Console es para el vectorial ‘route’ que contiene 46 vértices.

Esta entrada fue publicada en Código Python, PyQGIS, SIG, Software Libre. Guarda el enlace permanente.

Una respuesta a Contar y extraer nodos (vértices) para vectoriales de línea o polígono mediante PyQGIS

  1. Pingback: Contar y extraer nodos (vértices) para v...

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