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

在空间数据库(如 PostgreSQL 的 PostGIS 扩展)中,ST_IntersectsST_CrossesST_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 是 "同维度且部分重叠"。
相关推荐
Coder_Boy_10 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy10 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道12 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_124987075312 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha12 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_12 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance12 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋13 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.13 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
光蛋13 小时前
Docker Compose 助力阿里云 Linux 3 PostgreSQL 高可用部署
postgresql