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

MariaDB ST_EQUALS() 函数用来检测两个几何对象是否相等。如果两个几何对象完全相同,则返回 1 或 true;否则返回 0 或 false。

发布于

MariaDB ST_EQUALS() 函数用来检测两个几何对象是否相等。如果两个几何对象完全相同,则返回 1 或 true;否则返回 0 或 false。该函数在进行几何对象比较时非常有用。

语法

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

ST_EQUALS(geom1, geom2)

参数说明:

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

返回值:

  • 如果输入的任一几何对象为空值,则返回 NULL。
  • 如果两个几何对象完全相同,返回 1 或 true。
  • 如果两个几何对象不同,返回 0 或 false。

实例

比较两个点是否相等

本实例演示了如何比较两个点是否相等。

SELECT ST_EQUALS(POINT(1, 1), POINT(1, 1)) AS equals_1,
       ST_EQUALS(POINT(1, 1), POINT(2, 2)) AS equals_2;

以下是该语句的输出:

+----------+----------+
| equals_1 | equals_2 |
+----------+----------+
|        1 |        0 |
+----------+----------+

可以看到,第一个比较中两个点相等,所以返回 1 或 true;第二个比较中两个点不等,所以返回 0 或 false。

比较点与线是否相等

本实例演示了如何比较一个点与一条线是否相等。

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, 0), POINT(1, 1))), (LINESTRING(POINT(2, 2), POINT(3, 3)));

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

以下是该语句的输出:

+----+----+--------+
| id | id | equals |
+----+----+--------+
|  1 |  1 |      0 |
|  2 |  1 |      0 |
|  1 |  2 |      0 |
|  2 |  2 |      0 |
+----+----+--------+

可以看到,点与线都是不相等的,所以返回 0 或 false。

比较两条线是否相等

本实例演示了如何比较两条线是否相等。

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

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

SELECT l1.id, l2.id, ST_EQUALS(l1.ln, l2.ln) AS equals
FROM lines1 l1
CROSS JOIN lines2 l2;

以下是该语句的输出:

+----+----+--------+
| id | id | equals |
+----+----+--------+
|  1 |  1 |      1 |
|  2 |  1 |      0 |
|  1 |  2 |      0 |
|  2 |  2 |      0 |
+----+----+--------+

可以看到,只有第一个比较中的两条线相等,所以返回 1 或 true;其他情况都返回 0 或 false。

比较点与面是否相等

本实例演示了如何比较一个点与一个面是否相等。

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 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, 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))));

SELECT p.id, po.id, ST_EQUALS(p.pt, po.poly) AS equals
FROM points_table p
CROSS JOIN polygons_table po;

以下是该语句的输出:

+----+----+--------+
| id | id | equals |
+----+----+--------+
|  1 |  1 |      0 |
|  2 |  1 |      0 |
|  1 |  2 |      0 |
|  2 |  2 |      0 |
+----+----+--------+

可以看到,点与面都是不相等的,所以返回 0 或 false。

比较两个面是否相等

本实例演示了如何比较两个面是否相等。

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(0, 0), POINT(0, 1), POINT(1, 1), POINT(1, 0), POINT(0, 0)))), (POLYGON(LINESTRING(POINT(2, 2), POINT(2, 3), POINT(3, 3), POINT(3, 2), POINT(2, 2))));

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

以下是该语句的输出:

+----+----+--------+
| id | id | equals |
+----+----+--------+
|  1 |  1 |      1 |
|  2 |  1 |      0 |
|  1 |  2 |      0 |
|  2 |  2 |      0 |
+----+----+--------+

可以看到,只有第一个比较中的两个面相等,所以返回 1 或 true;其他情况都返回 0 或 false。

相关函数

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

  • MariaDB ST_DISJOINT() 函数用来检测两个几何对象是否不相交。
  • MariaDB ST_Intersects() 函数用来检测两个几何对象是否相交。
  • MariaDB ST_Touches() 函数用来检测两个几何对象是否相交且交集为边界。
  • MariaDB ST_Crosses() 函数用来检测两个几何对象是否相交且交集为 0 维。

结论

MariaDB ST_EQUALS() 函数是一个非常有用的函数,可以检测两个几何对象是否相等。通过本文的实例,我们学习了如何使用该函数比较不同类型的几何对象是否相等,以及一些异常情况下的返回值。同时,我们还了解了一些与该函数相关的其他几何函数。掌握这些函数有助于我们更好地处理和操作空间数据,尤其是需要比较几何对象是否相等时。