メインコンテンツまでスキップ
バージョン: 4.x

ST_ANGLE

説明

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

構文

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

パラメータ

parametersdescriptions
<point1>最初の線の最初の端点。型は GeoPoint
<point2>最初の線の2番目の端点かつ2番目の線の最初の端点。型は GeoPoint
<point3>2番目の線の2番目の端点。型は GeoPint

戻り値

2つの線の間の角度をラジアンで返します。倍精度浮動小数点数で、範囲は[0, 2π)です。角度は最初の線から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));

最初の線から2番目の線への時計回りの角度は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));

最初の線から2番目の線への時計回りの角度は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));

2つの線が重なっているため、時計回りの角度は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 |
+----------------------------------------------------------------------+

2つの線が対蹠的な方向にある場合、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 |
+---------------------------------------------------+