Ich versuche, einen Algorithmus zu erstellen, der dem minimalen Begrenzungsrahmen ähnelt (obwohl er möglicherweise nicht so aussieht). In diesem Fall wird der Winkel als Parameter übergeben und für den Winkel benötige ich das kleinste Rechteck, das alle meine Punkte / Polygone abdeckt. Bisher habe ich mir vorgenommen, den Mittelpunkt meiner Punkte zu finden (Schwerpunktalgorithmus) und daraus zwei parallele Linien mit demselben Winkel wie der Parameterwinkel und zwei weitere Linien senkrecht dazu zu erstellen. Verschieben Sie diese Linien dann mit Iteration nach außen (in entgegengesetzte Richtungen), bis sie alle Punkte enthalten. Es muss auch keine exakte minimale Begrenzungsbox sein, ungefähre Arbeiten (ich denke, würde von der Größe jedes Iterationsschritts abhängen).
Hier ist mein Code soweit. Ich habe bereits alle meine Polygone in eins aufgelöst. Ich nehme dann eine konvexe Hülle, um die Scheitelpunkte zu reduzieren. Ich habe dann alle Eckpunkte in eine Liste gesetzt - nicht sicher, ob das noch hilft ...
a = layer.getFeatures()
for feat in a:
geom = feat.geometry()
a = geom.convexHull()
vertexId = QgsVertexId()
vertices = []
b = a.constGet().nextVertex(vertexId)
while b[0]:
vertices.append(b[1])
b = a.constGet().nextVertex(vertexId)
Anmerkungen: Irgendwann muss ich den Winkel der Box überschreiten. Ich verwende QGIS 3 und muss dies in Python erstellen. Ebene 'Ebene' hat eine Geometrie, das aufgelöste Polygon aller anderen Polygone - möglicherweise ist keine Iteration erforderlich, um darauf zuzugreifen.
Bitte lassen Sie mich wissen, wenn ich weitere Informationen weitergeben soll.
Antworten:
Hier ist der vollständige Code. Es enthält zu viele Zeilen (viel mehr als unbedingt benötigt), aber es funktioniert. Jetzt können Sie es reinigen, wenn Sie möchten.
Im Resume berechnet der Algorithmus den maximalen Abstand zwischen parallelen Linien, deren Steigung durch den Rotationsparameter definiert ist, und durchläuft die Punkte. Für jeden Punkt wird eine horizontale und eine vertikale Linie erstellt. Diese Namen sind nur orientativ, da sie an Position 0 definiert sind (Drehung = 0). Für jeden externen Punkt werden also diese 2 möglichen Linien erstellt, und dann wird iterativ das Poligon auf der Grundlage der 4 externen Linien erstellt, oder anders ausgedrückt, wobei der Abstand paralleler Linien maximal ist.
Eine letzte Sache: Es ist dafür gemacht, in QGIS 3.8 mit Gras verwendet zu werden.
quelle