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.
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.
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.
SDO_GEOM.RELATE(a, 'DETERMINE', b, 0.005)
ArcGIS: Select By Location selecciona A cuando la relación es…
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ón | Patrón DE-9IM |
|---|---|
| Disjoint | FF*FF**** |
| Intersects | lo contrario de disjoint |
| Touches | FT******* · F**T***** · F***T**** |
| Within | T*F**F*** |
| Contains | T*****FF* |
| Contains properly | T**FF*FF* |
| Overlaps (áreas) | T*T***T** |
| Crosses (línea y área) | T*T****** |
| Crosses (dos líneas) | 0******** |
| Equals | T*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.
| Pregunta | PostGIS | Oracle (máscara de SDO_RELATE u operador) | ArcGIS · Select By Location |
|---|---|---|---|
| ¿Tienen algo en común? | ST_Intersects | ANYINTERACT · SDO_ANYINTERACT | Intersect |
| ¿No tienen nada en común? | ST_Disjoint (mejor NOT EXISTS ... ST_Intersects) | NOT EXISTS ... SDO_ANYINTERACT | Intersect + Invert |
| ¿Se tocan solo por el borde? | ST_Touches | TOUCH · SDO_TOUCH | Boundary 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_Covers | CONTAINS (sin tocar el borde) · COVERS (tocándolo) | Contains Clementini · Completely contains · Contains |
| ¿Se traslapan en parte? | ST_Overlaps | OVERLAPBDYINTERSECT | Intersect, quitando los que están dentro |
| ¿Se cruzan? | ST_Crosses | OVERLAPBDYDISJOINT (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_ON | Share a line segment with |
| ¿Son la misma forma? | ST_Equals | EQUAL · SDO_EQUAL | Are 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 1 | SDO_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 |
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.
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.
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.