[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.


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é !

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