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 是 "同维度且部分重叠"。
相关推荐
不光头强41 分钟前
Spring框架的事务管理
数据库·spring·oracle
百***92023 小时前
【MySQL】MySQL库的操作
android·数据库·mysql
q***76663 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
信仰_2739932433 小时前
Redis红锁
数据库·redis·缓存
人间打气筒(Ada)3 小时前
Centos7 搭建hadoop2.7.2、hbase伪分布式集群
数据库·分布式·hbase
心灵宝贝3 小时前
如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程)
数据库·mysql·macos
奋斗的牛马4 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
忧郁的橙子.5 小时前
一、Rabbit MQ 初级
服务器·网络·数据库
杰杰7985 小时前
SQL 实战:用户访问 → 下单 → 支付全流程转化率分析
数据库·sql
爬山算法5 小时前
Redis(120)Redis的常见错误如何处理?
数据库·redis·缓存