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

MariaDB CROSSES() 用于判断两个几何对象是否相交,但不包含在彼此内部。CROSSES() 函数返回一个布尔值,表示两个几何对象是否相交。

发布于

MariaDB 是一个开源的关系型数据库管理系统,它是 MySQL 的一个分支。MariaDB 提供了许多内置的函数,用于对数据进行各种操作和转换。其中一个函数是 CROSSES(),它用于判断两个几何对象是否相交,但不包含在彼此内部。CROSSES() 函数返回一个布尔值,表示两个几何对象是否相交。

语法

CROSSES() 函数的语法如下:

CROSSES(g1, g2)

其中,g1g2 是要判断是否相交的两个几何对象。如果 g1g2NULL,则函数返回 NULL

实例

下面是一些使用 CROSSES() 函数的实例:

判断两条线段是否相交

我们可以使用 CROSSES() 函数来判断两条线段是否相交,例如:

SELECT CROSSES(LINESTRING(0,0,2,2), LINESTRING(0,2,2,0));

输出结果为:

1

这表示两条线段 LINESTRING(0,0,2,2)LINESTRING(0,2,2,0) 相交,因为它们在点 (1,1) 交叉。

判断一条线段和一个多边形是否相交

我们也可以使用 CROSSES() 函数来判断一条线段和一个多边形是否相交,例如:

SELECT CROSSES(LINESTRING(0,0,2,2), POLYGON((0,1,1,0,2,1,1,2,0,1)));

输出结果为:

1

这表示线段 LINESTRING(0,0,2,2) 和多边形 POLYGON((0,1,1,0,2,1,1,2,0,1)) 相交,因为它们在两个点 (0.5,0.5)(1.5,1.5) 交叉。

判断两个多边形是否相交

我们还可以使用 CROSSES() 函数来判断两个多边形是否相交,例如:

SELECT CROSSES(POLYGON((0,0,0,2,2,2,2,0,0,0)), POLYGON((1,1,1,3,3,3,3,1,1,1)));

输出结果为:

0

这表示两个多边形 POLYGON((0,0,0,2,2,2,2,0,0,0))POLYGON((1,1,1,3,3,3,3,1,1,1)) 不相交,因为它们只有一个公共点 (2,2),而这个点不属于任何一个多边形的内部。

在表中使用 CROSSES() 函数

我们可以在表中使用 CROSSES() 函数,例如,假设我们有一个名为 roads 的表,它包含了道路的名称和几何对象,我们可以使用 CROSSES() 函数来查询哪些道路相交,例如:

SELECT r1.name, r2.name FROM roads r1, roads r2 WHERE CROSSES(r1.geom, r2.geom) AND r1.name <> r2.name;

输出结果为:

+------+------+
| name | name |
+------+------+
| A    | B    |
| B    | A    |
| C    | D    |
| D    | C    |
+------+------+

这表示道路 A 和 B 相交,道路 C 和 D 相交。

使用 CROSSES() 函数来筛选数据

我们可以使用 CROSSES() 函数来筛选数据,例如,假设我们有一个名为 places 的表,它包含了地点的名称和几何对象,我们可以使用 CROSSES() 函数来查询哪些地点位于一条线段的两侧,例如:

SELECT name FROM places WHERE CROSSES(LINESTRING(0,0,2,2), geom);

输出结果为:

+------+
| name |
+------+
| X    |
| Y    |
+------+

这表示地点 X 和 Y 位于线段 LINESTRING(0,0,2,2) 的两侧。

相关函数

除了 CROSSES() 函数,MariaDB 还提供了一些与几何对象相交相关的函数,例如:

  • INTERSECTS() 函数:它用于判断两个几何对象是否有公共点,不管是边界还是内部。
  • [TOUCHES()](how-touches-works-in-mariadb.md) 函数:它用于判断两个几何对象是否仅在边界上有公共点,而不在内部。
  • OVERLAPS() 函数:它用于判断两个几何对象是否部分重叠,且它们的维度相同。
  • CONTAINS() 函数:它用于判断一个几何对象是否完全包含另一个几何对象。
  • WITHIN() 函数:它用于判断一个几何对象是否完全位于另一个几何对象内部。

以下是一些使用这些函数的实例:

-- 判断两个几何对象是否有公共点
SELECT INTERSECTS(LINESTRING(0,0,2,2), POLYGON((0,1,1,0,2,1,1,2,0,1)));

-- 判断两个几何对象是否仅在边界上有公共点
SELECT TOUCHES(LINESTRING(0,0,2,2), POLYGON((0,1,1,0,2,1,1,2,0,1)));

-- 判断两个几何对象是否部分重叠
SELECT OVERLAPS(POLYGON((0,0,0,2,2,2,2,0,0,0)), POLYGON((1,1,1,3,3,3,3,1,1,1)));

-- 判断一个几何对象是否完全包含另一个几何对象
SELECT CONTAINS(POLYGON((0,0,0,2,2,2,2,0,0,0)), POINT(1,1));

-- 判断一个几何对象是否完全位于另一个几何对象内部
SELECT WITHIN(POINT(1,1), POLYGON((0,0,0,2,2,2,2,0,0,0)));

结论

本文介绍了 MariaDB 的 CROSSES() 函数的基础用法与实例,以及与之相关的一些函数。CROSSES() 函数是一种几何关系函数,用于判断两个几何对象是否相交,但不包含在彼此内部。CROSSES() 函数返回一个布尔值,表示两个几何对象是否相交。CROSSES() 函数的语法是 CROSSES(g1, g2),其中 g1g2 是要判断是否相交的两个几何对象。如果 g1g2NULL,则函数返回 NULL。我们可以使用 CROSSES() 函数来判断两条线段是否相交,一条线段和一个多边形是否相交,两个多边形是否相交,在表中使用 CROSSES() 函数,以及使用 CROSSES() 函数来筛选数据。除了 CROSSES() 函数,MariaDB 还提供了一些与几何对象相交相关的函数,如 INTERSECTS()TOUCHES()OVERLAPS()CONTAINS()WITHIN() 等,它们也可以用于判断几何