Erstellen eines „schrägen Begrenzungsrahmens“ mit maximalem Breiten- / Höhenverhältnis?


13

Ich möchte ein umgebendes Rechteck mit einem maximalen Verhältnis von Breite zu Höhe ("Schrägbegrenzungsrahmen") aus einer Reihe von Eingabe-Features erstellen, wie in der folgenden Abbildung dargestellt:

Bildbeschreibung hier eingeben

ZB die PostGIS-Funktionen ST_Envelopeund ST_Box2Dsowie FME-Transformatoren BoundingBoxReplacerund BoundingBoxAccumulatorerzeugen achsparallele Begrenzungsrahmen.

Anregungen zu Ansätzen mit PostGIS, QGIS oder FME sind herzlich willkommen!


Kein genaues Duplikat, da der Typ nicht nach einer Lösung fragt, die in FME oder PostGIS anwendbar ist. Trotzdem ist das Python-Skript, auf das in der Antwort auf die oben genannte Frage verwiesen wird, sehr nützlich, um in den FME-PythonCaller-Transformator eingefügt zu werden. Wenn ein Arbeitsbereich ausgeführt wird, werde ich eine Lösung mit einem leicht geänderten Skript veröffentlichen.
Jochen Schwarze

Es ist nicht nur kein Duplikat, sondern die referenzierte Frage wurde auch nicht akzeptiert, und es gibt unbeantwortete Fragen dazu, welchen Algorithmus er verwendet und ob er genau ist oder nicht.
John Powell

Siehe meine Antwort unten. Dies sollte in FME möglich sein. Welche Version benutzt du?
Fezter

Antworten:


9

Dies ist wahrscheinlich ein Overkill an der Verarbeitungsfront und es gibt wahrscheinlich eine bessere mathematische Lösung, aber als Beispiel dafür, dass dies eher einfach als Abfrage erfolgen könnte

SELECT 
   id, rotated_by, oblique_bound
  FROM 
     (
     SELECT 
        m.id,
        r rotated_by, 
        ST_Rotate(ST_Envelope(ST_Rotate(m.geom, r)),-r) oblique_bound,
        row_number OVER (PARTITION BY id) 
                   ORDER BY ST_Area(ST_Rotate(ST_Envelope(ST_Rotate(m.geom, r)),-r))) N
       FROM 
          generate_series(0, 90, 0.1) N(r), my_table m
    ) s
WHERE N = 1;

Dadurch wird die Geometrie gedreht, die Begrenzungen erstellt und die Drehung für jedes Zehntel eines Grads zwischen 0 und 90 umgekehrt. Das Ergebnis ist dann der Begrenzungsrahmen mit der geringsten Fläche. Dies ist natürlich nicht ganz korrekt und erfordert möglicherweise eine Anpassung des Inkrementwerts in der Serie, je nach Ihren Anforderungen.


Eigentlich halte ich das für eine tolle Lösung. Die genauen Lösungen sind extrem teuer. Sie können es problemlos in plpgsql erweitern, um die besten X-Bounding-Boxen aufzuzeichnen. Wenn zwei sehr nahe beieinander liegen, können Sie zoomen und kleinere Rotationen ausführen, um näher an eine exakte Lösung heranzukommen. Es würde immer Randfälle geben, aber eine nette Herangehensweise.
John Powell

Und als zusätzlichen Vorteil bleibt der Drehwinkel erhalten :-)
Jochen Schwarze

6

QGIS hat einen "Minimum Oriented Bounding Box" -Algorithmus, der genau dies tut.


Es heißt "Oriented Minimum Bounding Box". Sie können es aus der Verarbeitungs-Toolbox> QGIS-Geoalgorithmen> Allgemeine Vektorwerkzeuge aufrufen.
Stefan

Ich nehme an, dass dies über QGIS 2.14 hinausgeht, weil ich es in 2.14.15LTR, das wir hier noch verwenden, nicht finden konnte?
Jochen Schwarze

@JochenSchwarze gibt es in QGIS 2.14.19. Sie müssen in der Verarbeitungs-Toolbox suchen. Direkt finden Sie es unterProcessing toolbox -> QGIS geoalgorithms -> Vector General tools -> Oriented minimum bounding box
ahmadhanb

4

Der Bounding-Box-Ersatz , den Sie erwähnt haben, sollte dies können. Nach der Dokumentation ist es,

Ersetzt die Geometrie des Features entweder durch den zweidimensionalen Begrenzungsrahmen oder den zweidimensionalen, minimal ausgerichteten Begrenzungsrahmen.

Mit diesem Parameter können Sie entweder einen achsgerichteten oder einen geradlinigen Begrenzungsrahmen auswählen.

Anscheinend gibt es eine vorgeschlagene Verbesserung , um den Winkel der längeren Seite des orientierten Begrenzungsrahmens einzuschließen. Dies ist die sichere Nummer PR # 53924.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.