Tworzysz „ukośną ramkę ograniczającą” o maksymalnym stosunku szerokości do wysokości?

13

Chciałbym utworzyć otaczający prostokąt o maksymalnym stosunku szerokości do wysokości („ukośna ramka ograniczająca”) z zestawu funkcji wprowadzania, jak pokazano na poniższym obrazku:

wprowadź opis zdjęcia tutaj

Np. Funkcje PostGIS, ST_Envelopea ST_Box2Dtakże transformatory FME BoundingBoxReplaceri BoundingBoxAccumulatorgenerują równoległe ramki graniczne osi.

Wszelkie sugestie dotyczące podejścia z PostGIS, QGIS lub FME są mile widziane!

Jochen Schwarze
źródło
Nie jest to dokładny duplikat, ponieważ facet nie prosi o rozwiązanie obowiązujące w FME lub PostGIS. Niemniej jednak skrypt Pythona, o którym mowa w odpowiedzi na pytanie, o którym mowa powyżej, jest dość przydatny do umieszczenia w transformatorze FME PythonCaller. Jeśli mam działający obszar roboczy, opublikuję rozwiązanie z nieco zmodyfikowanym skryptem.
Jochen Schwarze
Nie tylko nie jest to duplikat, ale przywołane pytanie nie zostało zaakceptowane, i istnieją pytania, na które nie ma odpowiedzi, który algorytm używa i czy jest dokładny, czy nie.
John Powell,
Zobacz moją odpowiedź poniżej. Powinieneś być w stanie to zrobić w FME. Jakiej wersji używasz?
Fezter

Odpowiedzi:

9

Jest to prawdopodobnie przesada w zakresie przetwarzania i prawdopodobnie będzie lepsze rozwiązanie matematyczne, ale jako przykład sposobu, w jaki można to zrobić po prostu jako zapytanie

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;

To obraca geometrię, tworzy obwiednie, odwraca obrót o każdą dziesiątą stopnia od 0 do 90. Wynikiem jest wówczas obwiednia z najmniejszym obszarem. Oczywiście nie jest to do końca dokładny sposób i może wymagać dostosowania wartości przyrostu w serii w zależności od wymagań.

MickyT
źródło
Myślę, że to świetne rozwiązanie. Dokładne rozwiązania są niezwykle drogie. Możesz z łatwością rozszerzyć go w pliku plpgsql, aby zapisać najlepsze x ramki ograniczające, a jeśli dwa były bardzo blisko, możesz powiększyć i wykonać kilka mniejszych obrotów, aby zbliżyć się do dokładnego rozwiązania. Z pewnością byłyby przypadki skrajne, ale miłe podejście.
John Powell,
I jako dodatkowa korzyść zachowuje kąt obrotu :-)
Jochen Schwarze
6

QGIS ma algorytm „minimalnie zorientowanej ramki granicznej”, który dokładnie to robi.

ndawson
źródło
Nazywa się to „Orientowanym obwiedniem minimalnym”. Możesz to nazwać z Przybornika przetwarzania> Geoalgorytmy QGIS> Ogólne narzędzia wektorowe.
Stefan
Zakładam, że wykracza to poza QGIS 2.14, ponieważ nie mogłem go znaleźć w 2.14.15LTR, którego nadal tu używamy?
Jochen Schwarze
@JochenSchwarze istnieje w QGIS 2.14.19. Musisz wyszukać w przyborniku Przetwarzanie. Bezpośrednio można go znaleźć podProcessing toolbox -> QGIS geoalgorithms -> Vector General tools -> Oriented minimum bounding box
ahmadhanb
4

Zamiennika Obwiednia transformator, który wspomniał Pan powinien być w stanie to zrobić. Zgodnie z dokumentacją to

Zastępuje geometrię elementu albo jego dwuwymiarową ramką ograniczającą, albo dwuwymiarową zorientowaną minimalną ramką ograniczającą.

Ten parametr pozwala wybrać ramkę obwiedniową w kształcie osi lub prostoliniowy.

Najwyraźniej sugerowane jest ulepszenie obejmujące kąt dłuższego boku zorientowanego obwiedni. To jest bezpieczny numer PR nr 53924.

Fezter
źródło