跳到主要内容

ST_AZIMUTH

描述

计算地球球面上两点之间的方位角(单位为弧度)。方位角是从起点(点 1)的真北方向线开始,顺时针旋转到两点连线的角度。

方位角广泛用于导航和地理信息系统中,表示从一点到另一点的方向。

语法

ST_AZIMUTH( <point1>, <point2>)

参数

参数说明
<point1>起点,类型为 GeoPoint,用于计算方位角的基准点
<point2>终点,类型为 GeoPoint,需要计算相对于起点的方向

返回值

返回两点之间的方位角,单位为弧度,范围为 [0, 2π)。方位角按顺时针方向从真北开始测量,具体方向对应关系:

  • 正北方:0 弧度
  • 正东方:π/2 弧度(约 1.5708)
  • 正南方:π 弧度(约 3.1416)
  • 正西方:3π/2 弧度(约 4.7124)

ST_Azimuth 存在以下边缘情况:

  • 若两点为同一点(经纬度完全相同),返回 NULL(方向无意义)。
  • 若两点为对映点(地球直径两端的点),返回 NULL(存在两个可能方向,无法唯一确定)。
  • 若输入参数不是 GeoPoint 类型(如线、多边形),或为空几何对象,返回NULL。

举例

正西方(从 (1,0) 到 (0,0))

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

正东方(从 (0,0) 到 (1,0))

SELECT st_azimuth(ST_Point(0, 0),ST_Point(1, 0));
+----------------------------------------------------+
| st_azimuth(st_point(0.0, 0.0), st_point(1.0, 0.0)) |
+----------------------------------------------------+
| 1.5707963267948966 |
+----------------------------------------------------+

正北方(从 (0,0) 到 (0,1))

SELECT st_azimuth(ST_Point(0, 0),ST_Point(0, 1));
+----------------------------------------------------+
| st_azimuth(st_point(0.0, 0.0), st_point(0.0, 1.0)) |
+----------------------------------------------------+
| 0 |
+----------------------------------------------------+

两点对映

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

东北方向(从 (0,0) 到 (1,1))

mysql> SELECT st_azimuth(ST_Point(0, 0), ST_Point(1, 1));
+--------------------------------------------+
| st_azimuth(ST_Point(0, 0), ST_Point(1, 1)) |
+--------------------------------------------+
| 0.7854743216187384 |
+--------------------------------------------+

跨经度 180° 的东方(从 (170, 0) 到 (-170, 0))

mysql> SELECT st_azimuth(ST_Point(170, 0), ST_Point(-170, 0));
+-------------------------------------------------+
| st_azimuth(ST_Point(170, 0), ST_Point(-170, 0)) |
+-------------------------------------------------+
| 1.5707963267948966 |
+-------------------------------------------------+

输入非点类型,返回NULL


mysql> SELECT st_azimuth(ST_LineFromText("LINESTRING (0 0, 1 1)"), ST_Point(1, 0));
+----------------------------------------------------------------------+
| st_azimuth(ST_LineFromText("LINESTRING (0 0, 1 1)"), ST_Point(1, 0)) |
+----------------------------------------------------------------------+
| NULL |
+----------------------------------------------------------------------+