Name

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.

[Important]

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.

MULTIPOINT / LINESTRING

MULTIPOINT / POLYGON

LINESTRING / POLYGON

LINESTRING / LINESTRING

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

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

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

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

Voir aussi

ST_Contains, ST_Overlaps