2017-05-03 1 views
2

Ich habe versucht, eine Geometrie um ihre lokale Achse zu drehen, habe aber keinen Weg gefunden, dies zu tun. Ich weiß, dass es ST_Rotate (siehe https://postgis.net/docs/ST_Rotate.html) für 2D-Berechnungen und (unter anderem) ST_RotateX (siehe https://postgis.net/docs/ST_RotateX.html) gibt, aber diese Methoden drehen eine Geometrie um den Ursprung. Ich habe auch versucht ST_Affine zu missbrauchen, wenn ich zu ändern versucht, die Herkunft (was zu sein scheint) (nämlich 0/0/0):Drehen Sie die Geometrie um ihre lokale Achse

SELECT ST_Affine(
     ST_GeomFromText(ST_AsText(runway_area)), 
     1, 0, 0, 0, 
     cos(rotRadians), -sin(rotRadians), 0, sin(rotRadians), cos(rotRadians), 
     --- use the geometry's centroid instead of 0, 0, 0 
     ST_X(ST_GeomFromText(ST_AsText(runway_area))), ST_Y(ST_GeomFromText(ST_AsText(runway_area))), ST_Z(ST_GeomFromText(ST_AsText(runway_area))) 
    ) 

Es nicht geklappt hat - alles, was ich bekam, war etwas, das Art und Weise war weg vom beabsichtigten Standort. Vermisse ich eine sehr grundlegende Methode von PostGIS, um eine Geometrie um eine ihrer lokalen Achsen zu rotieren?

+0

Wie definieren Sie "lokale Achse", das heißt "local" zu Ihrem Satz von Geometrien von Interesse oder das Gitter (SRS) Achse? Wenn früher, wie würden Sie das Zentrum Ihrer Menge interessierender Geometrien bestimmen? –

Antwort

0

Die letzten drei Argumente zu ST_Affine repräsentieren nicht den Ursprung, sondern die globale "Verschiebung" in der affinen Transformation. Die Dokumentation für ST_RotateX zeigt, wie Sie mit dieser Funktion eine Drehung um die x-Achse erzeugen können. Alle diese Parameter sind Null, da es sich um eine Drehung ohne Übersetzung handelt.

Wenn Sie eine allgemeine Achse verwenden möchten, müssen Sie das entsprechende rotation matrix konstruieren müssen und ersetzen ihre Elemente für die Argumente a,b,c,d,e,f,g,h,i von ST_Affine und setzen xoff, yoff, zoff auf Null.

0

Sie ST_Rotate mit ST_Centroid kombinieren könnten, Beispiel:

ST_Rotate(ST_GeomFromText(ST_AsText(runway_area)), -pi()/3, ST_Centroid(ST_GeomFromText(ST_AsText(runway_area)))