Nom

ST_Crosses — Teste si deux géométries ont en commun certains points intérieurs, mais pas tous

Synopsis

boolean ST_Crosses(geometry g1, geometry g2);

Description

Compare deux objets géométriques et renvoie true si leur intersection "se croise spatialement", c'est-à-dire que les géométries ont certains points intérieurs en commun, mais pas tous. L'intersection des intérieurs des géométries doit être non vide et doit avoir une dimension inférieure à la dimension maximale des deux géométries d'entrée, et l'intersection des deux géométries ne doit pas être égale à l'une ou l'autre géométrie. Sinon, il renvoie false. La relation entre les croix est symétrique et irréflexive.

En termes mathématiques : ST_Crosses(A, B) ⇔ (dim( Int(A) ⋂ Int(B) ) < max( dim( Int(A) ), dim( Int(B) ) )) ∧ (A ⋂ B ≠ A) ∧ (A ⋂ B ≠ B)

Les géométries se croisent si leur matrice d'intersection DE-9IM correspond :

  • T*T****** pour les situations point/ligne, point/zone et ligne/zone

  • T*****T** pour les situations Ligne/Point, Zone/Point et Zone/Ligne

  • 0******** pour les situations ligne/ligne

  • le résultat est false pour les situations Point/Point et Area/Area

[Note]

La spécification OpenGIS Simple Features définit ce prédicat uniquement pour les situations Point/Ligne, Point/Zone, Ligne/Ligne et Ligne/Zone. Le STC / GEOS étend la définition pour qu'elle s'applique également aux situations Ligne/Point, Zone/Point et Zone/Ligne. Cela rend la relation symétrique.

[Note]

Cette fonction inclut une comparaison de la boîte englobante qui utilise tous les index disponibles sur les géométries.

Amélioration : 3.0.0 a permis la prise en charge de GEOMETRYCOLLECTION

Cette méthode implémente la spécification OGC Simple Features Implementation Specification for SQL 1.1. s2.1.13.3

Cette méthode implémente la spécification SQL/MM. SQL-MM 3: 5.1.29

Exemples

Les situations suivantes renvoient toutes true.

A LineString crosses a MultiPoint when some, but not all, points lie on the line.

Code
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;
Export de raster
t
Figure
Geometry figure for visual-st-crosses-01

A Polygon crosses a MultiPoint when some, but not all, points lie in its interior.

Code
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;
Export de raster
t
Figure
Geometry figure for visual-st-crosses-02

A LineString crosses a Polygon when part of the line lies inside and part outside.

Code
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;
Export de raster
t
Figure
Geometry figure for visual-st-crosses-03

Two LineStrings cross when they share an interior point.

Code
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;
Export de raster
t
Figure
Geometry figure for visual-st-crosses-04

Prenons le cas d'un utilisateur qui dispose de deux tables : une table de routes et une table d'autoroutes.

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

Pour obtenir une liste des routes qui traversent une autoroute, utilisez une requête similaire à :

Code
SELECT roads.id
FROM roads, highways
WHERE ST_Crosses(roads.geom, highways.geom);

Voir aussi

ST_Contains, ST_Overlaps