You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostGIS ST_Contains:如何查询当前BBox落在表内的哪个BBox中

针对你这个查询的判定结果

按照PostGIS默认的几何判定规则,你写的这条查询不会返回任何记录,具体原因和修正方法如下:

核心逻辑拆解

ST_Contains的判定规则

PostGIS遵循OGC简单要素规范判定几何关系,ST_Contains(geomA, geomB)仅在满足以下全部条件时返回true:

  • geomB的所有点都处于geomA的内部范围
  • geomB不存在任何点落在geomA的外部
  • geomB和geomA的边界没有交集

注意:几何对象的边界不属于内部范畴,只要geomB存在点和geomA的边界重合,函数就会返回false。

逐行匹配表内数据

你的查询逻辑是筛选出“存储在bbox字段的矩形范围,可以完整包住你传入的查询Envelope”的记录,我们逐行对照现有数据:

  • 第一条记录
    存储的bbox范围为11.66952931 ≤ x ≤ 12.18612053, 47.79336862 ≤ y ≤ 48.14030283,整体尺寸远小于你传入的Envelope范围(11.58624574 ≤ x ≤ 12.21446607, 47.71313579 ≤ y ≤ 48.13538804)。因为传入的Envelope四周都超出了这个存储bbox的边界,根本不可能被该bbox包含,不满足筛选条件。
  • 第二条记录
    存储的bbox四个边界值和你传入的Envelope完全相等,两个矩形是完全重合的等大几何对象。按照ST_Contains的判定规则,此时你传入的Envelope边界点完全落在存储bbox的边界上,不属于内部范围,因此ST_Contains(bbox, 传入Envelope)的返回值为false,也不会被筛选出来。

可用的修正方案

你的需求是找到覆盖给定查询范围的存储bbox,不需要严格排除边界重合的场景,直接把ST_Contains替换为判定规则更适配的ST_Covers即可。

ST_Covers(geomA, geomB)的判定规则为:只要geomB的所有点都处于geomA的内部或边界上,就会返回true,完全兼容你这种边界完全重合的场景。

修正后的查询语句:

SELECT bbox,BBOX_Diagonale,file 
FROM graphs 
WHERE ST_Covers(bbox, ST_MakeEnvelope(11.58624574, 47.71313579, 12.21446607, 48.13538804, 4326)) 
ORDER BY BBOX_Diagonale ASC 
LIMIT 1;

按照你表内的现有数据,这条修正后的语句一定会返回第二条的记录。

内容的提问来源于stack exchange,提问作者Andreas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 19:15:01