Bases de Datos Espaciales · Sesión 7

Relaciones espaciales

Preguntas de sí o no entre dos geometrías: ¿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.

Guía de la sesión 7 (3 horas)

Scripts de esta carpeta: relaciones-espaciales-postgis.sql y relaciones-espaciales-oracle.sql. La sesión 8 es la evaluación: al final de esta guía hay sugerencias para prepararla.

0:00 – 0:15
Diferencia entre operación (devuelve una geometría nueva, sesiones 5 y 6) y relación (devuelve verdadero o falso).
0:15 – 0:55
Laboratorio: recorrer los escenarios y ver qué relaciones se cumplen en cada motor.
0:55 – 1:20
Interior, borde y exterior: la matriz DE-9IM, de donde salen todas las relaciones.
1:20 – 1:35
Descanso.
1:35 – 2:10
Ejemplos B.1 a B.11 del script, viendo el resultado en En el municipio. Énfasis en los join espaciales.
2:10 – 2:50
Ejercicios 1 a 10.
2:50 – 3:00
Autoevaluación y repaso de temas para la evaluación.

Para la evaluación (sesión 8)

Lo que se espera que un estudiante pueda hacer, en PostGIS y en Oracle:

  • Crear una tabla espacial con su SRID, su índice y (en Oracle) sus metadatos.
  • Insertar puntos, líneas y polígonos y consultarlos en WKT.
  • Medir áreas, longitudes y distancias.
  • Usar unión, intersección, diferencia y buffer para responder una pregunta del territorio.
  • Escribir un join espacial con la relación correcta y explicar por qué no se usó otra.
  • Decir qué herramienta de ArcGIS hace lo mismo.
Regla de oro de Oracle: los operadores SDO_RELATE, SDO_INSIDE, SDO_TOUCH, SDO_ANYINTERACT, SDO_WITHIN_DISTANCE y SDO_NN van en el WHERE, se comparan con 'TRUE' y necesitan índice espacial en la columna del primer argumento. Para geometrías calculadas se usa la función SDO_GEOM.RELATE.

Laboratorio de relaciones

Arrastre A y B, o escoja un escenario. La tabla dice qué relaciones se cumplen (A respecto de B) y la matriz muestra por qué. Toque una fila de la tabla para ver su patrón en la matriz.

ABLa parte común se resalta en verde.
Oracle: SDO_GEOM.RELATE(a, 'DETERMINE', b, 0.005)

ArcGIS: Select By Location selecciona A cuando la relación es…
Matriz DE-9IM:

Pase el cursor por una celda.

F = no se tocan · 0 = se tocan en puntos · 1 = en líneas · 2 = en un área

Interior, borde y exterior

Toda relación espacial se decide comparando tres partes de cada geometría. El borde (en rojo) es lo que separa el interior (en verde) del exterior (todo lo demás).

La matriz de 9 intersecciones

Se cruzan las tres partes de A con las tres de B, y en cada casilla se anota la dimensión de lo que tienen en común: F si nada, 0 si puntos, 1 si líneas, 2 si un área. Se escribe en una sola cadena, fila por fila.

Por ejemplo, Centro y El Cedro dan FF2F11212: los interiores no se tocan (F), los bordes comparten una línea (1). Eso es exactamente touches.

Cada relación con nombre es un patrón sobre esa matriz. En el patrón, T significa "cualquier valor menos F" y * "no importa".

Patrones

RelaciónPatrón DE-9IM
DisjointFF*FF****
Intersectslo contrario de disjoint
TouchesFT******* · F**T***** · F***T****
WithinT*F**F***
ContainsT*****FF*
Contains properlyT**FF*FF*
Overlaps (áreas)T*T***T**
Crosses (línea y área)T*T******
Crosses (dos líneas)0********
EqualsT*F**FFF*

Equivalencias entre los tres entornos

Los nombres se parecen pero no siempre significan lo mismo. Las diferencias aparecen casi siempre cuando las geometrías comparten el borde.

PreguntaPostGISOracle (máscara de SDO_RELATE u operador)ArcGIS · Select By Location
¿Tienen algo en común?ST_IntersectsANYINTERACT · SDO_ANYINTERACTIntersect
¿No tienen nada en común?ST_Disjoint (mejor NOT EXISTS ... ST_Intersects)NOT EXISTS ... SDO_ANYINTERACTIntersect + Invert
¿Se tocan solo por el borde?ST_TouchesTOUCH · SDO_TOUCHBoundary touches · Share a line segment with
¿A está dentro de B?ST_Within (puede tocar el borde por dentro)INSIDE (sin tocar el borde) · COVEREDBY (tocándolo)Within Clementini · Completely within · Within
¿A contiene a B?ST_Contains · ST_ContainsProperly · ST_CoversCONTAINS (sin tocar el borde) · COVERS (tocándolo)Contains Clementini · Completely contains · Contains
¿Se traslapan en parte?ST_OverlapsOVERLAPBDYINTERSECTIntersect, quitando los que están dentro
¿Se cruzan?ST_CrossesOVERLAPBDYDISJOINT (líneas que se cruzan, línea que atraviesa un área)Crossed by the outline of
¿Una línea va sobre el borde de un área?ST_Relate(a, b, 'F*FF*F***')ON · SDO_ONShare a line segment with
¿Son la misma forma?ST_EqualsEQUAL · SDO_EQUALAre identical to
¿Están a menos de d?ST_DWithin(a, b, d)SDO_WITHIN_DISTANCE(a, b, 'distance=d')Within a distance
¿Cuál es el más cercano?ORDER BY a.geom <-> b.geom LIMIT 1SDO_NN(a, b, 'sdo_num_res=1')Near · Generate Near Table
¿Qué relación tienen?ST_Relate(a, b) (matriz)SDO_GEOM.RELATE(a, 'DETERMINE', b, tol) (nombre)No disponible
Join espacial

Unir dos tablas por posición en vez de por llave: JOIN barrios b ON ST_Within(c.geom, b.geom). En ArcGIS es la herramienta Spatial Join.

Funciones y operadores en Oracle

Los operadores (SDO_RELATE) usan el índice y van en el WHERE. Las funciones (SDO_GEOM.RELATE) sirven en cualquier parte y con geometrías calculadas, pero no usan el índice.

Orden de los argumentos

Within y contains son inversas: ST_Within(a, b) es lo mismo que ST_Contains(b, a). En Oracle, el primer argumento del operador debe ser la columna con índice.

Los ejemplos de clase sobre el municipio

Escoja un ejemplo: el mapa resalta los objetos que cumplen la relación y abajo está el código de cada motor.

Ejercicios

Los enunciados también están en la Parte C de cada script.

Autoevaluación