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)
;
这些函数允许测试和评估两个几何图形之间的空间(拓扑)关系,如维度扩展 九交模型 (DE-9IM) 所定义。
DE-9IM 被指定为 9 元素矩阵,指示两个几何图形的内部、边界和外部之间相交的维度。 它由使用符号“F”、“0”、“1”、“2”的 9 个字符文本字符串表示(例如“FF1FF0102”
)。
可以通过将相交矩阵与相交矩阵模式进行匹配来测试特定类型的空间关系。 模式可以包含附加符号“T”(表示“交集非空”)和“*”(表示“任何值”)。 常见空间关系由命名函数 ST_Contains、ST_ContainsProperly、ST_Covers、ST_CoveredBy、ST_Crosses、ST_Disjoint、ST_Equals、ST_Intersects、ST_Overlaps、ST_Touches和 ST_Within 提供。 使用显式模式可以一步测试相交、交叉等多种条件。 它还允许测试没有命名空间关系函数的空间关系。 例如,关系“Interior-Intersects”具有 DE-9IM 模式 T********
,该模式不由任何命名谓词求值。
有关更多信息,请参见Section 5.1, “空间关系的确定”。
形式 1:根据给定的 junctionMatrixPattern
测试两个几何图形是否在空间上相关。
与大多数命名空间关系谓词不同,这不会自动包含索引调用。 原因是某些关系对于不相交的几何图形是正确的(例如不相交)。 如果您使用需要交集的关系模式,请在函数调用中包含 &&。 |
如果可用,最好使用命名关系函数,因为它们会自动使用存在的空间索引。 此外,他们还可以实现完全相关评估所无法实现的性能优化。 |
形式 2:返回两个输入几何之间的空间关系的 DE-9IM 矩阵字符串。 可以使用 ST_RelateMatch 测试矩阵字符串与 DE-9IM 模式匹配。
形式 3:与形式 2 类似,但允许指定边界节点规则。 边界节点规则允许更好地控制 MultiLineString 的端点是否被视为位于 DE-9IM 内部或边界内。 boundaryNodeRule
值为:
1
:OGC-Mod2 - 如果线条端点出现奇数次,则它们位于边界内。 这是 OGC SFS 标准定义的规则,也是 ST_Relate
的默认规则。
2
:Endpoint - 所有端点都在边界内。
3
:MultivalentEndpoint - 如果端点出现多次,则它们位于边界内。 换句话说,边界是所有“附加”或“内部”端点(但不是“未附加/外部”端点)。
4
:MonovalentEndpoint - 如果端点仅出现一次,则端点位于边界内。 换句话说,边界是所有“未连接”或“外部”端点。
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 - 添加了对指定边界节点规则的支持。
增强:3.0.0 启用了对 |
使用布尔值函数测试空间关系。
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 和 MultiLineString 之间的空间关系 (3 3)
:
使用 OGC-Mod2 规则 (1),重复端点位于 MultiLineString 的内部,因此 DE-9IM 矩阵条目 [aB:bI] 为 0
,[aB:bB] 为 F
。
使用Endpoint规则 (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