ST_Crosses — 二つのジオメトリーが内部に共有ポイントを持ち、かつそれだけにならないようになっているかテストします。
boolean ST_Crosses(geometry g1, geometry g2);
二つのジオメトリーを比較して、「空間的にクロスしている」場合にTRUEを返します。ジオメトリーは内部の共通点をいくつか持っていますが、全て持っているわけではありません。ジオメトリーの内部の共通部分は空ではなく、二つのジオメトリーの最大図形次元より小さくなければなりません。二つのジオメトリーの共通部分は、入力ジオメトリーのいずれとも同じであってはなりません。クロスでないならFALSEを返します。クロスの関係は対称ですが無反射です。
数学用語では: ST_Crosses(A, B) ⇔ (dim( Int(A) ⋂ Int(B) ) < max( dim( Int(A) ), dim( Int(B) ) )) ∧ (A ⋂ B ≠ A) ∧ (A ⋂ B ≠ B)
DE-9IM 交差行列が次の通り合致するとジオメトリーはクロスしています:
Point/Line, Point/Area, Line/Area の場合にはT*T******
Line/Point, Area/Point, Area/Line の場合にはT*****T**
Line/Line の場合には0********
点/点の状況や面/面の状況では、結果はFALSEです
|
|
|
OpenGIS Simple Feature Specification では、この述語は Point/Line, Point/Area, Line/Line, Line/Area の場合についてのみ定義されています。JTS/GEOS では、Line/Point, Area/Point, Area/Line について拡張しています。これによって関係が対称になっています。 |
|
|
|
この関数を実行すると、対象ジオメトリーにおいて使用できるインデックスを使用したバウンディングボックスによる比較が自動的に行われます。 |
Enhanced: 3.0.0 GEOMETRYCOLLECTIONへの対応が可能となりました
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。 s2.1.13.3
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.29
次の場合には全てTRUEを返します。
LINESTRING は、全てでなく一部のポイントがそのラインストリング上にある MULTIPOINT とクロスします。
SELECT ST_Crosses(a, b) FROM (SELECT 'LINESTRING (10 190,60 80,130 120,190 10)'::geometry AS a, 'MULTIPOINT (80 170,120 13,130 120,181 142)'::geometry AS b ) AS example;
t
POLYGON は、全てでなく一部のポイントがそのポリゴンの内部にある MULTIPOINT とクロスします。
SELECT ST_Crosses(a, b) FROM (SELECT 'POLYGON ((30 190,10 100,10 10,90 20,110 70,80 130,30 190))'::geometry AS a, 'MULTIPOINT (56 60,120 13,130 119,181 142)'::geometry AS b ) AS example;
t
LINESTRING は、そのラインストリングの一部が内部にあり、かつ一部が外にある POLYGON とクロスします。
SELECT ST_Crosses(a, b) FROM (SELECT 'POLYGON ((30 190,10 100,10 10,90 20,110 70,80 130,30 190))'::geometry AS a, 'LINESTRING (30 40,70 50,120 150,190 190)'::geometry AS b ) AS example;
t
二つの LINESTRING は、内部のポイントを共有している時には、クロスしています。
SELECT ST_Crosses(a, b) FROM (SELECT 'LINESTRING (10 190,60 80,130 120,190 10)'::geometry AS a, 'LINESTRING (10 10,70 30,110 120,190 190)'::geometry AS b ) AS example;
t
roads (道路) と highways (高速道路) の 2つのテーブルを持っている場面を考えます。
|
コード
CREATE TABLE roads ( id serial NOT NULL, geom geometry, CONSTRAINT roads_pkey PRIMARY KEY (road_id) );
|
コード
CREATE TABLE highways ( id serial NOT NULL, the_gem geometry, CONSTRAINT roads_pkey PRIMARY KEY (road_id) );
|
次のようなクエリを使って、highway とクロスする roads のリストを決定します。
SELECT roads.id FROM roads, highways WHERE ST_Crosses(roads.geom, highways.geom);