ST_Touches — 二つのジオメトリーが少なくとも一つの共有点を持ち、かつ内部でインタセクトしていないようになっているかテストします。
boolean ST_Touches(geometry A, geometry B);
A と B がインタセクトするが A の内部と B の内部がインタセクトしない場合にはTRUEを返します。A と B が少なくとも一つの共有点があり、共有点が少なくとも一つの境界の上にあることと同じです。ポイント/ポイント入力では、ポイントは境界を持たないため、常にFALSEを返します。
数学用語では: ST_Touches(A, B) ⇔ (Int(A) ⋂ Int(B) = ∅) ∧ (A ⋂ B ≠ ∅)
この関係は、二つのジオメトリーの DE-9IM 交差行列がどれか一つに合致すると、関係が保持されていることになります:
FT*******
F**T*****
F***T****
|
|
|
この関数を実行すると、対象ジオメトリーにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 インデックスの使用を避けるには |
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.1.2 // s2.1.13.3
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.28
次の例ではST_Touches述語はTRUEを返します。
境界部分に沿って接触する二つの POLYGON。
SELECT ST_Touches(a, b) FROM (SELECT 'POLYGON ((10 190,10 70,80 70,80 130,50 160,120 160,120 190,10 190))'::geometry AS a, 'POLYGON ((80 110,140 140,190 110,180 40,140 10,80 50,80 70,80 110))'::geometry AS b ) AS example;
t
境界上のポイントで接触している二つの POLYGON。
SELECT ST_Touches(a, b) FROM (SELECT 'POLYGON ((10 190,10 70,80 70,80 130,50 160,120 160,120 190,10 190))'::geometry AS a, 'POLYGON ((140 140,190 110,180 40,140 10,80 70,140 140))'::geometry AS b ) AS example;
t
LINESTRING の終端で接触している POLYGON と LINESTRING。
SELECT ST_Touches(a, b) FROM (SELECT 'POLYGON ((80 10,50 40,50 90,80 130,140 120,160 70,140 30,80 10))'::geometry AS a, 'LINESTRING (30 190,180 150,160 70)'::geometry AS b ) AS example;
t
両方の端点で接触する二つの LINESTRING。
SELECT ST_Touches(a, b) FROM (SELECT 'LINESTRING (10 10,60 140,140 190)'::geometry AS a, 'LINESTRING (140 190,190 10)'::geometry AS b ) AS example;
t
一方の端点がもう一方の端点でない点で接触している二つの LINESTRING。
SELECT ST_Touches(a, b) FROM (SELECT 'LINESTRING (10 10,60 140,140 190)'::geometry AS a, 'LINESTRING (60 140,190 10)'::geometry AS b ) AS example;
t
POLYGON と境界で接触している POINT。
SELECT ST_Touches(a, b) FROM (SELECT 'POLYGON ((30 30,10 110,40 190,120 170,180 180,170 100,130 10,30 30))'::geometry AS a, 'POINT (170 100)'::geometry AS b ) AS example;
t
SELECT ST_Touches('LINESTRING(0 0,1 1,0 2)'::geometry, 'POINT(1 1)'::geometry);
f
SELECT ST_Touches('LINESTRING(0 0,1 1,0 2)'::geometry, 'POINT(0 2)'::geometry);
t