[FR]ST_Intersects vs ST_Within : comprendre les relations spatiales dans PostGIS

Lorsque l’on travaille avec PostGIS, il est fréquent d’utiliser des fonctions spatiales pour analyser la relation entre des objets géographiques. Deux fonctions très utilisées sont ST_Intersects et ST_Within.

Ces fonctions permettent de tester la relation spatiale entre deux géométries, mais elles ne répondent pas exactement à la même question.

Dans cet article, nous allons voir la différence entre ST_Intersects et ST_Within et dans quels cas utiliser chacune de ces fonctions.



1. La fonction ST_Intersects

La fonction ST_Intersects permet de vérifier si deux géométries se touchent ou se chevauchent.

Autrement dit, elle renvoie TRUE si les deux objets partagent au moins un point en commun.

Exemple :

SELECT ST_Intersects(geom1, geom2);

La fonction retourne :

  • TRUE si les géométries se croisent ou se touchent
  • FALSE sinon.

Exemple

On dispose :

  • d’une couche de routes
  • d’une couche de communes

On peut chercher les routes qui traversent une commune.

SELECT r.*
FROM routes r
JOIN communes c
ON ST_Intersects(r.geom, c.geom)
WHERE c.nom = 'Paris';

Cette requête sélectionne toutes les routes qui intersectent la commune.


2. La fonction ST_Within

La fonction ST_Within permet de vérifier si une géométrie est entièrement contenue dans une autre.

Exemple :

SELECT ST_Within(geom1, geom2);

La fonction retourne :

  • TRUE si la première géométrie est totalement à l’intérieur de la seconde
  • FALSE sinon.

Exemple

On peut chercher les écoles situées dans une commune.

SELECT e.*
FROM ecoles e
JOIN communes c
ON ST_Within(e.geom, c.geom)
WHERE c.nom = 'Paris';

Cette requête sélectionne uniquement les écoles situées à l’intérieur de la commune.


3. Différence principale

La différence essentielle entre ces deux fonctions est la suivante :

FonctionSignification
ST_Intersectsles géométries se touchent ou se croisent
ST_Withinune géométrie est entièrement à l’intérieur d’une autre

4. Cas d’utilisation

Utiliser ST_Intersects

Pour détecter :

  • des routes traversant un polygone
  • des zones qui se chevauchent
  • des intersections géographiques.

Utiliser ST_Within

Pour vérifier si :

  • un point se trouve dans un polygone
  • un objet est entièrement contenu dans une zone.

5. Exemple visuel

On peut imaginer trois situations :

1. Un point dans un polygone
→ ST_Within = TRUE
→ ST_Intersects = TRUE

2. Une ligne traversant un polygone
→ ST_Within = FALSE
→ ST_Intersects = TRUE

3. Deux objets séparés
→ ST_Within = FALSE
→ ST_Intersects = FALSE

6. Performance et index spatiaux

Les fonctions ST_Intersects et ST_Within peuvent utiliser les index spatiaux.

Il est recommandé de créer un index sur les géométries :

CREATE INDEX idx_routes_geom
ON routes
USING GIST (geom);

Cela améliore fortement les performances.


Conclusion

Les fonctions ST_Intersects et ST_Within sont deux outils essentiels dans PostGIS pour analyser les relations spatiales entre géométries.

  • ST_Intersects teste si deux géométries se touchent ou se chevauchent.
  • ST_Within vérifie si une géométrie est entièrement contenue dans une autre.

Comprendre la différence entre ces deux fonctions permet d’écrire des requêtes spatiales plus précises et plus efficaces.


Les principales fonctions de relation spatiale dans PostGIS

PostGIS propose plusieurs fonctions permettant d’analyser la relation spatiale entre deux géométries.

Voici les plus courantes.

FonctionSignification
ST_Intersectsles géométries partagent au moins un point
ST_Withinune géométrie est entièrement à l’intérieur d’une autre
ST_Containsune géométrie contient entièrement une autre
ST_Touchesles géométries se touchent mais leurs intérieurs ne se chevauchent pas
ST_Overlapsles géométries se chevauchent partiellement
ST_Crossesles géométries se croisent

de « Analysis of Spatial Relations Based on Elements »:https://ikcest-drr.data.ac.cn/tutorial/k1034

ST_Contains vs ST_Within

Ces deux fonctions sont souvent confondues.

Elles sont en réalité inverses.

Exemple :

ST_Within(point, polygon)

est équivalent à :

ST_Contains(polygon, point)


Exemple concret

On dispose :

  • d’une couche communes
  • d’une couche écoles

Pour trouver les écoles situées dans une commune :

SELECT e.*
FROM ecoles e
JOIN communes c
ON ST_Within(e.geom, c.geom)
WHERE c.nom = 'Paris';

On pourrait aussi écrire :

SELECT e.*
FROM ecoles e
JOIN communes c
ON ST_Contains(c.geom, e.geom)
WHERE c.nom = 'Paris';


Petit conseil de performance

Pour de grosses tables, il est recommandé d’utiliser également un filtre de bounding box afin de faciliter l’utilisation de l’index spatial.

Exemple :

SELECT e.*
FROM ecoles e
JOIN communes c
ON e.geom && c.geom
AND ST_Within(e.geom, c.geom);

L’opérateur && compare les boîtes englobantes et réduit le nombre de géométries à analyser.


À retenir

  • ST_Intersects → relation spatiale la plus générale
  • ST_Within → un objet est entièrement dans un autre
  • ST_Contains → inverse de ST_Within
  • ST_Touches → contact sans chevauchement.

Ces fonctions sont essentielles pour écrire des requêtes spatiales efficaces dans PostGIS.


Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Are you human? Please solve:Captcha