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 是 "同维度且部分重叠"。
相关推荐
是大芒果6 分钟前
数据库表设计
数据库
哥哥还在IT中11 分钟前
MySQL order by 如何优化
数据库·mysql
积跬步,慕至千里31 分钟前
postgre数据库大批量快速导出方法总结
数据库·postgres
帅大大的架构之路1 小时前
mysql批量插入数据如何更快
数据库·mysql
Amber_372 小时前
mysql 死锁场景 INSERT ... ON DUPLICATE KEY UPDATE
数据库·mysql
VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue敬老院管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
文刀竹肃3 小时前
DVWA -SQL Injection-通关教程-完结
前端·数据库·sql·安全·网络安全·oracle
思成不止于此3 小时前
【MySQL 零基础入门】MySQL 约束精讲(一):基础约束篇
数据库·笔记·sql·学习·mysql
ActionTech3 小时前
SCALE | SQLFlash 在 SQL 优化维度上的表现评估
数据库·sql
老华带你飞4 小时前
建筑材料管理|基于springboot 建筑材料管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·spring