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 :
| Fonction | Signification |
|---|---|
| ST_Intersects | les géométries se touchent ou se croisent |
| ST_Within | une 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.
| Fonction | Signification |
|---|---|
ST_Intersects | les géométries partagent au moins un point |
ST_Within | une géométrie est entièrement à l’intérieur d’une autre |
ST_Contains | une géométrie contient entièrement une autre |
ST_Touches | les géométries se touchent mais leurs intérieurs ne se chevauchent pas |
ST_Overlaps | les géométries se chevauchent partiellement |
ST_Crosses | les géométries se croisent |

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éraleST_Within→ un objet est entièrement dans un autreST_Contains→ inverse de ST_WithinST_Touches→ contact sans chevauchement.
Ces fonctions sont essentielles pour écrire des requêtes spatiales efficaces dans PostGIS.