在空间数据库(如 PostgreSQL 的 PostGIS 扩展)中,ST_Intersects、ST_Crosses 和 ST_Overlaps 是用于判断两个空间对象之间关系的函数,它们的含义和区别如下:
1. ST_Intersects(A, B)
- 含义 :判断两个空间对象是否存在任何形式的空间交集(即至少有一个点同时属于两个对象)。
- 范围:是最宽泛的空间关系判断,涵盖了所有 "有重叠部分" 的情况,包括完全包含、交叉、部分重叠等。
- 示例 :
- 两个多边形部分重叠;
- 一条线穿过一个多边形;
- 一个点落在另一个多边形内部;
- 一个多边形完全包含另一个多边形。

2. ST_Crosses(A, B)
- 含义 :判断两个空间对象是否 "交叉",即它们的交集非空 ,且:
- 交集的维度低于两个对象中维度较高的那个;
- 交集不是其中一个对象的全部(即不包含)。
- 适用场景:通常发生在不同维度的对象之间,或同维度但不形成包含 / 完全重叠的情况。
- 示例 :
- 一条线穿过一个多边形(线与面交叉,交集是线的一部分,维度低于面);
- 两条线相交但不重合(交集是一个点,维度低于线);
- 一个面与另一个面的边界线交叉(交集是线,维度低于面)。

3. ST_Overlaps(A, B)
- 含义 :判断两个空间对象是否 "部分重叠",即:
- 它们的维度相同;
- 交集的维度与它们相同(即重叠部分是同维度的子对象);
- 交集不是其中任何一个对象的全部(即既不包含,也不完全重合)。
- 适用场景:仅适用于同维度对象之间的部分重叠。
- 示例 :
- 两个多边形部分重叠(交集是一个多边形);
- 两条线部分重合(交集是一条线,但不包含整条线)。

例子:
多边形完全包含点
-
A:一个多边形(面状,维度 2);
-
B:一个点(点状,维度 0),且该点位于多边形内部。
-
ST_Intersects(A, B):为真(点在多边形内,有交集); -
ST_Crosses(A, B):为假(交叉要求交集维度低于高维对象且不包含,但此处点被多边形完全包含,不符合 "不包含" 条件); -
ST_Overlaps(A, B):为假(重叠要求同维度,而多边形是 2 维、点是 0 维,维度不同)。
构造数据
sql
-- 插入一个多边形(面状,维度2)
INSERT INTO spatial_test (name, geom)
VALUES ('多边形A', ST_GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'));
-- 插入一个位于多边形内部的点(点状,维度0)
INSERT INTO spatial_test (name, geom)
VALUES ('点B', ST_GeomFromText('POINT(5 5)'));
验证关系
sql
-- 查询两个对象的关系
SELECT
ST_Intersects(A.geom, B.geom) AS intersects,
ST_Crosses(A.geom, B.geom) AS crosses,
ST_Overlaps(A.geom, B.geom) AS overlaps
FROM spatial_test A, spatial_test B
WHERE A.name = '多边形A' AND B.name = '点B';
结果
| intersects | crosses | overlaps |
|---|---|---|
| t | f | f |
说明
- 点在多边形内,故
ST_Intersects为真; - 点被完全包含,不符合
ST_Crosses的 "不包含" 条件,故为假; - 维度不同(2 维 vs 0 维),
ST_Overlaps为假。
核心区别总结
| 函数 | 核心判断条件 | 适用维度 | 包含关系? | 交叉关系? | 部分重叠(同维度)? |
|---|---|---|---|---|---|
ST_Intersects |
存在任何交集(最宽泛) | 所有维度 | 是 | 是 | 是 |
ST_Crosses |
交集非空,且维度低于高维对象,且不包含 | 不同维度或同维度 | 否 | 是 | 否(同维度时交集维度低) |
ST_Overlaps |
同维度,交集同维度,且不包含 | 同维度 | 否 | 否 | 是 |
简单来说:
ST_Intersects是 "有交集就返回真";ST_Crosses是 "交集维度更低且不包含";ST_Overlaps是 "同维度且部分重叠"。