ST_RELATE
📄字数 1.8K
👁️阅读量 加载中...
功能描述
测试和评估两个几何图形之间的空间(拓扑)关系,如维度扩展 九交模型 (DE-9IM) 所定义。
语法格式
sql
BOOLEAN ST_RELATE(GEOMETRY geomA, GEOMETRY geomB, VARCHAR intersectionMatrixPattern);
VARCHAR ST_RELATE(GEOMETRY geomA, GEOMETRY geomB);
VARCHAR ST_RELATE(GEOMETRY geomA, GEOMETRY geomB, INTEGER boundaryNodeRule);参数说明
- geomA:第一个目标 GEOMETRY 对象。
- geomB:第二个目标 GEOMETRY 对象。
- intersectionMatrixPattern: DE-9IM 矩阵字符串。
- boundaryNodeRule:边界节点规则。值为:
- 1:OGC-Mod2 : 如果线条端点出现奇数次,则它们位于边界内。 这是 OGC SFS 标准定义的规则,也是 ST_Relate 的默认规则。
- 2:Endpoint : 所有端点都在边界内。
- 3:MultivalentEndpoint : 如果端点出现多次,则它们位于边界内。 换句话说,边界是所有“附加”或“内部”端点(但不是“未附加/外部”端点)。
- 4:MonovalentEndpoint : 如果端点仅出现一次,则端点位于边界内。 换句话说,边界是所有“未连接”或“外部”端点。
函数返回类型
BOOLEAN/VARCHAR 类型
使用说明
- DE-9IM 被指定为 9 元素矩阵,指示两个几何图形的内部、边界和外部之间相交的维度。 它由使用符号
F、0、1、2的 9 个字符文本字符串表示(例如FF1FF0102)。 - 函数1:根据给定的 DE-9IM 测试两个几何图形是否在空间上相关。
- 此函数不会自动包含索引调用。如果需要交集的关系模式,请在函数调用中包含
&&。
- 此函数不会自动包含索引调用。如果需要交集的关系模式,请在函数调用中包含
- 函数2:返回两个输入几何之间的空间关系的 DE-9IM 矩阵字符串。 可以使用 ST_RELATEMATCH 测试矩阵字符串与 DE-9IM 模式匹配。
- 函数3:与函数2 类似,但允许指定边界节点规则。边界节点规则允许更好地控制 MULTILINESTRING 的端点是否被视为位于 DE-9IM 内部或边界内。
- 这些函数由 GEOS 模块实现。
- 这些函数支持 GEOMETRYCOLLECTION。
示例
使用布尔值函数测试空间关系:
sql
SQL> SELECT ST_RELATE('POINT(1 2)', ST_BUFFER( 'POINT(1 2)', 2), '0FFFFF212');
+-------+
| EXPR1 |
+-------+
| T |
+-------+
(1 row)
SQL> SELECT ST_Relate('POINT(1 2)', ST_Buffer( 'POINT(1 2)', 2), '*FF*FF212');
+-------+
| EXPR1 |
+-------+
| T |
+-------+
(1 row)测试一个自定义的空间关系模式作为查询条件,使用 && 来启用空间索引。
sql
-- 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********');计算空间关系的交集矩阵:
sql
SQL> SELECT ST_RELATE( 'POINT(1 2)',
ST_BUFFER( 'POINT(1 2)', 2));
+-----------+
| EXPR1 |
+-----------+
| 0FFFFF212 |
+-----------+
(1 row)
SQL> SELECT ST_RELATE( 'LINESTRING(1 2, 3 4)',
'LINESTRING(5 6, 7 8)' );
+-----------+
| EXPR1 |
+-----------+
| FF1FF0102 |
+-----------+
(1 row)使用不同的边界节点规则来计算具有重复端点的 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。
sql
SQL> 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 |
+-----------+--------------+
(1 row)