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.
Hoy, en 3 horas
Plan de la sesión 7
| Hora | Tema | Dónde |
|---|---|---|
| 0:00 – 0:15 | Operación o relación | Slides |
| 0:15 – 0:40 | Interior, borde y exterior (DE-9IM) | Slides + pestaña del HTML |
| 0:40 – 1:20 | Las relaciones con nombre | Slides + Laboratorio del HTML |
| 1:20 – 1:35 | Descanso | |
| 1:35 – 2:10 | Joins espaciales y distancia | Ejemplos B.1 a B.11 |
| 2:10 – 2:50 | Ejercicios 1 a 10 | Pestaña Ejercicios |
| 2:50 – 3:00 | Preparación de la evaluación | Slides + Autoevaluación |
Bases de Datos Espaciales · UMNG · Sesión 7
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
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
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
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
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
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ón | Principal | El Bosque |
|---|---|---|
| ST_Contains | sí | sí |
| ST_Covers | sí | sí |
| ST_ContainsProperly | sí | no |
| Oracle DETERMINE | CONTAINS | COVERS |
| ArcGIS Completely contains | sí | no |
En Oracle, CONTAINS e INSIDE excluyen el borde; para incluirlo están COVERS y COVEREDBY.
Bases de Datos Espaciales · UMNG · Sesión 7
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
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
Resumen
Las relaciones en los tres entornos
| Pregunta | PostGIS | Oracle | ArcGIS |
|---|---|---|---|
| ¿Algo en común? | ST_Intersects | ANYINTERACT | Intersect |
| ¿Solo el borde? | ST_Touches | TOUCH | Boundary touches |
| ¿A dentro de B? | ST_Within | INSIDE · COVEREDBY | Within · Completely within |
| ¿A contiene a B? | ST_Contains · ST_Covers | CONTAINS · COVERS | Contains · Completely contains |
| ¿Traslape parcial? | ST_Overlaps | OVERLAPBDYINTERSECT | (combinación) |
| ¿Se cruzan? | ST_Crosses | OVERLAPBDYDISJOINT | Crossed by the outline of |
| ¿Misma forma? | ST_Equals | EQUAL | Are identical to |
| ¿A menos de d? | ST_DWithin | SDO_WITHIN_DISTANCE | Within a distance |
Bases de Datos Espaciales · UMNG · Sesión 7
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
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
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ón | Resultado |
|---|---|
| ST_Within | ningún barrio |
| ST_Intersects | los dos barrios |
| ST_Touches | los dos barrios |
| Oracle DETERMINE | TOUCH 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
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
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
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
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
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
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
Flechas del teclado o deslizar el dedo para avanzar.