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)
;
これらの関数で、二つのジオメトリに対するDimensionally Extended 9-Intersection Model (DE-9IM)で定義される空間 (トポロジ)関係のテストと評価が可能になります。
DE-9IMは9要素の行列で、二つのジオメトリの内部、境界、外部のインタセクションの次元を示しています。'F', '0', '1', '2'の文字による9文字の文字列で表現します (例えば 'FF1FF0102'
)。
特定の種類の空間関係は、intersection matrix patternという交差行列の比較によって評価されます。パターンには追加で文字'T'と'*'が使えます。一般の空間関係は名前付き関数で提供されています。名前付き関数にはST_Contains, ST_ContainsProperly, ST_Covers, ST_CoveredBy, ST_Crosses, ST_Disjoint, ST_Equals, ST_Intersects, ST_Overlaps, ST_Touches, ST_Withinがあります。明示的なパターンを使うと、インタセクション、クロス等の複数の条件を一度にテストすることができます。また、名前付き空間関数を持たない空間関係のテストも可能です。たとえば、「内部-交差」の関係はDE-9IM パターンT********
となり、名前付き述語の中には存在しません。
詳細情報については「空間関係の決定」をご覧下さい。
一つ目の形式: 二つのジオメトリが、与えられたintersectionMatrixPattern
による空間関係に合うかどうかを見ます。
![]() | |
他の名前の付いた空間関係述語の多くと異なり、この関数は自動ではインデックスの呼び出しを*行いません*。インタセクト*しない*ジオメトリでTRUEになる関係があるためです。インタセクションが求められる関係パターンを使用している場合には、関数呼び出しに&&を取り入れてください。 |
![]() | |
存在するなら、名前の追加空間関係関数を使う方が良いです。空間インデックスが存在するなら自動で使用してくれるからです。また、完全な関係評価では有効にならない能率最適化が実装されていることがあります。 |
二つ目の形式: 二つのジオメトリの空間関係のDE-9IM行列文字列を返します。行列文字列は、ST_RelateMatchを使ったDE-9IMパターンと合致するかテストさせることができます。
三つ目の形式: 二つ目の形式と同じですが、Boundary Node Ruleの指定ができる点が異なります。Boundary Node Ruleによって、ジオメトリ境界のポイントがDE-9IMの内部または境界にあるかどうかをより良く制御することが可能です。boundaryNodeRule
のコードは、1: OGC/MOD2, 2: Endpoint, 3: MultivalentEndpoint, 4: MonovalentEndpoint です。
OGC仕様にはありませんが実装しました。s2.1.13.2をご覧下さい。
This method implements the OpenGIS Simple Features
Implementation Specification for SQL 1.1. s2.1.1.2 // s2.1.13.3
This method implements the SQL/MM specification. SQL-MM 3: 5.1.25
GEOSモジュールによって実現しています。
Enhanced: 2.0.0 - 境界ノード規則が追加されました。
![]() | |
Enhanced: 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
独自の空間関係パターンを問い合わせ条件としてテストします。空間インデックスの使用を有効にするために&&
を使っています。
-- poly (内部でインタセクト)と完全にインタセクトしている (接触ではない)区域の探索 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)); st_relate ----------- 0FFFFF212 SELECT ST_Relate( 'LINESTRING(1 2, 3 4)', 'LINESTRING(5 6, 7 8)' ); st_relate ----------- FF1FF0102