Bases de Datos Espaciales · Sesiones 3 y 4
Creación y manipulación de datos espaciales
Cómo se representan, se crean, se consultan y se modifican las geometrías en PostGIS, en Oracle Spatial y en una geodatabase de ArcGIS.
Sesión 3 · 3 horas
Plan de la sesión 3: crear e insertar
| Hora | Tema | Dónde |
|---|---|---|
| 0:00 – 0:30 | Geometrías, SRID y tolerancia | Slides + pestaña Geometrías |
| 0:30 – 1:10 | Laboratorio y anatomía de SDO_GEOMETRY | Pestañas Laboratorio y Crear |
| 1:10 – 1:25 | Descanso | |
| 1:25 – 2:15 | Cargar el municipio en los dos motores | Parte A de los dos scripts |
| 2:15 – 2:30 | Crear e insertar en los tres entornos | Ejemplos B.1 y B.2 |
| 2:30 – 3:00 | Ejercicios 1 a 3 | Pestaña Ejercicios |
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
De la sesión 1 a hoy
Una tabla espacial es una tabla con una columna más
| id | nombre | sector | matricula | geom |
|---|---|---|---|---|
| 1 | IE Técnico Central | oficial | 820 | POINT (4884350 2096150) |
| 2 | Colegio Santa Lucía | oficial | 640 | POINT (4883600 2095400) |
| 3 | Gimnasio Los Pinos | privado | 310 | POINT (4885300 2095350) |
Todo lo de la sesión 1 sigue igual: llaves, tipos, SELECT, WHERE, JOIN.
La columna geom guarda la forma y la ubicación de cada colegio.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Parte 1
Qué es una geometría
Tipos, coordenadas, sistemas de referencia y la forma de escribirlas como texto.
Geometrías
Los tipos de geometría
Punto
un colegio, un árbol
Línea
una vía, un río
Polígono
un barrio, un predio
Con hueco
una manzana con patio
Multipunto
las sedes de un colegio
Multilínea
una vía partida
Multipolígono
un municipio con islas
Los tres motores siguen el modelo Simple Features de la OGC, con nombres distintos.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Geometrías
El mismo tipo con tres nombres
| Tipo | WKT y PostGIS | Oracle (gtype) | ArcGIS |
|---|---|---|---|
| Punto | POINT | 2001 | Point |
| Línea | LINESTRING | 2002 | Polyline |
| Polígono | POLYGON | 2003 | Polygon |
| Multipunto | MULTIPOINT | 2005 | Multipoint |
| Multilínea | MULTILINESTRING | 2006 | Polyline de varias partes |
| Multipolígono | MULTIPOLYGON | 2007 | Polygon de varias partes |
| Colección | GEOMETRYCOLLECTION | 2004 | No existe |
En Oracle, el primer dígito es la dimensión (2D) y los dos últimos el tipo.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Sistema de referencia
Una coordenada sin SRID no significa nada
El Hospital San Rafael del municipio, en cuatro sistemas:
| SRID | X | Y | Unidad |
|---|---|---|---|
| 9377 · Origen Nacional | 4884600 | 2096250 | metros |
| 3116 · MAGNA Bogotá | 1004031.35 | 1030309.92 | metros |
| 4326 · WGS84 | -74.041163 | 4.870294 | grados |
| 3857 · Web Mercator | -8242224.60 | 542812.76 | metros de mapa web |
Es el mismo punto. El SRID dice cómo leer los números, y la base lo guarda junto a cada geometría.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Sistema de referencia
Geográfico o proyectado
Geográfico
Grados sobre el elipsoide. Ejemplo: 4326. Sirve para ubicar, no para medir áreas en m².
Proyectado
Aplana la Tierra y usa metros. Ejemplo: 9377. Áreas en m² y distancias en metros.
Comparar geometrías de SRID distintos es un error. PostGIS lo rechaza; ArcGIS reproyecta al dibujar, pero no al guardar.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Precisión
Tolerancia: ¿cuándo dos puntos son el mismo?
Es la distancia por debajo de la cual dos coordenadas se consideran iguales. En el curso: 0.005 m, medio centímetro.
PostGIS
Trabaja con precisión exacta. No pide tolerancia.
Oracle
La pide en cada función y en los metadatos: SDO_AREA(geom, 0.005).
ArcGIS
Se define en la geodatabase (tolerancia y resolución XY).
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Formatos de texto
Escribir una geometría como texto
WKT · Well-Known Text, el que más se usa en el curso
POINT (4884350 2096150)
LINESTRING (4882800 2095800, 4886200 2095800)
POLYGON ((4884250 2096000, 4884550 2096000, 4884550 2096300,
4884250 2096300, 4884250 2096000))
GeoJSON · el de la web, siempre en grados (WGS84)
{"type": "Point", "coordinates": [-74.043417, 4.869386]}
El polígono se cierra repitiendo el primer vértice al final. Las coordenadas van x y, separadas por espacio.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Laboratorio · 20 minutos
Abran datos-espaciales.html, pestaña Laboratorio
- Dibujen un polígono y miren su WKT, su SQL en PostGIS y en Oracle.
- Prueben el ejemplo "Horario": ¿qué dice del sentido del anillo?
- Prueben "Inválido (moño)": ¿qué pasa con su validez?
- Agreguen un hueco y comparen el SDO_ELEM_INFO_ARRAY.
Parte 2
Crear tablas e insertar geometrías
En PostGIS, en Oracle Spatial y en una geodatabase de ArcGIS, lado a lado.
Crear · ejemplo B.1
Una tabla espacial con su índice
PostgreSQL + PostGIS
CREATE TABLE puntos_interes (
id serial PRIMARY KEY,
nombre varchar(60) NOT NULL,
categoria varchar(30),
geom geometry(Point, 9377)
);
CREATE INDEX puntos_interes_gix
ON puntos_interes
USING GIST (geom);
Oracle Spatial
CREATE TABLE puntos_interes (
id NUMBER GENERATED BY DEFAULT
AS IDENTITY PRIMARY KEY,
nombre VARCHAR2(60) NOT NULL,
categoria VARCHAR2(30),
geom SDO_GEOMETRY
);
-- 1. metadatos (siguiente slide)
-- 2. índice R-tree
ArcGIS: Catalog → clic derecho en la geodatabase → New → Feature Class, tipo Point, WKID 9377. El índice espacial se crea solo.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Crear · solo Oracle
Oracle exige metadatos e índice
-- 1. registrar la columna
INSERT INTO user_sdo_geom_metadata
(table_name, column_name, diminfo, srid)
VALUES ('PUNTOS_INTERES', 'GEOM',
SDO_DIM_ARRAY(
SDO_DIM_ELEMENT('X', 4882000, 4887000, 0.005),
SDO_DIM_ELEMENT('Y', 2094000, 2098000, 0.005)),
9377);
-- 2. crear el índice
CREATE INDEX puntos_interes_sidx ON puntos_interes (geom)
INDEXTYPE IS MDSYS.SPATIAL_INDEX_V2
PARAMETERS ('layer_gtype=POINT');
Rango de X y de Y que puede ocupar la capa.
Tolerancia 0.005 m en cada eje.
SRID de la columna.
layer_gtype limita el tipo: POINT, LINE o POLYGON.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Crear · ArcGIS
La feature class hace lo mismo con clics
1
Catalog → clic derecho en la geodatabase → New → Feature Class.
2
Nombre y tipo de geometría: Point, Polyline o Polygon.
3
Campos: nombre, categoría. OBJECTID y Shape los crea solo.
4
Sistema de coordenadas: MAGNA-SIRGAS 2018 Origen Nacional.
| Lo que en SQL es… | …en la feature class es |
|---|---|
| id serial / IDENTITY | OBJECTID, automático |
| geom geometry / SDO_GEOMETRY | Shape, más Shape_Area y Shape_Length |
| Metadatos e índice | Tolerancia y resolución de la geodatabase; índice automático |
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Oracle por dentro
Anatomía de SDO_GEOMETRY
SDO_GEOMETRY(
2003, ① tipo
9377, ② SRID
NULL, ③ punto
SDO_ELEM_INFO_ARRAY(1, 1003, 1), ④ elementos
SDO_ORDINATE_ARRAY( ⑤ coordenadas
4884250,2096000, 4884550,2096000,
4884550,2096300, 4884250,2096300,
4884250,2096000))
① 2003: 2D, polígono.
② 9377: igual al de los metadatos.
③ NULL: solo los puntos lo usan.
④ 1, 1003, 1: empieza en la posición 1, anillo exterior, segmentos rectos.
⑤ x, y, x, y… antihorario, y el primer vértice se repite al final.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Oracle por dentro
Un polígono con hueco, en tripletas
SDO_ELEM_INFO_ARRAY(
1, 1003, 1,
11, 2003, 1)
| Posición | Tipo | Significa |
|---|---|---|
| 1 | 1003 | anillo exterior, antihorario |
| 11 | 2003 | hueco, horario, empieza en la ordenada 11 |
El exterior tiene 5 vértices = 10 números, por eso el hueco empieza en la posición 11.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Insertar · ejemplo B.2
Insertar un punto
PostgreSQL + PostGIS
-- desde WKT
INSERT INTO puntos_interes
(nombre, categoria, geom)
VALUES ('Iglesia', 'cultural',
ST_GeomFromText(
'POINT(4884450 2096150)', 9377));
-- desde x, y
ST_SetSRID(ST_MakePoint(x, y), 9377)
Oracle Spatial
-- desde WKT
INSERT INTO puntos_interes
(nombre, categoria, geom)
VALUES ('Iglesia', 'cultural',
SDO_GEOMETRY(
'POINT (4884450 2096150)', 9377));
-- desde x, y
SDO_GEOMETRY(2001, 9377,
SDO_POINT_TYPE(x, y, NULL), NULL, NULL)
ArcGIS: Edit → Create y clic en el mapa (o Absolute X,Y). Desde un CSV: XY Table To Point. Desde GeoJSON: JSON To Features.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Manos a la obra · 50 minutos
Carguen el municipio en los dos motores
PostGIS · pgAdmin
Abrir datos-espaciales-postgis.sql en el Query Tool y ejecutar la Parte A. Debe listar 7 tablas con SRID 9377.
Oracle · SQL Developer
Abrir datos-espaciales-oracle.sql y ejecutarlo como script (F5). Todas las geometrías deben salir TRUE.
Verlo en un mapa
Abrir las tablas en QGIS o ArcGIS Pro, y comparar con la pestaña El municipio del HTML.
Ejercicios de la sesión 3
Resuélvanlos en un motor y tradúzcanlos al otro
1
Crear la capa de árboles: tabla de puntos con especie y altura, su índice, y tres árboles.
2
Una vía nueva: agregar la Calle 15 como línea recta y mostrar su longitud en kilómetros.
3
Barrios por tamaño: listar los barrios con su área en hectáreas, de mayor a menor.
Sesión 4 · 3 horas
Consultar, medir y modificar
| Hora | Tema | Dónde |
|---|---|---|
| 0:00 – 0:15 | Repaso: insertar un punto en los dos motores | Scripts |
| 0:15 – 1:05 | Ver como texto, medir, centroide | Ejemplos B.3 a B.9 |
| 1:05 – 1:20 | Descanso | |
| 1:20 – 1:55 | Modificar, validar, transformar, catálogo | Ejemplos B.10 a B.13 |
| 1:55 – 2:50 | Ejercicios 4 a 10 | Pestaña Ejercicios |
| 2:50 – 3:00 | Autoevaluación | Pestaña Autoevaluación |
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Consultar · ejemplos B.3 a B.5
Leer lo que hay dentro de la geometría
PostgreSQL + PostGIS
SELECT nombre,
ST_AsText(geom),
ST_GeometryType(geom),
ST_SRID(geom),
ST_NPoints(geom)
FROM barrios;
SELECT nombre, ST_X(geom), ST_Y(geom)
FROM colegios;
Oracle Spatial
SELECT b.nombre,
SDO_UTIL.TO_WKTGEOMETRY(b.geom),
b.geom.SDO_GTYPE,
b.geom.SDO_SRID,
SDO_UTIL.GETNUMVERTICES(b.geom)
FROM barrios b;
SELECT c.nombre, c.geom.SDO_POINT.X,
c.geom.SDO_POINT.Y FROM colegios c;
ArcGIS: Properties → Source muestra tipo y sistema. Add XY Coordinates agrega X y Y. Calculate Field con !Shape!.WKT da el texto.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Medir · ejemplos B.6 a B.8
Área, longitud y distancia
| Medida | PostGIS | Oracle | ArcGIS |
|---|---|---|---|
| Área | ST_Area(geom) | SDO_GEOM.SDO_AREA(geom, 0.005) | Shape_Area |
| Perímetro | ST_Perimeter(geom) | SDO_GEOM.SDO_LENGTH(geom, 0.005) | Shape_Length |
| Longitud | ST_Length(geom) | SDO_GEOM.SDO_LENGTH(geom, 0.005) | Shape_Length |
| Distancia | ST_Distance(a, b) | SDO_GEOM.SDO_DISTANCE(a, b, 0.005) | Near |
-- PostGIS: distancia de cada colegio al hospital
SELECT c.nombre, ROUND(ST_Distance(c.geom, h.geom)::numeric, 1) AS metros
FROM colegios c, centros_salud h
WHERE h.nombre = 'Hospital San Rafael'
ORDER BY metros;
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Medir · resultados en el municipio
Lo que deben obtener
240
hectáreas tiene Altos del Río, el barrio más grande
2.800
metros de perímetro tiene el barrio Centro
3,53
km mide la Variante, la vía más larga
269
metros del IE Técnico Central al hospital
Si PostGIS y Oracle dan lo mismo, los datos quedaron bien cargados en los dos.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Medir · ejemplo B.9
Centroide y rectángulo envolvente
Centroide: el centro de masa. ST_Centroid · SDO_GEOM.SDO_CENTROID · Feature To Point.
Envolvente: la caja más pequeña que la contiene. ST_Envelope · SDO_GEOM.SDO_MBR · Minimum Bounding Geometry.
El índice espacial trabaja con estas cajas: primero compara rectángulos y luego la forma exacta.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Modificar · ejemplo B.10
Mover un punto 50 metros al oriente
PostgreSQL + PostGIS
UPDATE puntos_interes
SET geom = ST_Translate(geom, 50, 0)
WHERE nombre = 'Plaza de mercado';
DELETE FROM puntos_interes
WHERE nombre = 'Estación de bomberos';
Oracle Spatial
UPDATE puntos_interes p
SET p.geom = SDO_GEOMETRY(2001, 9377,
SDO_POINT_TYPE(p.geom.SDO_POINT.X + 50,
p.geom.SDO_POINT.Y, NULL), NULL, NULL)
WHERE p.nombre = 'Plaza de mercado';
COMMIT;
ArcGIS: Edit → Move con Delta X,Y = (50, 0), o Delete. Al terminar, Save para guardar las ediciones.
Modificar una geometría es reemplazarla por una nueva. El resto es el UPDATE y el DELETE de siempre.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Validar · ejemplo B.11
Geometrías inválidas y cómo repararlas
Un polígono en moño
PostGIS
ST_IsValid(g) → false
ST_IsValidReason(g) → Self-intersection
ST_MakeValid(g) → MULTIPOLYGON de dos triángulos
Oracle
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(g, 0.005)
→ 13349 (el polígono se cruza a sí mismo)
SDO_UTIL.RECTIFY_GEOMETRY(g, 0.005)
ArcGIS: Check Geometry para encontrar · Repair Geometry para corregir.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Transformar · ejemplo B.12
Pasar de metros a latitud y longitud
PostgreSQL + PostGIS
SELECT nombre,
ST_X(ST_Transform(geom, 4326)) AS lon,
ST_Y(ST_Transform(geom, 4326)) AS lat
FROM centros_salud;
Oracle Spatial
SELECT t.nombre, t.g.SDO_POINT.X AS lon,
t.g.SDO_POINT.Y AS lat
FROM (SELECT h.nombre,
SDO_CS.TRANSFORM(h.geom, 4326) AS g
FROM centros_salud h) t;
Hospital San Rafael
lon −74.041163
lat 4.870294
ArcGIS: herramienta Project hacia GCS WGS 1984. El mapa reproyecta al vuelo para dibujar, pero eso no cambia los datos guardados.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Catálogo · ejemplo B.13
¿Qué tablas espaciales hay en la base?
PostgreSQL + PostGIS
SELECT f_table_name, type, srid
FROM geometry_columns
WHERE f_table_schema = 'sabana';
Oracle Spatial
SELECT table_name, column_name, srid
FROM user_sdo_geom_metadata
ORDER BY table_name;
| Tabla | Tipo | SRID |
|---|---|---|
| barrios · parques · zonas_riesgo | POLYGON | 9377 |
| vias · rios | LINESTRING | 9377 |
| colegios · centros_salud | POINT | 9377 |
ArcGIS: el panel Catalog. Por dentro, las tablas de sistema de la geodatabase, que no se editan a mano.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Ejercicios de la sesión 4 · 55 minutos
Del 4 al 10, en la pestaña Ejercicios
4 Densidad de población por barrio
5 Kilómetros de vía por tipo
6 Coordenadas para Google Maps
7 Colegios cerca del hospital
8 Detectar y reparar una geometría mala
9 Mover un centro de salud
10 Exportar a GeoJSON
Reto: hacer cada uno en los dos motores
Para llevarse
Lo esencial de las sesiones 3 y 4
| Tarea | PostGIS | Oracle | ArcGIS |
|---|---|---|---|
| Columna | geometry(Tipo, SRID) | SDO_GEOMETRY + metadatos | Feature class |
| Índice | USING GIST | SPATIAL_INDEX_V2 | Automático |
| Insertar | ST_GeomFromText | SDO_GEOMETRY(wkt, srid) | Edit → Create |
| Ver texto | ST_AsText | SDO_UTIL.TO_WKTGEOMETRY | !Shape!.WKT |
| Medir | ST_Area, ST_Length | SDO_GEOM.SDO_AREA | Shape_Area |
| Validar | ST_IsValid | VALIDATE_GEOMETRY… | Check Geometry |
| Transformar | ST_Transform | SDO_CS.TRANSFORM | Project |
Próximas sesiones: operaciones que producen geometrías nuevas, como unión, intersección, diferencia y buffer.
Bases de Datos Espaciales · UMNG · Sesiones 3 y 4
Flechas del teclado o deslizar el dedo para avanzar.