PostGIS - Relaciones espaciales#

Introducción#

Las funciones espaciales que se han estudiado hasta el momento, solo trabajan con una geometría a la vez. Las funciones que se estudian en este capítulo comparan geometrías a través de relaciones espaciales. Se dividen en relaciones toploógicas y relaciones de distancia.

Relaciones topológicas#

Las relaciones topológicas, también llamadas relaciones topológicas binarias, son expresiones lógicas (verdaderas o falsas) sobre las relaciones espaciales entre dos objetos. Por ejemplo, si a y b son dos objetos espaciales (ej. puntos, líneas, polígonos), se pueden considerar relaciones topológicas como las siguientes:

  • a interseca a b

  • a es adyacente a b

  • a está dentro de b

  • b está contenido en a

Las relaciones topológicas están estandarizadas en el modelo Dimensionally Extended 9-Intersection Model (DE-9IM).

La especificación SFSQL define varias funciones para relaciones espaciales, las cuales se explican en las secciones subsiguientes.

ST_Equals()#

../../_images/st_equals.png

Fig. 19 ST_Equals(). Fuente: Introduction to PostGIS.#

ST_Equals(geometry A, geometry B) retorna TRUE si geometry A y geometry B son espacialmente iguales.

-- Selección de una geometría
SELECT name, geom
FROM nyc_subway_stations
WHERE name = 'Broad St';
   name   |                      geom
----------+---------------------------------------------------
 Broad St | 0101000020266900000EEBD4CF27CF2141BC17D69516315141
-- Evaluación de la igualdad de las geometrías
SELECT name
FROM nyc_subway_stations
WHERE ST_Equals(
  geom,
  '0101000020266900000EEBD4CF27CF2141BC17D69516315141');
Broad St

ST_Intersects(), ST_Disjoint(), ST_Crosses(), ST_Overlaps() y ST_Touches()#

ST_Intersects()#

../../_images/st_intersects.png

Fig. 20 ST_Intersects(). Fuente: Introduction to PostGIS.#

ST_Intersects(geometry A, geometry B) retorna TRUE si geometry A y geometry B comparten espacio en sus bordes o en sus interiores.

ST_Disjoint()#

../../_images/st_disjoint.png

Fig. 21 ST_Disjoint(). Fuente: Introduction to PostGIS.#

ST_Disjoint(geometry A, geometry B) retorna TRUE si geometry A y geometry B no comparten espacio en sus bordes o en sus interiores. Es la función opuesta a ST_Intersects(). De hecho, es más eficiente usar la expresión NOT (ST_Intersects(geometry A, geometry B)) que ST_Disjoint(geometry A, geometry B) debido a que las intersecciones pueden comprobarse mediante índices, mientras que las disjunciones no.

ST_Crosses()#

../../_images/st_crosses.png

Fig. 22 ST_Crosses(). Fuente: Introduction to PostGIS.#

Para comparaciones de multipunto-polígono, multipunto-línea, línea-línea, línea-polígono y línea-multipolígono, ST_Crosses(geometry A, geometry B) retorna TRUE si la intersección resulta en una geometría cuyo número de dimensiones es menor que el número máximo de dimensiones de las dos geometrías originales y el conjunto de intersección está en el interior de ambas geometrías originales.

ST_Overlaps()#

../../_images/st_overlaps.png

Fig. 23 ST_Overlaps(). Fuente: Introduction to PostGIS.#

ST_Overlaps(geometry A, geometry B) compara dos geometrías de la misma cantidad de dimensiones y retorna TRUE si su intersección resulta en una geometría diferente de ambas pero de la misma cantidad de dimensiones.

ST_Touches()#

../../_images/st_touches.png

Fig. 24 ST_Touches(). Fuente: Introduction to PostGIS.#

ST_Touches(geometry A, geometry B) retorna TRUE si los límites de alguna de las geometrías se intersectan o si el interior de solo una de las geometrías intersecta el límite de la otra.

ST_Within() y ST_Contains()#

../../_images/st_within.png

Fig. 25 ST_Within() y ST_Contains(). Fuente: Introduction to PostGIS.#

Tanto ST_Within() como ST_Contains() comprueban si una geometría está completamente dentro de la otra.

ST_Within()#

ST_Within(geometry A, geometry B) retorna TRUE si geometry A está completamente dentro de geometry B.

ST_Contains()#

ST_Contains(geometry A, geometry B) retorna TRUE si geometry B está completamente contenida en geometry A.

Relaciones de distancia#

Un problema muy común en sistemas de información geográfica es “encuentrar todo lo que esté a una distancia X de estos objetos”. Las funciones ST_Distance() y ST_DWithin() pueden ayudar a resolver ese tipo de problemas.

ST_Distance() y ST_DWithin()#

ST_Distance()#

La función ST_Distance(geometry A, geometry B) calcula la distancia más corta entre dos geometrías y la devuelve como un número de tipo float.

-- Cálculo de la distancia entre dos objetos
SELECT ST_Distance(
ST_GeometryFromText('POINT(0 5)'),
ST_GeometryFromText('LINESTRING(-2 2, 2 2)'));
3

ST_DWithin()#

../../_images/st_dwithin.png

Fig. 26 ST_DWithin(). Fuente: Introduction to PostGIS.#

La función ST_DWithin() permite probar si dos objetos están a una cierta distancia el uno del otro. Esto es útil para preguntas como “¿cuántos árboles están dentro de un buffer de 500 metros de la carretera?”. Con ST_DWithin(), se puede comprobar la relación de distancia sin generar el buffer.

-- Calles a una distancia de 10 metros o menos de una estación del tren subterráneo
SELECT name
FROM nyc_streets
WHERE ST_DWithin(
   geom, 
   ST_GeomFromText('POINT(583571 4506714)', 26918), 
   10
);
     name
--------------
   Wall St
   Broad St
   Nassau St

Ejercicios#

Resuelva los siguientes problemas mediante joins espaciales.

  1. Encuentre todos los registros de presencia de félidos en un radio de 10 km del punto (-84.0, 10.0) (WGS84).

  2. Para el aeródromo Amubri, encuentre su:

    • Cantón

    • Distrito

    • Área de conservación

    • ASP

  3. Encuentre las vías en un radio de 1 km del aeródromo Amubri. Visualícelas en QGIS.

  4. Encuentre las vías que atraviesan la ruta 32. Visualícelas en QGIS.