Creazione di "riquadro di delimitazione obliquo" con rapporto larghezza / altezza massimo?


13

Vorrei creare un rettangolo circostante con il rapporto larghezza / altezza massimo ("riquadro di selezione obliquo") da una serie di funzioni di input, come mostrato nell'immagine seguente:

inserisci qui la descrizione dell'immagine

Ad esempio le funzioni PostGIS ST_Envelopee ST_Box2Dcosì come FME trasformatori BoundingBoxReplacere BoundingBoxAccumulatorgenerare asse parallelo quadri delimitatori.

Tutti i suggerimenti che utilizzano approcci con PostGIS, QGIS o FME sono i benvenuti!


Non è un duplicato esatto , perché il ragazzo non chiede una soluzione applicabile in FME o PostGIS. Tuttavia, lo script python a cui si fa riferimento nella risposta alla domanda di cui sopra è abbastanza utile per essere inserito nel trasformatore FME PythonCaller. Se ho un'area di lavoro in esecuzione, posterò una soluzione con uno script leggermente modificato.
Jochen Schwarze,

Non solo non è un duplicato, ma la domanda referenziata non è stata accettata e ci sono domande senza risposta su quale algoritmo utilizza e se è esatto o meno.
John Powell,

Vedi la mia risposta qui sotto. Dovresti essere in grado di farlo in FME. Quale versione stai usando?
Fezter

Risposte:


9

Questo è probabilmente eccessivo sul fronte dell'elaborazione e probabilmente ci sarà una soluzione matematica migliore, ma come esempio di un modo in cui potrebbe essere fatto piuttosto semplicemente come una query

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;

Questo ruota la geometria, crea i limiti, inverte la rotazione per ogni decimo di grado tra 0 e 90. Il risultato è quindi il riquadro di delimitazione con l'area minima. Naturalmente questo non è un modo del tutto accurato per farlo e potrebbe essere necessario modificare il valore di incremento nella serie in base alle proprie esigenze.


In realtà, penso che questa sia un'ottima soluzione. Le soluzioni esatte sono estremamente costose. Potresti facilmente estenderlo in plpgsql per registrare i migliori riquadri di delimitazione x, e se due fossero molto vicini, potresti ingrandire e fare alcune rotazioni più piccole per avvicinarti a una soluzione esatta. Ci sarebbero sempre casi limite, ma un approccio gradevole.
John Powell,

E come ulteriore vantaggio preserva l'angolo di rotazione :-)
Jochen Schwarze,

6

QGIS ha un algoritmo "riquadro orientato al minimo" che fa esattamente questo.


Si chiama "riquadro di delimitazione minimo orientato". Puoi chiamarlo dalla Casella degli strumenti di elaborazione> Geoalgoritmi di QGIS> Strumenti generali di vettore.
Stefan,

Presumo che questo sia oltre QGIS 2.14, perché non sono riuscito a trovarlo in 2.14.15LTR che stiamo ancora usando qui?
Jochen Schwarze,

@JochenSchwarze esiste in QGIS 2.14.19. Devi cercare nella casella degli strumenti di elaborazione. Direttamente, puoi trovarlo sottoProcessing toolbox -> QGIS geoalgorithms -> Vector General tools -> Oriented minimum bounding box
ahmadhanb,

4

Il trasformatore di sostituzione del rettangolo di selezione , che hai citato, dovrebbe essere in grado di farlo. Secondo la documentazione,

Sostituisce la geometria dell'elemento con il riquadro di delimitazione bidimensionale o il riquadro di delimitazione orientato al minimo bidimensionale.

Il parametro consente di scegliere una casella di delimitazione ad assi allineati o rettilinea.

Apparentemente, c'è un miglioramento suggerito per includere l'angolo del lato più lungo del riquadro di delimitazione orientato. Questo è il numero di sicurezza PR # 53924.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.