名前

ST_Angle — 三つのポイントまたは二つのベクタ (4ポイントまたは2ライン)の間の角度を返します。

概要

float ST_Angle(geometry point1, geometry point2, geometry point3, geometry point4);

float ST_Angle(geometry line1, geometry line2);

説明

3ポイント入力では、P1P2P3の時計回りの角度を計算します。2ライン入力では、2ラインの最初と最後のポイントから4ポイントを得ます。4ポイント入力では、P1P2, P3P4の時計回りの角度を計算します。返り値は常に非負の数で、0と2πラジアンの間になります。ラインまたはポイントの角度を使います。

ST_Angle(P1,P2,P3) = ST_Angle(P2,P1,P2,P3)

例に示す通り、ラジアンで返るので、度を得るには、PostgreSQLの組み込み関数であるdegrees()を使って変換します。

Availability: 2.5.0

度単位のジオメトリの方位

WITH rand AS (
                SELECT s, random() * 2 * PI() AS rad1
                        , random() * 2 * PI() AS rad2
                FROM  generate_series(1,2,2) AS s
        )
         , points AS (
                SELECT s, rad1,rad2, ST_MakePoint(cos1+s,sin1+s) as p1, ST_MakePoint(s,s) AS p2, ST_MakePoint(cos2+s,sin2+s) as p3
                FROM rand
                        ,cos(rad1) cos1, sin(rad1) sin1
                        ,cos(rad2) cos2, sin(rad2) sin2
        )
        SELECT s, ST_AsText(ST_SnapToGrid(ST_MakeLine(ARRAY[p1,p2,p3]),0.001)) AS line
                , degrees(ST_Angle(p1,p2,p3)) as computed_angle
                , round(degrees(2*PI()-rad2 -2*PI()+rad1+2*PI()))::int%360 AS reference
                , round(degrees(2*PI()-rad2 -2*PI()+rad1+2*PI()))::int%360 AS reference
        FROM points ;

1 | line | computed_angle | reference
------------------+------------------
1 | LINESTRING(1.511 1.86,1 1,0.896 0.005) | 155.27033848688 | 155