ST_Crosses — Tests if two geometries have some, but not all, interior points in common
boolean ST_Crosses(geometry g1, geometry g2);
Compares two geometry objects and
returns true if their intersection "spatially crosses";
that is, the geometries have some, but not all interior points in common.
The intersection of the interiors of the geometries must be non-empty
and must have dimension less than the maximum dimension
of the two input geometries, and the intersection of the two
geometries must not equal either geometry. Otherwise, it
returns false.
The crosses relation is symmetric and irreflexive.
In mathematical terms: ST_Crosses(A, B) ⇔ (dim( Int(A) ⋂ Int(B) ) < max( dim( Int(A) ), dim( Int(B) ) )) ∧ (A ⋂ B ≠ A) ∧ (A ⋂ B ≠ B)
Geometries cross if their DE-9IM Intersection Matrix matches:
T*T****** for Point/Line, Point/Area, and Line/Area situations
T*****T** for Line/Point, Area/Point, and Area/Line situations
0******** for Line/Line situations
the result is false for Point/Point and Area/Area situations
|
|
|
The OpenGIS Simple Features Specification defines this predicate only for Point/Line, Point/Area, Line/Line, and Line/Area situations. JTS / GEOS extends the definition to apply to Line/Point, Area/Point and Area/Line situations as well. This makes the relation symmetric. |
|
|
|
This function automatically includes a bounding box comparison that makes use of any spatial indexes that are available on the geometries. |
Enhanced: 3.0.0 enabled support for GEOMETRYCOLLECTION
This method implements the OGC Simple Features
Implementation Specification for SQL 1.1.
s2.1.13.3
This method implements the SQL/MM specification.
SQL-MM 3: 5.1.29
The following situations all return true.
A LineString crosses a MultiPoint when some, but not all, points lie on the line.
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
A Polygon crosses a MultiPoint when some, but not all, points lie in its interior.
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
A LineString crosses a Polygon when part of the line lies inside and part outside.
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
Two LineStrings cross when they share an interior point.
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
Consider a situation where a user has two tables: a table of roads and a table of highways.
|
Code
CREATE TABLE roads ( id serial NOT NULL, geom geometry, CONSTRAINT roads_pkey PRIMARY KEY (road_id) );
|
Code
CREATE TABLE highways ( id serial NOT NULL, the_gem geometry, CONSTRAINT roads_pkey PRIMARY KEY (road_id) );
|
To determine a list of roads that cross a highway, use a query similar to:
SELECT roads.id FROM roads, highways WHERE ST_Crosses(roads.geom, highways.geom);