名称

ST_Relate — 测试两个几何体是否具有与交集矩阵模式匹配的拓扑关系,或计算其交集矩阵

概要

boolean ST_Relate(geometry geomA, geometry geomB, text intersectionMatrixPattern);

text ST_Relate(geometry geomA, geometry geomB);

text ST_Relate(geometry geomA, geometry geomB, integer boundaryNodeRule);

描述

这些函数允许测试和评估两个几何体之间的空间(拓扑)关系,如 维度扩展 9 交集模型 (DE-9IM) 所定义。

DE-9IM 指定为一个 9 元素矩阵,表示两个几何体的内部、边界和外部之间的交集维度。它使用符号“F”、“0”、“1”、“2”表示为一个 9 字符文本字符串(例如 'FF1FF0102')。

可以通过将交集矩阵与交集矩阵模式匹配来测试特定类型的空间关系。模式可以包括附加符号“T”(表示“交集非空”)和“*”(表示“任何值”)。通用的空间关系由命名函数 ST_ContainsST_ContainsProperlyST_CoversST_CoveredByST_CrossesST_DisjointST_EqualsST_IntersectsST_OverlapsST_TouchesST_Within 提供。使用显式模式允许在一步骤中测试相交、交叉等多个条件。它还允许测试没有命名空间关系函数的空间关系。例如,关系“内部相交”具有 DE-9IM 模式 T********,任何命名谓词都不会对其进行评估。

有关更多信息,请参阅第 5.1 节,“确定空间关系”

变体 1:根据给定的intersectionMatrixPattern测试两个几何是否在空间上相关。

[Note]

与大多数已命名的空间关系谓词不同,此谓词不会自动包含索引调用。原因是某些关系对于不重叠的几何(例如不相交)是成立的。如果您正在使用需要相交的关系模式,则应包含&&索引调用。

[Note]

如果可用,最好使用已命名的关系函数,因为它们会自动在存在空间索引的情况下使用该索引。此外,它们还可以实现完全相关评估中不可用的性能优化。

变体 2:返回两个输入几何之间的空间关系的 DE-9IM 矩阵字符串。可以使用ST_RelateMatch测试矩阵字符串是否与 DE-9IM 模式匹配。

变体 3:与变体 2 类似,但允许指定边界节点规则。边界节点规则可以更精细地控制 MultiLineStrings 的端点是否位于 DE-9IM 内部或边界中。boundaryNodeRule值是

  • 1: OGC-Mod2 - 如果线端点出现奇数次,则它们位于边界中。这是 OGC SFS 标准定义的规则,也是ST_Relate的默认规则。

  • 2: 端点 - 所有端点都位于边界中。

  • 3: 多价端点 - 如果端点出现多次,则它们位于边界中。换句话说,边界是所有“附加的”或“内部的”端点(但不是“未附加的/外部的”端点)。

  • 4: 单价端点 - 如果端点仅出现一次,则它们位于边界中。换句话说,边界是所有“未附加的”或“外部的”端点。

此函数不在 OGC 规范中,但隐含其中。请参阅 s2.1.13.2

此方法实现了SQL 1.1 的 OGC 简单要素实现规范

s2.1.1.2 // s2.1.13.3

此方法实现了 SQL/MM 规范。

SQL-MM 3: 5.1.25

由 GEOS 模块执行

增强:2.0.0 - 添加了对指定边界节点规则的支持。

[Important]

增强:3.0.0 启用了对 GEOMETRYCOLLECTION 的支持

示例

使用布尔值函数测试空间关系。

SELECT ST_Relate('POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '0FFFFF212');
st_relate
-----------
t

SELECT ST_Relate(POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '*FF*FF212');
st_relate
-----------
t

使用 && 测试自定义空间关系模式作为查询条件,以启用使用空间索引。

-- Find compounds that properly intersect (not just touch) a poly (Interior Intersects)

SELECT c.* , p.name As poly_name
    FROM polys AS p
    INNER JOIN compounds As c
          ON c.geom && p.geom
             AND ST_Relate(p.geom, c.geom,'T********');

计算空间关系的交集矩阵。

SELECT ST_Relate( 'POINT(1 2)',
                  ST_Buffer( 'POINT(1 2)', 2));
-----------
0FFFFF212

SELECT ST_Relate( 'LINESTRING(1 2, 3 4)',
                  'LINESTRING(5 6, 7 8)' );
-----------
FF1FF0102

使用不同的边界节点规则来计算 LineString 和具有重复端点 (3 3) 的 MultiLineString 之间的关系

  • 使用 OGC-Mod2 规则 (1) 重复端点位于 MultiLineString 的 内部,因此 DE-9IM 矩阵条目 [aB:bI] 为 0,[aB:bB] 为 F

  • 使用 端点 规则 (2) 重复端点位于 MultiLineString 的 边界,因此 DE-9IM 矩阵条目 [aB:bI] 为 F,[aB:bB] 为 0

WITH data AS (SELECT
  'LINESTRING(1 1, 3 3)'::geometry AS a_line,
  'MULTILINESTRING((3 3, 3 5), (3 3, 5 3))':: geometry AS b_multiline
)
SELECT ST_Relate( a_line, b_multiline, 1) AS bnr_mod2,
       ST_Relate( a_line, b_multiline, 2) AS bnr_endpoint
    FROM data;

 bnr_mod2  | bnr_endpoint
-----------+--------------
 FF10F0102 | FF1F00102

另请参阅

第 5.1 节,“确定空间关系”ST_RelateMatchST_ContainsST_ContainsProperlyST_CoversST_CoveredByST_CrossesST_DisjointST_EqualsST_IntersectsST_OverlapsST_TouchesST_Within