Zählen der Anzahl der Eckpunkte des Objekts auf der Vektorebene PyQGIS

8

Zunächst möchte ich sagen, dass ich weiß, dass ein ähnliches Problem bereits früher angesprochen wurde, aber keine zufriedenstellende Lösung bot.

Ich muss die Anzahl der Eckpunkte jedes Objekts auf der Vektorlinienebene ermitteln. Basierend auf diesem Artikel: https://joseguerreroa.wordpress.com/2014/07/28/contar-y-extraer-nodos-vertices-para-vectoriales-de-linea-o-poligono-mediante-pyqgis/

Ich habe diesen Code gemacht:

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

Und als Ergebnis erhalte ich die Anzahl der Eckpunkte, aber nur des letzten Objekts. Ich vermisse wohl eine while-Schleife auf der Ebene (um die Nummer für jedes Objekt zu erhalten), habe ich Recht? Aber ich weiß nicht, wie es aussehen soll.

Ich weiß, dass es ein 'Vertices Counter'-Plugin gibt, aber es funktioniert in meinem Fall nicht (startet nicht einmal) (QGIS 2.12, Win 8.1). Und ich muss es in Python machen.

Denken Sie übrigens nicht, dass es lächerlich schwierig ist, die Anzahl der Scheitelpunkte zu ermitteln, während es so einfach ist, die Koordinaten jedes Scheitelpunkts zu ermitteln?

BEARBEITEN: @nwduncan (auch @ArMoraer) schlug vor, eine Einrückung zu korrigieren, und es war ein guter Hinweis. Ich habe festgestellt, dass die Python-Konsole aktualisiert werden muss, da sie manchmal keine Einrückungen verarbeiten kann. Hoffe es wird anderen Anfängern helfen. Der endgültige Code lautet:

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
Antonio
quelle
1
Ich bin mit pyqgis nicht vertraut, aber ich kann anhand Ihres Codes erkennen, dass Ihr Feature in der feat-Schleife das Geometrieobjekt der Geomvariablen zuweist und es dann mit dem nächsten Geometrieobjekt überschreibt, ohne die Verticies tatsächlich zu zählen. Versuchen Sie, die Zeilen 6-15 einzurücken, damit sie unter der for featuer in feat-Schleife sitzen.
Nwduncan
Ich habe es schon einmal versucht und viele "unerwartete Einrückungsfehler" erhalten. Aber ... weil ich ein bisschen frustriert war, bin ich deinem Tipp gefolgt. Also habe ich den Einzug wieder geändert und dieses Mal in einer neuen Datei gespeichert und es hat funktioniert! Ich denke, das Problem war, dass die QGIS Python-Konsole nicht perfekt ist und das Speichern von Code in einer neuen Datei irgendwie geholfen hat. Keine Ahnung wie, aber es tat :) Danke für den Hinweis!
Antonio
1
Wenn Sie nur neu in Python sind, würde ich die while-Schleifen vermeiden, wenn Sie können. Sehr einfach, sich in eine Endlosschleife zu begeben. Auch QgsPoint(0,0)ist ein gültiger Punkt in einigen Projektionen.
Nathan W

Antworten:

4

Vertiefung.

Der erste Teil Ihres Codes ist korrekt, aber der Rest kann erheblich vereinfacht werden, wenn Sie nur die Anzahl der Scheitelpunkte möchten:

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

Wenn Sie auch die Koordinaten der Eckpunkte möchten, können Sie schreiben (nur Polylinien):

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

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

    for v in vertices:
        points.append(v)
ArMoraer
quelle
Vielen Dank. Der von Ihnen geschriebene Code funktioniert für Polyline. Ich habe versucht , das gleiche für MultiPolyline vertices = feature.geometry().asPolyline()bis vertices = feature.geometry().asMultiPolyline()es nicht Anzahl der Ecken zählt aber Art von Zufallszahlen drucken (Ich kann es nicht zu irgendwelchen Daten ich habe)
Antonio
Ok, ich habe mein erstes Skript bearbeitet. Es sollte jetzt für MultiPolylines funktionieren.
ArMoraer
2

In QGIS 2.14 ist eine neue Funktion zum Zählen von Scheitelpunkten verfügbar in field calculator:

Feldrechner in QGIS 2.14

Etrimaille
quelle
1

Ein anderer Ansatz besteht darin, einen benutzerdefinierten Ausdruck zu verwenden. Die Ausdrucks-Engine durchläuft die Ebene für Sie. Nathans Blog hat eine gute Demo dazu:

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
Jakob
quelle