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>)
パラメータ
| parameters | descriptions |
|---|---|
<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 |
+---------------------------------------------------+