Bases de Datos Espaciales · Sesiones 5 y 6
Análisis espacial
Unión, intersección, diferencia, diferencia simétrica y buffer: qué hacen, cómo se escriben en PostGIS y Oracle, y qué herramienta equivale en ArcGIS.
Sesión 5 · 3 horas
Plan de la sesión 5: las operaciones
| Hora | Tema | Dónde |
|---|---|---|
| 0:00 – 0:15 | Repaso y carga de la Parte A | Scripts de análisis |
| 0:15 – 1:00 | Las cuatro operaciones | Slides + Laboratorio del HTML |
| 1:00 – 1:15 | Descanso | |
| 1:15 – 2:00 | Sintaxis en los tres entornos y la trampa de Union | Slides + pestaña Las cinco operaciones |
| 2:00 – 2:50 | Ejemplos B.1 a B.6 en el municipio | Scripts + pestaña En el municipio |
| 2:50 – 3:00 | Ejercicios 1 y 2 | Pestaña Ejercicios |
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
La idea de hoy
geometría A
geometría B
geometría nueva
Por eso se pueden encadenar, medir y guardar como una capa nueva.
Parte 1
Las cuatro operaciones de superposición
En cada una, A es el cuadrado azul y B el círculo dorado. El resultado aparece relleno.
Operación 1 de 4
Unión · A ∪ B
Todo lo que está en A o en B. El borde común desaparece.
PostGIS
ST_Union(a, b)
Oracle
SDO_GEOM.SDO_UNION(a, b, 0.005)
ArcGIS
Edit → Merge, o Dissolve
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Operación 2 de 4
Intersección · A ∩ B
Solo lo que está en A y en B a la vez.
PostGIS
ST_Intersection(a, b)
Oracle
SDO_GEOM.SDO_INTERSECTION(a, b, 0.005)
ArcGIS
Pairwise Intersect o Pairwise Clip
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Operación 3 de 4
Diferencia · A − B no es igual a B − A
A − B
ST_Difference(a, b)
SDO_GEOM.SDO_DIFFERENCE(a, b, 0.005)
B − A
ST_Difference(b, a)
SDO_GEOM.SDO_DIFFERENCE(b, a, 0.005)
ArcGIS: Pairwise Erase, con la capa de entrada y la de borrado en el orden correcto.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Operación 4 de 4
Diferencia simétrica · A △ B
Lo que está en uno solo de los dos. Es la unión menos la intersección.
PostGIS
ST_SymDifference(a, b)
Oracle
SDO_GEOM.SDO_XOR(a, b, 0.005)
ArcGIS
Symmetrical Difference
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Para comprobar
Las áreas siempre cuadran
área(A ∪ B) = área(A) + área(B) − área(A ∩ B)
área(A △ B) = área(A ∪ B) − área(A ∩ B)
Parque Lineal ∪ zona de inundación
1.792.815 m²
Intersección
682.185 m²
Diferencia simétrica
1.110.630 m²
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Resumen
Las operaciones en los tres entornos
| Operación | PostGIS | Oracle Spatial | ArcGIS Pro |
|---|---|---|---|
| Unión de dos | ST_Union(a, b) | SDO_GEOM.SDO_UNION | Merge · Dissolve |
| Unión de la tabla | ST_Union(geom) + GROUP BY | SDO_AGGR_UNION(SDOAGGRTYPE(geom, tol)) | Dissolve |
| Intersección | ST_Intersection | SDO_GEOM.SDO_INTERSECTION | Pairwise Intersect · Clip |
| Diferencia | ST_Difference | SDO_GEOM.SDO_DIFFERENCE | Pairwise Erase |
| Dif. simétrica | ST_SymDifference | SDO_GEOM.SDO_XOR | Symmetrical Difference |
| Buffer | ST_Buffer(g, d) | SDO_GEOM.SDO_BUFFER(g, d, tol) | Pairwise Buffer |
En Oracle todas piden la tolerancia; en PostGIS ninguna.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Laboratorio · 20 minutos
Abran analisis-espacial.html, pestaña Laboratorio
- Arrastren A y B y prueben las cuatro operaciones.
- Separen las figuras: ¿qué devuelve la intersección?
- Pongan B dentro de A: ¿qué pasa con A − B? ¿Y con B − A?
- Cambien B por una línea: ¿qué devuelve la intersección ahora?
Cuidado con los nombres
La herramienta "Union" de ArcGIS no funde
SQL: ST_Union
1 objeto
ArcGIS: herramienta Union
3 objetos con atributos de A y de B
La herramienta Union superpone: corta en solo A, solo B y A con B.
Para fundir, en ArcGIS se usa Dissolve o Merge.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
En el municipio · ejemplo B.2
Unir toda la tabla: el límite municipal
PostgreSQL + PostGIS
SELECT
ST_Union(geom) AS limite,
ST_Area(ST_Union(geom)) / 1000000
AS km2
FROM barrios;
Oracle Spatial
SELECT
SDO_AGGR_UNION(
SDOAGGRTYPE(b.geom, 0.005)) AS limite
FROM barrios b;
ArcGIS: Dissolve sobre barrios, sin campo de disolución.
6,6 km²
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
En el municipio · ejemplo B.3
Disolver por estrato: unión con GROUP BY
PostGIS
SELECT estrato,
COUNT(*) AS barrios,
SUM(poblacion) AS poblacion,
ST_GeometryType(ST_Union(geom)) AS tipo
FROM barrios
GROUP BY estrato;
| Estrato | Barrios | Población | Tipo |
|---|---|---|---|
| 2 | 3 | 15.800 | MultiPolygon |
| 3 | 1 | 4.200 | Polygon |
| 4 | 1 | 3.300 | Polygon |
| 5 | 1 | 2.700 | Polygon |
En el estrato 2, La Estación y Santa Lucía se funden, pero El Cedro queda aparte: el resultado tiene dos partes.
ArcGIS: Dissolve con campo estrato y estadística poblacion SUM.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
En el municipio · ejemplo B.4
¿Qué parte de cada barrio se inunda?
PostgreSQL + PostGIS
SELECT b.nombre,
ST_Area(ST_Intersection(b.geom, z.geom))
FROM barrios b
JOIN zonas_riesgo z
ON ST_Intersects(b.geom, z.geom)
WHERE z.tipo = 'inundación';
Oracle Spatial
SELECT b.nombre, SDO_GEOM.SDO_AREA(
SDO_GEOM.SDO_INTERSECTION(
b.geom, z.geom, 0.005), 0.005)
FROM barrios b, zonas_riesgo z
WHERE z.tipo = 'inundación'
AND SDO_ANYINTERACT(b.geom, z.geom) = 'TRUE';
Resultado
Altos del Río · 49,7 %
El Cedro · 36,3 %
Centro · 19,1 %
La Estación · 4,4 %
ArcGIS: Pairwise Intersect de barrios con zonas_riesgo; cada pedazo trae los atributos de los dos.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
En el municipio · ejemplo B.5
¿Cuánto de cada barrio queda a salvo?
PostGIS
SELECT b.nombre,
ST_Area(b.geom) AS total,
ST_Area(ST_Difference(b.geom, z.geom))
AS segura
FROM barrios b, zonas_riesgo z
WHERE z.nombre = 'Inundación Río Frío';
Oracle
SDO_GEOM.SDO_DIFFERENCE(b.geom, z.geom, 0.005)
| Barrio | Área segura (m²) |
|---|---|
| Altos del Río | 1.206.424 |
| Centro | 388.235 |
| El Cedro | 458.824 |
| La Estación | 573.739 |
| Los Pinos | 1.200.000 |
| Santa Lucía | 1.200.000 |
ArcGIS: Pairwise Erase con barrios como entrada y la zona de inundación como capa de borrado.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Buena práctica
Primero filtrar, después calcular
PASO 1 · rápido, usa el índice
¿Se tocan?
ST_Intersects
SDO_ANYINTERACT
PASO 2 · costoso, forma exacta
¿Qué parte comparten?
ST_Intersection
SDO_GEOM.SDO_INTERSECTION
Con miles de predios, calcular la intersección de todos contra todos tarda horas. Filtrando primero, solo se calcula lo que de verdad se cruza.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Ejercicios de la sesión 5
Para cerrar la sesión
1
El límite municipal: unir todos los barrios y calcular el área en km² y el perímetro en km.
2
Unir dos barrios: Santa Lucía y Los Pinos. ¿El área de la unión es la suma de las dos? ¿Qué pasaría si se traslaparan?
Para quien termine antes: ejercicios 3 a 7 (estratos, parques por barrio, porcentaje en riesgo, Los Pinos sin la zona de remoción, parque lineal).
Sesión 6 · 3 horas
Buffer y análisis encadenados
| Hora | Tema | Dónde |
|---|---|---|
| 0:00 – 0:40 | Buffer: distancia, segmentos, extremos | Slides + Laboratorio |
| 0:40 – 1:00 | Guardar resultados como tabla | Ejemplos B.7 a B.9 |
| 1:00 – 1:15 | Descanso | |
| 1:15 – 2:45 | Ejercicios 3 a 10, en parejas | Pestaña Ejercicios |
| 2:45 – 3:00 | Autoevaluación | Pestaña Autoevaluación |
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Buffer
La zona de influencia: todo lo que está a d metros o menos
Punto → círculo
área de influencia de un colegio
Línea → franja
ronda hídrica de un río
Polígono → más grande
franja alrededor de un parque
ST_Buffer(geom, 30) · SDO_GEOM.SDO_BUFFER(geom, 30, 0.005) · Pairwise Buffer
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Buffer
Los detalles que cambian el resultado
Segmentos por cuarto
PostGIS aproxima la curva: 'quad_segs=8' por defecto. Oracle usa arcos verdaderos.
Extremos de línea
'endcap=round|flat|square' en PostGIS. Oracle siempre redondea.
Distancia negativa
Encoge el polígono. Sobre puntos y líneas da vacío.
Por eso un buffer de 400 m da áreas un poco distintas en PostGIS y en Oracle: menos del 1 %.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
En el municipio · ejemplo B.7
La ronda hídrica de 30 metros
PostgreSQL + PostGIS
SELECT nombre,
ST_Area(ST_Buffer(geom, 30))
FROM rios;
-- las dos rondas unidas
SELECT ST_Area(ST_Union(
ST_Buffer(geom, 30)))
FROM rios;
Oracle Spatial
SELECT r.nombre,
SDO_GEOM.SDO_AREA(
SDO_GEOM.SDO_BUFFER(
r.geom, 30, 0.005), 0.005)
FROM rios r;
PostGIS
Río Frío · 214.886 m²
Quebrada La Honda · 46.490 m²
Unidas · 258.008 m²
ArcGIS: Pairwise Buffer de 30 m; con Dissolve all las dos rondas quedan en una sola.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
En el municipio · ejemplo B.8
Sumar áreas no es lo mismo que unirlas
Buffers de 400 m alrededor de los colegios oficiales:
Suma de áreas
2.497.156 m²
Área de la unión
2.469.020 m²
La diferencia es lo que se traslapa: en la suma se cuenta dos veces, en la unión una sola.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Ejemplo B.9
Guardar el resultado como una capa nueva
PostgreSQL + PostGIS
CREATE TABLE ronda_hidrica AS
SELECT id, nombre,
ST_Buffer(geom, 30)
::geometry(Polygon, 9377) AS geom
FROM rios;
CREATE INDEX ronda_hidrica_gix
ON ronda_hidrica USING GIST (geom);
Oracle Spatial
CREATE TABLE ronda_hidrica AS
SELECT r.id, r.nombre,
SDO_GEOM.SDO_ARC_DENSIFY(
SDO_GEOM.SDO_BUFFER(r.geom, 30, 0.005),
0.005, 'arc_tolerance=0.05') AS geom
FROM rios r;
-- + metadatos + índice R-tree
ArcGIS: todas las herramientas de geoprocesamiento escriben su resultado como una feature class nueva (Output Feature Class).
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Encadenar operaciones · ejercicio 10
¿Dónde se puede construir?
UNIÓN
Municipio = todos los barrios
−
UNIÓN
Zonas de riesgo
−
BUFFER + UNIÓN
Ronda hídrica de 30 m
=
DIFERENCIA
Zona apta
482,4 ha
aptas para construir
73,1 %
del municipio
Así se construye un mapa de aptitud: cada restricción se resta del área disponible.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Para verificar
Pestaña En el municipio del HTML
- Cada botón B.1 a B.9 dibuja el resultado del ejemplo sobre el mapa.
- Abajo aparece el mismo código de los scripts, en los tres entornos.
- Comparen el número del mapa con el que les dio su consulta.
Ejercicios de la sesión 6 · en parejas
Uno en PostGIS, otro en Oracle, y comparan
3 Población por estrato
4 Parques en cada barrio
5 Porcentaje de cada barrio en riesgo
6 Los Pinos sin la zona de remoción
7 Parque lineal contra zona de inundación
8 Cobertura de los colegios oficiales
9 Barrios en la ronda hídrica
10 Zona apta para construir
Para llevarse
Tres ideas de las sesiones 5 y 6
Geometría nueva
Cada operación devuelve una forma que se puede medir, encadenar o guardar.
Ojo con los nombres
ST_Union funde; la herramienta Union de ArcGIS superpone. Oracle llama XOR a la diferencia simétrica.
Unir antes de medir
Si los resultados se traslapan, la suma de áreas sobreestima.
Próxima sesión: relaciones espaciales, las preguntas de sí o no entre geometrías.
Bases de Datos Espaciales · UMNG · Sesiones 5 y 6
Flechas del teclado o deslizar el dedo para avanzar.