メインコンテンツまでスキップ
に最終更新

ST_ANGLE

説明​

三つの点を入力します。第一の直線は、point1(最初の端点)と point2(次の端点)を結ぶ直線です。第二の直線は、point2(最初の端点)と point3(次の端点)を結ぶ直線です。これらの直線は point2 で交わります。この関数は、第一の直線から第二の直線までの時計回りの角度を返します。各端点の座標について、x 値(経度)は [-180, 180]、y 値(緯度)は [-90, 90] の範囲内である必要があります。

構文​

ST_ANGLE( <point1>, <point2>, <point3>)

パラメータ​

パラメータ説明
<point1>第一の直線の最初の端点。型は GeoPoint です。
<point2>第一の直線の次の端点であり、第二の直線の最初の端点です。型は GeoPoint です。
<point3>第二の直線の次の端点。型は GeoPoint です。

戻り値​

二本の直線の間の角度をラジアン単位の倍精度浮動小数点数で返します。値の範囲は [0, 2π) です。角度は第一の直線から第二の直線へ時計回りに測定されます。

ST_ANGLE には、次の境界ケースがあります。

  • point2 と point3 が同じ場合は NULL を返します。
  • point2 と point1 が同じ場合は NULL を返します。
  • point2 と point3 が厳密に対蹠点である場合は NULL を返します。
  • point2 と point1 が厳密に対蹠点である場合は NULL を返します。
  • いずれかの点の座標が、x(経度)または y(緯度)の指定範囲を超える場合は NULL を返します。
  • 入力点のいずれかが NULL の場合は NULL を返します。

例​

SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(0, 1));

第一の直線から第二の直線までの時計回りの角度は 4.7 ラジアンです。

+----------------------------------------------------------------------+
| st_angle(st_point(1.0, 0.0), st_point(0.0, 0.0), st_point(0.0, 1.0)) |
+----------------------------------------------------------------------+
| 4.71238898038469 |
+----------------------------------------------------------------------+
SELECT ST_Angle(ST_Point(0, 0),ST_Point(1, 0),ST_Point(0, 1));

第一の直線から第二の直線までの時計回りの角度は 0.78 ラジアンです。

+----------------------------------------------------------------------+
| st_angle(st_point(0.0, 0.0), st_point(1.0, 0.0), st_point(0.0, 1.0)) |
+----------------------------------------------------------------------+
| 0.78547432161873854 |
+----------------------------------------------------------------------+
SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(1, 0));

二本の直線が重なるため、時計回りの角度は 0 です。

+----------------------------------------------------------------------+
| st_angle(st_point(1.0, 0.0), st_point(0.0, 0.0), st_point(1.0, 0.0)) |
+----------------------------------------------------------------------+
| 0 |
+----------------------------------------------------------------------+

point2 と point3 が同じ場合は、NULL を返します。

SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(0, 0));
+----------------------------------------------------------------------+
| st_angle(st_point(1.0, 0.0), st_point(0.0, 0.0), st_point(0.0, 0.0)) |
+----------------------------------------------------------------------+
| NULL |
+----------------------------------------------------------------------+

二本の直線の方向が正反対の場合は、NULL を返します。

SELECT ST_Angle(ST_Point(0, 0),ST_Point(-30, 0),ST_Point(150, 0));
+--------------------------------------------------------------------------+
| st_angle(st_point(0.0, 0.0), st_point(-30.0, 0.0), st_point(150.0, 0.0)) |
+--------------------------------------------------------------------------+
| NULL |
+--------------------------------------------------------------------------+

いずれかの点が NULL の場合は、NULL を返します。

mysql> SELECT ST_Angle(NULL,ST_Point(-30, 0),ST_Point(-150, 0)) ;
+---------------------------------------------------+
| ST_Angle(NULL,ST_Point(-30, 0),ST_Point(-150, 0)) |
+---------------------------------------------------+
| NULL |
+---------------------------------------------------+

いずれかの座標が指定範囲を超える場合は、NULL を返します。


mysql> SELECT ST_Angle(ST_Point(0, 0),ST_Point(-30, 0),ST_Point(180, 91));
+-------------------------------------------------------------+
| ST_Angle(ST_Point(0, 0),ST_Point(-30, 0),ST_Point(180, 91)) |
+-------------------------------------------------------------+
| NULL |
+-------------------------------------------------------------+

いずれかの座標が NULL の場合は、NULL を返します。

mysql> SELECT ST_Angle(NULL,ST_Point(-30, 0),ST_Point(150, 90));
+---------------------------------------------------+
| ST_Angle(NULL,ST_Point(-30, 0),ST_Point(150, 90)) |
+---------------------------------------------------+
| NULL |
+---------------------------------------------------+