名前

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
図
Geometry figure for visual-st-crosses-01

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
図
Geometry figure for visual-st-crosses-02

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
図
Geometry figure for visual-st-crosses-03

二つの 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
図
Geometry figure for visual-st-crosses-04

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);

関連情報

ST_Contains, ST_Overlaps