9 votos

Contar el número de vértices del objeto en la capa vectorial PyQGIS

En primer lugar, quiero decir que sé que ya se ha planteado una cuestión similar, pero no se ha dado una solución satisfactoria.

Necesito obtener el número de vértices de cada objeto en la capa de líneas vectoriales. Basándome en este artículo: https://joseguerreroa.wordpress.com/2014/07/28/contar-y-extraer-nodos-vertices-para-vectoriales-de-linea-o-poligono-mediante-pyqgis/

Hice este código:

layer = qgis.utils.iface.activeLayer()
feat = layer.getFeatures()
for feature in feat:
    geom = feature.geometry()

n = 1
ver = geom.vertexAt(0)
points=[]

while(ver != QgsPoint(0,0)):
    n +=1
    points.append(ver)
    ver = geom.vertexAt(n)

print n

Y como resultado obtengo el número de vértices, pero sólo del último objeto. Supongo que me falta un bucle while en la capa (para obtener el número de cada objeto), ¿tengo razón? Pero no sé cómo debería quedar.

Sé que existe el plugin "Contador de vértices", pero no funciona (ni siquiera se inicia) en mi caso (QGIS 2.12, Win 8.1). Y necesito que se haga en Python.

Por cierto, ¿no creen que es ridículamente difícil obtener el número de vértices mientras que es tan fácil obtener las coordenadas de cada vértice?

EDITAR: @nwduncan ( @ArMoraer también) sugirió arreglar una sangría, y fue una buena pista. Me he dado cuenta de que la consola de Python necesita refrescarse, porque a veces no puede manejar las sangrías. Espero que ayude a otros principiantes. El código final es:

layer = qgis.utils.iface.activeLayer()
feat = layer.getFeatures()
for feature in feat:
    geom = feature.geometry()
    n   = 1
    ver = geom.vertexAt(0)
    points=[]

    while(ver != QgsPoint(0,0)):
        n +=1
        points.append(ver)
        ver=geom.vertexAt(n)

    print n

1 votos

No estoy familiarizado con pyqgis, pero puedo ver en tu código que tu bucle feature in feat está asignando el objeto de geometría a la variable geom y luego sobrescribiéndolo con el siguiente objeto de geometría sin contar realmente las vértices. Intenta sangrar las líneas 6-15 para que se sitúen debajo del bucle for featuer in feat.

0 votos

Lo intenté antes y me salieron muchos errores de 'sangría inesperada'. Pero... como estaba un poco frustrado seguí tu consejo. Así que de nuevo, cambié la sangría y esta vez lo guardé en un nuevo archivo y ¡funcionó! Creo que el problema fue que la consola de QGIS Python no es perfecta y guardar el código en un nuevo archivo de alguna manera ayudó. Ni idea de cómo, pero lo hizo :) ¡Gracias por la pista!

1 votos

Si sólo eres nuevo en Python yo evitaría los bucles while si puedes. Es muy fácil entrar en un bucle infinito. También QgsPoint(0,0) es un punto válido en algunas proyecciones.

7voto

ArMoraer Puntos 338

Indentación.

La primera parte de tu código es correcta, pero el resto se puede simplificar mucho si sólo quieres el número de vértices:

layer = qgis.utils.iface.activeLayer()
feat = layer.getFeatures()

for feature in feat:
    if feature.geometry().isMultipart(): # new part for multipolylines
        vertices = feature.geometry().asMultiPolyline()
        print [len(v) for v in vertices]
    else:
        vertices = feature.geometry().asPolyline()
        n = len(vertices)
        print n

Si también quieres las coordenadas de los vértices, entonces puedes escribir (sólo polilíneas):

layer = qgis.utils.iface.activeLayer()
feat = layer.getFeatures()

for feature in feat:
    vertices = feature.geometry().asPolyline()
    points = []

    for v in vertices:
        points.append(v)

0 votos

Muchas gracias. El código que escribiste funciona para Polyline. He probado lo mismo para MultiPolyline vertices = feature.geometry().asPolyline() a vertices = feature.geometry().asMultiPolyline() No cuenta el número de vértices sino que imprime una especie de números aleatorios (no puedo relacionarlo con ningún dato que tenga)

0 votos

Vale, he editado mi primer guión. Ahora debería funcionar para MultiPolylines.

3voto

NickGPS Puntos 123

En QGIS 2.14, una nueva función para contar vértices está disponible en el field calculator :

Field calculator in QGIS 2.14

1voto

Ivan Petrushev Puntos 158

Otro enfoque será utilizar una expresión definida por el usuario. El motor de expresión hará un bucle de la capa para usted. El blog de Nathans tiene una buena demostración al respecto:

http://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/

from qgis.utils import qgsfunction
from qgis.core import QGis

@qgsfunction(0, "Python")
def vertices(values, feature, parent):
    """
        Returns the number of vertices for a features geometry
    """
    count = None
    geom = feature.geometry()
    if geom is None: return None
    if geom.type() == QGis.Polygon:
        count = 0
        if geom.isMultipart():
          polygons = geom.asMultiPolygon()
        else:
          polygons = [ geom.asPolygon() ]
        for polygon in polygons:
          for ring in polygon:
            count += len(ring)
    return count

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X