Cuando trabajamos con PostGIS, entender las relaciones espaciales entre geometrías es clave para construir consultas eficientes. Dos de las funciones más utilizadas —ST_Intersects y ST_Within— suelen confundirse, aunque responden a necesidades distintas.
En esta guía aprenderás la diferencia entre ST_Intersects y ST_Within, cuándo usar cada una y cómo optimizar tus consultas espaciales con ejemplos claros.
1. ST_Intersects
La función ST_Intersects permite comprobar si dos geometrías se tocan o se superponen.
Es decir, devuelve TRUE si ambas comparten al menos un punto.
SELECT ST_Intersects(geom1, geom2);
Devuelve:
- TRUE → si las geometrías se cruzan o se tocan
- FALSE → en caso contrario
Ejemplo
Supongamos que tenemos:
- una capa de carreteras
- una capa de municipios
Para encontrar las carreteras que atraviesan un municipio:
SELECT r.*
FROM roads r
JOIN municipalities c
ON ST_Intersects(r.geom, c.geom)
WHERE c.name = 'Paris';
Esta consulta devuelve todas las carreteras que intersectan el municipio.
2. ST_Within
La función ST_Within permite verificar si una geometría está completamente contenida dentro de otra.
SELECT ST_Within(geom1, geom2);
Devuelve:
- TRUE → si la primera geometría está totalmente dentro de la segunda
- FALSE → en caso contrario
Ejemplo
Para encontrar las escuelas ubicadas dentro de un municipio:
SELECT s.*
FROM schools s
JOIN municipalities c
ON ST_Within(s.geom, c.geom)
WHERE c.name = 'Paris';
Esta consulta devuelve únicamente las escuelas situadas dentro del municipio.
3. Diferencia principal
La diferencia clave es la siguiente:
| Función | Significado |
|---|---|
| ST_Intersects | Las geometrías comparten al menos un punto |
| ST_Within | Una geometría está completamente dentro de otra |
4. Cuándo usar cada función
Usar ST_Intersects para:
- carreteras que cruzan un área
- zonas que se superponen
- detectar cualquier tipo de contacto espacial
Usar ST_Within para:
- comprobar si un punto está dentro de un polígono
- verificar que un objeto está completamente contenido en una zona
5. Ejemplos conceptuales
Imaginemos tres situaciones:
- Un punto dentro de un polígono
→ ST_Within = TRUE
→ ST_Intersects = TRUE - Una línea que atraviesa un polígono
→ ST_Within = FALSE
→ ST_Intersects = TRUE - Dos objetos separados
→ ST_Within = FALSE
→ ST_Intersects = FALSE
6. Rendimiento e índices espaciales
Tanto ST_Intersects como ST_Within pueden aprovechar índices espaciales.
Se recomienda crear un índice GiST:
CREATE INDEX idx_roads_geom
ON roads
USING GIST (geom);
Esto mejora significativamente el rendimiento de las consultas.
Conclusión
Las funciones ST_Intersects y ST_Within son herramientas fundamentales en PostGIS para analizar relaciones espaciales.
- ST_Intersects → verifica si las geometrías se tocan o se superponen
- ST_Within → comprueba si una geometría está completamente dentro de otra
Comprender esta diferencia permite escribir consultas espaciales más precisas y eficientes.
Funciones comunes de relaciones espaciales en PostGIS
PostGIS ofrece varias funciones para analizar relaciones entre geometrías:
| Función | Significado |
|---|---|
| ST_Intersects | Las geometrías comparten al menos un punto |
| ST_Within | Una geometría está dentro de otra |
| ST_Contains | Una geometría contiene completamente a otra |
| ST_Touches | Las geometrías se tocan sin superponerse |
| ST_Overlaps | Las geometrías se superponen parcialmente |
| ST_Crosses | Las geometrías se cruzan |

ST_Contains vs ST_Within
Estas dos funciones suelen confundirse, pero en realidad son inversas.
ST_Within(point, polygon)
equivale a:
ST_Contains(polygon, point)
Ejemplo
Para encontrar escuelas dentro de un municipio:
SELECT s.*
FROM schools s
JOIN municipalities c
ON ST_Within(s.geom, c.geom)
WHERE c.name = 'Paris';
También se puede escribir así:
SELECT s.*
FROM schools s
JOIN municipalities c
ON ST_Contains(c.geom, s.geom)
WHERE c.name = 'Paris';
Consejo de rendimiento
Para grandes volúmenes de datos, es recomendable combinar funciones espaciales con un filtro de bounding box:
SELECT s.*
FROM schools s
JOIN municipalities c
ON s.geom && c.geom
AND ST_Within(s.geom, c.geom);
El operador && compara las cajas envolventes y reduce el número de geometrías a evaluar.
Puntos clave
- ST_Intersects → relación espacial más general
- ST_Within → contención total
- ST_Contains → inversa de ST_Within
- ST_Touches → contacto sin superposición
Estas funciones son esenciales para construir consultas espaciales eficientes en PostGIS.