MariaDB ST_DISTANCE() 函数的基础用法与实例

MariaDB ST_DISTANCE() 函数用来计算两个几何对象在平面上的最短距离。该函数假设输入的几何对象位于二维平面坐标系中,并计算它们在平面上的最短欧几里德距离。

发布于

MariaDB ST_DISTANCE() 函数用来计算两个几何对象在平面上的最短距离。该函数假设输入的几何对象位于二维平面坐标系中,并计算它们在平面上的最短欧几里德距离。该函数常用于计算两个平面几何对象之间的距离。

语法

MairaDB ST_DISTANCE() 函数的语法如下:

ST_DISTANCE(geom1, geom2)

参数说明:

  • geom1:接受任意几何值,表示第一个几何对象。
  • geom2:接受任意几何值,表示第二个几何对象。

返回值:

  • 如果输入的任一几何对象为空值,则返回 NULL。
  • 如果输入的两个几何对象相同,则返回 0。
  • 否则返回两个几何对象在平面上的最短欧几里德距离。

实例

计算两个点在平面上的距离

本实例演示了如何计算两个点在平面上的距离。

SELECT ST_DISTANCE(POINT(0, 0), POINT(3, 4)) AS distance;

以下是该语句的输出:

+----------+
| distance |
+----------+
|        5 |
+----------+

可以看到,计算结果为 5,这是根据欧几里德距离公式计算得出的。

计算点与线在平面上的距离

本实例演示了如何计算一个点与一条线在平面上的距离。

DROP TABLE IF EXISTS points_table;
CREATE TABLE points_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    pt POINT NOT NULL
);
INSERT INTO points_table (pt) VALUES (POINT(0, 0)), (POINT(1, 1));

DROP TABLE IF EXISTS lines_table;
CREATE TABLE lines_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    ln LINESTRING NOT NULL
);
INSERT INTO lines_table (ln) VALUES (LINESTRING(POINT(0, 1), POINT(1, 0)));

SELECT p.id, l.id, ST_DISTANCE(p.pt, l.ln) AS distance
FROM points_table p
CROSS JOIN lines_table l;

以下是该语句的输出:

+----+----+--------------------+
| id | id | distance           |
+----+----+--------------------+
|  1 |  1 | 0.7071067811865475 |
|  2 |  1 | 0.7071067811865475 |
+----+----+--------------------+

可以看到,两个点到线的距离都约为 0.707,这是根据欧几里德距离公式计算得出的。

计算线与面在平面上的距离

本实例演示了如何计算一条线与一个面在平面上的距离。

DROP TABLE IF EXISTS lines_table;
CREATE TABLE lines_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    ln LINESTRING NOT NULL
);
INSERT INTO lines_table (ln) VALUES (LINESTRING(POINT(0, 0), POINT(1, 1)));

DROP TABLE IF EXISTS polygons_table;
CREATE TABLE polygons_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    poly POLYGON NOT NULL
);
INSERT INTO polygons_table (poly) VALUES (POLYGON(LINESTRING(POINT(0, 1), POINT(1, 2), POINT(2, 1), POINT(1, 0), POINT(0, 1))));

SELECT l.id, p.id, ST_DISTANCE(l.ln, p.poly) AS distance
FROM lines_table l
CROSS JOIN polygons_table p;

以下是该语句的输出:

+----+----+----------+
| id | id | distance |
+----+----+----------+
|  1 |  1 |        0 |
+----+----+----------+

可以看到,线与面在平面上的距离约为 0,这是根据欧几里德距离公式计算得出的。

计算两个面在平面上的距离

本实例演示了如何计算两个面在平面上的距离。

DROP TABLE IF EXISTS polygons1;
CREATE TABLE polygons1 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    poly POLYGON NOT NULL
);
INSERT INTO polygons1 (poly) VALUES (POLYGON(LINESTRING(POINT(0, 0), POINT(0, 1), POINT(1, 1), POINT(1, 0), POINT(0, 0)))), (POLYGON(LINESTRING(POINT(1, 1), POINT(1, 2), POINT(2, 2), POINT(2, 1), POINT(1, 1))));

DROP TABLE IF EXISTS polygons2;
CREATE TABLE polygons2 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    poly POLYGON NOT NULL
);
INSERT INTO polygons2 (poly) VALUES (POLYGON(LINESTRING(POINT(2, 2), POINT(2, 3), POINT(3, 3), POINT(3, 2), POINT(2, 2)))), (POLYGON(LINESTRING(POINT(3, 3), POINT(3, 4), POINT(4, 4), POINT(4, 3), POINT(3, 3))));

SELECT p1.id, p2.id, ST_DISTANCE(p1.poly, p2.poly) AS distance
FROM polygons1 p1
CROSS JOIN polygons2 p2;

以下是该语句的输出:

+----+----+--------------------+
| id | id | distance           |
+----+----+--------------------+
|  1 |  1 | 1.4142135623730951 |
|  2 |  1 |                  0 |
|  1 |  2 | 2.8284271247461903 |
|  2 |  2 | 1.4142135623730951 |
+----+----+--------------------+

计算异常情况下的距离

本实例演示了在异常情况下,ST_DISTANCE() 函数的返回值。

SELECT ST_DISTANCE(NULL, POINT(0, 0)) AS distance;
SELECT ST_DISTANCE(POINT(0, 0), NULL) AS distance;
SELECT ST_DISTANCE(NULL, NULL) AS distance;

以下是该语句的输出:

+----------+
| distance |
+----------+
|     NULL |
+----------+

可以看到,如果输入的任一几何对象为空值,则返回 NULL。

相关函数

以下是几个与 MairaDB ST_DISTANCE() 相关的几个函数:

结论

MariaDB ST_DISTANCE() 函数是一个非常有用的函数,可以计算两个几何对象在平面上的最短欧几里德距离。通过本文的实例,我们学习了如何使用该函数计算不同类型的几何对象在平面上的距离,以及一些异常情况下的返回值。同时,我们还了解了一些与该函数相关的其他几何函数。掌握这些函数有助于我们更好地处理和操作空间数据,尤其是平面坐标数据。