PostgreSQL ST_Intersects、ST_Crosses 和 ST_Overlaps的含义与区别

在空间数据库(如 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 是 "同维度且部分重叠"。
相关推荐
GeW13 分钟前
新质生产力路线图解读:数据库性能优化与Linux调优专场
linux·数据库
在多学一点2 小时前
MYSQL第二次作业
android·数据库·mysql
Risehuxyc2 小时前
Microsoft.Data.Sqlite体验
数据库·sqlite
骑着蜗牛撵大象3272 小时前
MySQL 8.0 迁移后 SQL 变慢:执行计划里 3 类被忽略的成本差异
android·数据库·sql·mysql·优化器·执行计划
ZENERGY-众壹4 小时前
告警风暴怎么压?100MW 电站监控平台告警引擎架构复盘
数据库·架构·iot·电站监控
zhengfei6114 小时前
Go-fastdfs /reload 未授权访问: 有效PoC
数据库·sql
DevOpenClub5 小时前
高考教育信息问答 API:会话参数、资料引用与流式响应
java·数据库·高考
yuanyuan3345 小时前
2026枣庄带检测报告伸缩门品牌测评|本地服务
大数据·数据库·人工智能·伸缩门
wdyan2975 小时前
带着小白学习-微服务-5 实战:配置中心-数据库连接
数据库·学习·微服务
大维6 小时前
DBX 实测:从 SQLite 查询到 MiniMax-M3 自然语言生成 SQL
数据库·sql·sqlite