名稱

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 交集模型 (Dimensionally Extended 9-Intersection Model,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]

與大多數已命名的空間關係述詞不同,此函式不會自動包含索引呼叫。原因是某些關係對於沒有交集的幾何物件為真 (例如 Disjoint)。如果您使用需要交集的關係模式,則包含 && 索引呼叫。

[Note]

如果有的話,最好使用已命名的關係函式,因為它們會在存在空間索引時自動使用空間索引。此外,它們可能實作完整的 relate 評估所無法使用的效能最佳化。

變體 2: 傳回兩個輸入幾何物件之間空間關係的 DE-9IM 矩陣字串。可以使用 ST_RelateMatch 測試矩陣字串是否符合 DE-9IM 模式。

變體 3: 與變體 2 類似,但允許指定邊界節點規則。邊界節點規則允許更精細地控制 MultiLineString 的端點是否被視為位於 DE-9IM 的內部或邊界中。boundaryNodeRule 的值為:

  • 1: OGC-Mod2 - 如果線條端點出現奇數次,則在邊界中。這是 OGC SFS 標準定義的規則,也是 ST_Relate 的預設值。

  • 2: 端點 - 所有端點都在邊界中。

  • 3: 多價端點 - 如果端點出現多次,則在邊界中。換句話說,邊界是所有「附加」或「內部」端點 (但不是「未附加/外部」端點)。

  • 4: 單價端點 - 如果端點僅出現一次,則在邊界中。換句話說,邊界是所有「未附加」或「外部」端點。

此函式不在 OGC 規範中,但已隱含。請參閱 s2.1.13.2

此方法實作 OGC Simple Features Implementation Specification for SQL 1.1. 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

使用不同的邊界節點規則來計算具有重複端點 (3 3) 的 LineString 和 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