Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


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 类型

使用说明

  1. DE-9IM 被指定为 9 元素矩阵,指示两个几何图形的内部、边界和外部之间相交的维度。 它由使用符号F012的 9 个字符文本字符串表示(例如FF1FF0102)。
  2. 函数1:根据给定的 DE-9IM 测试两个几何图形是否在空间上相关。
    • 此函数不会自动包含索引调用。如果需要交集的关系模式,请在函数调用中包含 &&
  3. 函数2:返回两个输入几何之间的空间关系的 DE-9IM 矩阵字符串。 可以使用 ST_RELATEMATCH 测试矩阵字符串与 DE-9IM 模式匹配。
  4. 函数3:与函数2 类似,但允许指定边界节点规则。边界节点规则允许更好地控制 MULTILINESTRING 的端点是否被视为位于 DE-9IM 内部或边界内。
  5. 这些函数由 GEOS 模块实现。
  6. 这些函数支持 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)