[ES]ST_Intersects vs ST_Within: entender las relaciones espaciales en PostGIS

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ónSignificado
ST_IntersectsLas geometrías comparten al menos un punto
ST_WithinUna 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:

  1. Un punto dentro de un polígono
    → ST_Within = TRUE
    → ST_Intersects = TRUE
  2. Una línea que atraviesa un polígono
    → ST_Within = FALSE
    → ST_Intersects = TRUE
  3. 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ónSignificado
ST_IntersectsLas geometrías comparten al menos un punto
ST_WithinUna geometría está dentro de otra
ST_ContainsUna geometría contiene completamente a otra
ST_TouchesLas geometrías se tocan sin superponerse
ST_OverlapsLas geometrías se superponen parcialmente
ST_CrossesLas geometrías se cruzan
de «Analysis of Spatial Relations Based on Elements»:https://ikcest-drr.data.ac.cn/tutorial/k1034

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.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Are you human? Please solve:Captcha