ST_DISTANCE
描述
计算两个几何图形在球面上的最短距离,单位为米。此函数使用球面地球模型进行计算。
与 ST_DISTANCE_SPHERE 接受经纬度坐标不同,ST_DISTANCE 接受几何对象(点、线、多边形、圆等)作为参数,并计算它们边界之间的最短距离。若两个图形相交(包括接触或包含),则返回 0。
语法
ST_DISTANCE( <shape1>, <shape2> )
参数
| 参数 | 说明 |
|---|---|
<shape1> | 第一个几何图形,支持 Point,Line,Polygon,Circle,MultiPolygon。 |
<shape2> | 第二个几何图形,支持 Point,Line,Polygon,Circle,MultiPolygon。 |
返回值
返回两个几何图形边界之间的最短球面距离,单位为米(DOUBLE 类型)。
ST_DISTANCE 存在以下边缘情况:
- 若任一输入参数为
NULL,返回NULL。 - 若任一输入参数无法解析为有效的几何对象,返回
NULL。 - 若两个几何图形相交(包括一个图形包含另一个图形),返回
0.0。 - 支持的几何类型包括:
POINT,LINESTRING,POLYGON,CIRCLE,MULTIPOLYGON。
举例
点与点之间的距离
-- 计算赤道上经度相差 1 度的两个点之间的距离
SELECT ST_DISTANCE(ST_GeometryFromText('POINT(0 0)'), ST_GeometryFromText('POINT(1 0)'));
+---------------------------------------------+
| ST_Distance(ST_Point(0, 0), ST_Point(1, 0)) |
+---------------------------------------------+
| 111195.1011774839 |
+---------------------------------------------+
点与线之间的距离
-- 计算点到线的最短距离
SELECT ST_DISTANCE(ST_GeometryFromText('POINT(2 2)'), ST_GeometryFromText('LINESTRING(0 0, 10 0)'));
+----------------------------------------------------------------------------------------------+
| ST_DISTANCE(ST_GeometryFromText('POINT(2 2)'), ST_GeometryFromText('LINESTRING(0 0, 10 0)')) |
+----------------------------------------------------------------------------------------------+
| 222390.2023549678 |
+----------------------------------------------------------------------------------------------+
多边形与圆相交(距离为 0)
-- 圆与多边形相交,圆心在外但圆包含了多边形的一部分边界
SELECT ST_DISTANCE(
ST_GeometryFromText('POLYGON ((-0.00045 -0.00045, 0.00045 -0.00045, 0.00045 0.00045, -0.00045 0.00045, -0.00045 -0.00045))'),
ST_Circle(0.0006, 0, 50)
);
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ST_DISTANCE(
ST_GeometryFromText('POLYGON ((-0.00045 -0.00045, 0.00045 -0.00045, 0.00045 0.00045, -0.00045 0.00045, -0.00045 -0.00045))'),
ST_Circle(0.0006, 0, 50)
) |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
无效参数(返回 NULL)
-- 无效的 WKT 字符串
SELECT ST_DISTANCE(ST_GeometryFromText('NOT_A_GEOMETRY'), ST_GeometryFromText('POINT(1 1)'));
+---------------------------------------------------------------------------------------+
| ST_DISTANCE(ST_GeometryFromText('NOT_A_GEOMETRY'), ST_GeometryFromText('POINT(1 1)')) |
+---------------------------------------------------------------------------------------+
| NULL |
+---------------------------------------------------------------------------------------+
NULL 参数
SELECT ST_DISTANCE(NULL, ST_GeometryFromText('POINT(1 1)'));
+------------------------------------------------------+
| ST_DISTANCE(NULL, ST_GeometryFromText('POINT(1 1)')) |
+------------------------------------------------------+
| NULL |
+------------------------------------------------------+