Sesiones 3 y 4 · Datos espaciales
1 / 31 Portal del curso

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.

Universidad Militar Nueva Granada

Sesión 3 · 3 horas

Plan de la sesión 3: crear e insertar

HoraTemaDónde
0:00 – 0:30Geometrías, SRID y toleranciaSlides + pestaña Geometrías
0:30 – 1:10Laboratorio y anatomía de SDO_GEOMETRYPestañas Laboratorio y Crear
1:10 – 1:25Descanso
1:25 – 2:15Cargar el municipio en los dos motoresParte A de los dos scripts
2:15 – 2:30Crear e insertar en los tres entornosEjemplos B.1 y B.2
2:30 – 3:00Ejercicios 1 a 3Pestaña Ejercicios

Bases de Datos Espaciales · UMNG · Sesiones 3 y 4

Universidad Militar Nueva Granada

De la sesión 1 a hoy

Una tabla espacial es una tabla con una columna más

idnombresectormatriculageom
1IE Técnico Centraloficial820POINT (4884350 2096150)
2Colegio Santa Lucíaoficial640POINT (4883600 2095400)
3Gimnasio Los Pinosprivado310POINT (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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

Geometrías

El mismo tipo con tres nombres

TipoWKT y PostGISOracle (gtype)ArcGIS
PuntoPOINT2001Point
LíneaLINESTRING2002Polyline
PolígonoPOLYGON2003Polygon
MultipuntoMULTIPOINT2005Multipoint
MultilíneaMULTILINESTRING2006Polyline de varias partes
MultipolígonoMULTIPOLYGON2007Polygon de varias partes
ColecciónGEOMETRYCOLLECTION2004No 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

Universidad Militar Nueva Granada

Sistema de referencia

Una coordenada sin SRID no significa nada

El Hospital San Rafael del municipio, en cuatro sistemas:

SRIDXYUnidad
9377 · Origen Nacional48846002096250metros
3116 · MAGNA Bogotá1004031.351030309.92metros
4326 · WGS84-74.0411634.870294grados
3857 · Web Mercator-8242224.60542812.76metros 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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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 / IDENTITYOBJECTID, automático
geom geometry / SDO_GEOMETRYShape, más Shape_Area y Shape_Length
Metadatos e índiceTolerancia y resolución de la geodatabase; índice automático

Bases de Datos Espaciales · UMNG · Sesiones 3 y 4

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

Oracle por dentro

Un polígono con hueco, en tripletas

SDO_ELEM_INFO_ARRAY(
  1, 1003, 1,
  11, 2003, 1)

PosiciónTipoSignifica
11003anillo exterior, antihorario
112003hueco, 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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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

HoraTemaDónde
0:00 – 0:15Repaso: insertar un punto en los dos motoresScripts
0:15 – 1:05Ver como texto, medir, centroideEjemplos B.3 a B.9
1:05 – 1:20Descanso
1:20 – 1:55Modificar, validar, transformar, catálogoEjemplos B.10 a B.13
1:55 – 2:50Ejercicios 4 a 10Pestaña Ejercicios
2:50 – 3:00AutoevaluaciónPestaña Autoevaluación

Bases de Datos Espaciales · UMNG · Sesiones 3 y 4

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

Medir · ejemplos B.6 a B.8

Área, longitud y distancia

MedidaPostGISOracleArcGIS
ÁreaST_Area(geom)SDO_GEOM.SDO_AREA(geom, 0.005)Shape_Area
PerímetroST_Perimeter(geom)SDO_GEOM.SDO_LENGTH(geom, 0.005)Shape_Length
LongitudST_Length(geom)SDO_GEOM.SDO_LENGTH(geom, 0.005)Shape_Length
DistanciaST_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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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

Universidad Militar Nueva Granada

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;

TablaTipoSRID
barrios · parques · zonas_riesgoPOLYGON9377
vias · riosLINESTRING9377
colegios · centros_saludPOINT9377

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

Universidad Militar Nueva Granada

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

TareaPostGISOracleArcGIS
Columnageometry(Tipo, SRID)SDO_GEOMETRY + metadatosFeature class
ÍndiceUSING GISTSPATIAL_INDEX_V2Automático
InsertarST_GeomFromTextSDO_GEOMETRY(wkt, srid)Edit → Create
Ver textoST_AsTextSDO_UTIL.TO_WKTGEOMETRY!Shape!.WKT
MedirST_Area, ST_LengthSDO_GEOM.SDO_AREAShape_Area
ValidarST_IsValidVALIDATE_GEOMETRY…Check Geometry
TransformarST_TransformSDO_CS.TRANSFORMProject

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

Universidad Militar Nueva Granada

Flechas del teclado o deslizar el dedo para avanzar.