Sesión 7 · Relaciones espaciales
1 / 25 Portal del curso

Bases de Datos Espaciales · Sesión 7

Relaciones espaciales

¿Se tocan? ¿Una está dentro de la otra? ¿Se cruzan? Cómo se pregunta en PostGIS, en Oracle Spatial y en ArcGIS, y por qué a veces no responden igual.

Universidad Militar Nueva Granada

Hoy, en 3 horas

Plan de la sesión 7

HoraTemaDónde
0:00 – 0:15Operación o relaciónSlides
0:15 – 0:40Interior, borde y exterior (DE-9IM)Slides + pestaña del HTML
0:40 – 1:20Las relaciones con nombreSlides + Laboratorio del HTML
1:20 – 1:35Descanso
1:35 – 2:10Joins espaciales y distanciaEjemplos B.1 a B.11
2:10 – 2:50Ejercicios 1 a 10Pestaña Ejercicios
2:50 – 3:00Preparación de la evaluaciónSlides + Autoevaluación

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

La idea de hoy

SESIONES 5 Y 6 · OPERACIÓN

A, B → geometría nueva

ST_Intersection(a, b)

SESIÓN 7 · RELACIÓN

A, B → verdadero o falso

ST_Intersects(a, b)

Una relación se usa en el WHERE o en el ON: sirve para filtrar y para unir tablas por su posición.

La base de todo

Interior, borde y exterior

Punto

Interior: el punto. No tiene borde.

Línea

Borde: los dos extremos.

Polígono

Borde: el contorno.

El exterior es todo lo demás (el fondo gris). Toda relación se decide comparando estas tres partes de A con las de B.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

La base de todo

La matriz de nueve intersecciones

Interior B

Borde B

Exterior B

Interior A

F

F

2

Borde A

F

1

1

Exterior A

2

1

2

Centro (A) y El Cedro (B): FF2F11212

F nada en común · 0 puntos · 1 líneas · 2 un área

Interiores sin nada en común y bordes que comparten una línea: eso es exactamente touches.

PostGIS: ST_Relate(a, b) · Oracle: SDO_GEOM.RELATE(a, 'DETERMINE', b, tol)

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Parte 2

Las relaciones con nombre

Intersects, touches, within, contains, overlaps, crosses. En cada una, A es azul y B dorado.

Relación 1 · la más general

Intersects y su contrario, disjoint

intersects

disjoint

¿Tienen al menos un punto en común? Tocarse por el borde cuenta.

PostGIS

ST_Intersects(a, b)

Oracle

SDO_ANYINTERACT(a, b) = 'TRUE'

ArcGIS

Select By Location · Intersect

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Relación 2

Touches: vecinos que comparten borde

Comparten borde, pero no interior.

PostGIS

ST_Touches(a, b)

Oracle

SDO_TOUCH(a, b) = 'TRUE'

ArcGIS

Boundary touches · Share a line segment with

En el municipio: los cinco barrios restantes son vecinos del Centro.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Relación 3

Within y contains: la misma relación, al revés

ST_Within(b, a) = B está dentro de A
ST_Contains(a, b) = A contiene a B

PostGIS

ST_Within · ST_Contains

Oracle

SDO_INSIDE · SDO_CONTAINS

ArcGIS

Within · Contains (y sus variantes)

En el municipio: ¿en qué barrio está cada colegio?

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

El caso difícil

¿Contiene si toca el borde? Depende del motor

Centro y Parque Principal

no toca el borde

Los Pinos y Parque El Bosque

comparte borde (en rojo)

FunciónPrincipalEl Bosque
ST_Containssísí
ST_Coverssísí
ST_ContainsProperlysíno
Oracle DETERMINECONTAINSCOVERS
ArcGIS Completely containssíno

En Oracle, CONTAINS e INSIDE excluyen el borde; para incluirlo están COVERS y COVEREDBY.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Relación 4

Overlaps: se traslapan en parte

Comparten parte del interior y ninguno contiene al otro.

PostGIS

ST_Overlaps(a, b)

Oracle

mask=OVERLAPBDYINTERSECT

ArcGIS

Intersect, quitando los Within y Contains

En el municipio: Altos del Río, El Cedro, Centro y La Estación con la zona de inundación.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Relación 5

Crosses: una línea que atraviesa

El interior de uno pasa por el interior y el exterior del otro.

PostGIS

ST_Crosses(a, b)

Oracle

mask=OVERLAPBDYDISJOINT

ArcGIS

Crossed by the outline of

Punto rojo: la Carrera 5 cruza el Río Frío (un puente). Punto dorado: la quebrada solo lo toca.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Resumen

Las relaciones en los tres entornos

PreguntaPostGISOracleArcGIS
¿Algo en común?ST_IntersectsANYINTERACTIntersect
¿Solo el borde?ST_TouchesTOUCHBoundary touches
¿A dentro de B?ST_WithinINSIDE · COVEREDBYWithin · Completely within
¿A contiene a B?ST_Contains · ST_CoversCONTAINS · COVERSContains · Completely contains
¿Traslape parcial?ST_OverlapsOVERLAPBDYINTERSECT(combinación)
¿Se cruzan?ST_CrossesOVERLAPBDYDISJOINTCrossed by the outline of
¿Misma forma?ST_EqualsEQUALAre identical to
¿A menos de d?ST_DWithinSDO_WITHIN_DISTANCEWithin a distance

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Laboratorio · 20 minutos

Abran relaciones-espaciales.html, pestaña Laboratorio

  • Recorran los 13 escenarios y miren qué relaciones se cumplen.
  • Comparen PostGIS, la máscara de Oracle y las opciones de ArcGIS.
  • En "B dentro tocando el borde": ¿quién dice que sí contiene y quién no?
  • Pasen el cursor por la matriz para ver qué parte se compara.

Parte 3 · antes de escribir SQL

Las reglas de Oracle para las relaciones

1. Van en el WHERE

SDO_RELATE, SDO_INSIDE, SDO_TOUCH… no se pueden usar en el SELECT.

2. Se comparan con 'TRUE'

SDO_TOUCH(a, b) = 'TRUE'

3. Necesitan índice

En la columna del primer argumento. Por eso el índice de la sesión 3 era obligatorio.

4. Sin índice, la función

Para geometrías calculadas: SDO_GEOM.RELATE(a, 'TOUCH', b, 0.005).

En PostGIS, ST_Intersects y compañía son funciones normales: van donde sea y devuelven verdadero o falso.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Ejemplo B.1

El join espacial: unir tablas por su posición

PostgreSQL + PostGIS

SELECT c.nombre AS colegio,
  b.nombre AS barrio
FROM colegios c
JOIN barrios b
  ON ST_Within(c.geom, b.geom);

Oracle Spatial

SELECT c.nombre AS colegio,
  b.nombre AS barrio
FROM colegios c, barrios b
WHERE SDO_INSIDE(c.geom, b.geom)
  = 'TRUE';

ArcGIS: Spatial Join, con Match option = Completely within.

Es el JOIN de la sesión 1, con una relación espacial en lugar de una llave foránea.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Ejemplos B.1 y B.2

El caso del Jardín Rayitos

El jardín está justo en el límite entre Centro y El Cedro.

RelaciónResultado
ST_Withinningún barrio
ST_Intersectslos dos barrios
ST_Toucheslos dos barrios
Oracle DETERMINETOUCH con ambos

Con within se pierde; con intersects se cuenta dos veces. Hay que decidir una regla.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Ejemplo B.3

Contar lo que hay dentro de cada polígono

PostgreSQL + PostGIS

SELECT b.nombre,
  COUNT(c.id) AS colegios,
  COALESCE(SUM(c.matricula), 0)
FROM barrios b
LEFT JOIN colegios c
  ON ST_Within(c.geom, b.geom)
GROUP BY b.nombre;

Oracle Spatial

SELECT b.nombre,
  (SELECT COUNT(*) FROM colegios c
   WHERE SDO_INSIDE(c.geom, b.geom)
     = 'TRUE') AS colegios
FROM barrios b;

ArcGIS: Spatial Join de barrios con colegios (Join_Count) o Summarize Within.

Centro: 1 colegio, 820 estudiantes. Altos del Río: 2 colegios.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Ejemplo B.9

¿Qué está a menos de 500 metros?

PostgreSQL + PostGIS

SELECT c.nombre, h.nombre
FROM colegios c
JOIN centros_salud h
  ON ST_DWithin(c.geom, h.geom, 500);

Oracle Spatial

SELECT c.nombre, h.nombre
FROM colegios c, centros_salud h
WHERE SDO_WITHIN_DISTANCE(c.geom, h.geom,
  'distance=500 unit=M') = 'TRUE';

Resultado

IE Técnico Central · 269 m

Jardín Rayitos · 320 m

Colegio Altos · 412 m

Gimnasio Los Pinos · 427 m

ArcGIS: Select By Location con Within a distance de 500 m.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Ejemplo B.10

El centro de salud más cercano a cada colegio

PostgreSQL + PostGIS

SELECT c.nombre, h.nombre
FROM colegios c
CROSS JOIN LATERAL (
  SELECT nombre, geom
  FROM centros_salud
  ORDER BY geom <-> c.geom
  LIMIT 1) h;

Oracle Spatial

SELECT /*+ ORDERED */
  c.nombre, h.nombre,
  SDO_NN_DISTANCE(1) AS metros
FROM colegios c, centros_salud h
WHERE SDO_NN(h.geom, c.geom,
  'sdo_num_res=1', 1) = 'TRUE';

ArcGIS: herramienta Near, o Generate Near Table para varios vecinos.

El peor ubicado: Colegio Santa Lucía, a 1.312 m del hospital.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Ejemplo B.8

Lo que no toca nada: mejor con NOT EXISTS

Recomendado

SELECT c.nombre FROM colegios c
WHERE NOT EXISTS (
  SELECT 1 FROM zonas_riesgo z
  WHERE ST_Intersects(c.geom, z.geom));

Funciona, pero lento

... WHERE ST_Disjoint(c.geom, z.geom)

El índice sirve para encontrar lo que está cerca, no lo que está lejos.

Disjoint obliga a comparar todo contra todo.

ArcGIS: Intersect y luego Switch Selection.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Para verificar

Pestaña En el municipio del HTML

  • Los botones B.1 a B.11 resaltan en el mapa lo que cumple cada relación.
  • Verde cumple, rojo no cumple; abajo está el código en los tres entornos.
  • Comparen con lo que devolvieron sus consultas en PostGIS y Oracle.

Ejercicios · 40 minutos

Diez ejercicios en la pestaña Ejercicios

1 ¿Dónde queda cada centro de salud?

2 Estudiantes por barrio con intersects

3 Vecinos de Altos del Río

4 Vías que cruzan o tocan el Centro

5 Colegios en zona de inundación

6 Colegios lejos de un centro de salud

7 El centro de salud más cercano

8 Parque El Bosque y Los Pinos

9 La Avenida Principal y los barrios

10 Puentes y desembocaduras

Sesión 8

Para la evaluación, en PostGIS y en Oracle

SESIÓN 3

Crear una tabla espacial con SRID, índice y metadatos.

SESIÓN 3

Insertar puntos, líneas y polígonos, y verlos en WKT.

SESIÓN 4

Medir áreas, longitudes y distancias.

SESIONES 5 Y 6

Responder una pregunta del territorio con unión, intersección, diferencia o buffer.

SESIÓN 7

Escribir un join espacial y explicar por qué esa relación y no otra.

EN TODAS

Decir qué herramienta de ArcGIS hace lo mismo.

Las autoevaluaciones y las tablas de resumen de cada HTML son la mejor forma de repasar.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Para llevarse

Tres ideas de la sesión 7

Sí o no

Una relación filtra y une tablas; una operación crea geometrías.

El borde decide

Dentro, contiene y toca dependen de qué se haga con el borde, y cada motor lo trata a su manera.

El índice manda

Intersects, DWithin y vecino más cercano son rápidos; disjoint no.

Próxima sesión: evaluación. Traigan las conexiones a PostGIS y Oracle probadas.

Bases de Datos Espaciales · UMNG · Sesión 7

Universidad Militar Nueva Granada

Flechas del teclado o deslizar el dedo para avanzar.