En esta clase explicaremos que PostgreSQL es un motor de base de datos
relacional robusto y de código abierto, utilizado ampliamente en la industria para almacenar
datos alfanuméricos convencionales. Sin embargo, cuando surge la necesidad de representar la
ubicación espacial de un elemento (como coordenadas, puntos, líneas o polígonos) de una
manera que vaya más allá de simples columnas de texto o números, es necesario extender las
capacidades del motor. Aquí es donde entra PostGIS, una extensión que
habilita el componente geoespacial en bases de datos PostgreSQL, permitiendo almacenar
geometrías complejas y realizar análisis espaciales directamente mediante SQL.
Entenderemos que, mientras una tabla convencional almacena atributos como nombres o
identificadores, una tabla espacial incluye una columna adicional, usualmente llamada
geom, que almacena la información de la geometría en un formato codificado.
Instalación del Software Necesario
Para el desarrollo de la práctica, utilizaremos el instalador oficial de PostgreSQL para
Windows. Durante el proceso de instalación, es crucial definir y recordar la contraseña del
superusuario (postgres) y mantener el puerto por defecto 5432.
Una vez finalizada la instalación de PostgreSQL, se ejecutará una herramienta llamada
Stack Builder. Esta utilidad nos permite descargar e instalar extensiones
adicionales. Dentro de Stack Builder, seleccionaremos la opción de Spatial
Extensions y elegiremos la versión de PostGIS correspondiente.
Acceso y Administración con pgAdmin
La administración de nuestras bases de datos se realizará a través de
pgAdmin, la interfaz gráfica por defecto de PostgreSQL. Al abrir pgAdmin,
nos conectaremos al servidor local ingresando la contraseña que definimos previamente.
Podremos verificar si la extensión PostGIS está instalada revisando la sección de
"Extensions" dentro de cada base de datos.
Creación de Bases de Datos Espaciales
Abordaremos dos métodos para crear una base de datos habilitada espacialmente:
Método 1: Uso de Plantilla
Al crear una nueva base de datos, en la
pestaña de definición seleccionaremos el Template o plantilla que se creó durante la
instalación de PostGIS.
Método 2: Habilitación Manual mediante SQL
Si creamos una base de datos
estándar, utilizaremos la herramienta de consultas (Query Tool) para activar PostGIS:
CREATE EXTENSION postgis;
Restauración de Datos de Prueba
Para practicar consultas reales, cargaremos la base de datos de ejemplo de la ciudad de Nueva
York (nyc_data.backup). El proceso se realiza creando una base de datos vacía y
utilizando la opción de Restore. Si se presenta un error, se soluciona
yendo a File > Preferences > Binary Paths y asignando la ruta de la carpeta
bin de PostgreSQL.
Consultas Espaciales y Visualización
Una vez cargados los datos, utilizaremos SQL para interactuar con la información espacial:
SELECT * FROM nyc_neighborhoods;
SELECT name, ST_Transform(geom, 4326) AS geom
FROM nyc_neighborhoods;
SELECT * FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';
Funciones de Agregación
PostGIS y PostgreSQL permiten realizar análisis estadísticos rápidos con funciones como
COUNT, SUM y agrupación con GROUP BY:
SELECT COUNT(*) FROM nyc_streets;
SELECT SUM(popn_total) FROM nyc_census_blocks
WHERE boroname = 'The Bronx';
SELECT boroname, COUNT(*)
FROM nyc_neighborhoods
GROUP BY boroname;
En esta clase se abordarán los procedimientos técnicos para poblar una base de datos espacial
utilizando el motor PostgreSQL con la extensión PostGIS. Se explicarán tres metodologías
distintas para la importación de información geográfica: el uso de la herramienta nativa
shp2pgsql, la librería de transformación ogr2ogr y la interfaz
gráfica del software QGIS. Es fundamental comprender que para estos procesos se requiere
tener previamente instalado y configurado un servidor PostgreSQL con una base de datos
espacial habilitada.
Herramienta Nativa: shp2pgsql (Consola y GUI)
La primera herramienta que se estudiará es shp2pgsql, la cual viene integrada de
forma nativa en el paquete de instalación de PostGIS. Su función principal es transformar
archivos Shapefile (.shp) en código SQL ejecutable. Esta utilidad se encuentra alojada
generalmente en el directorio bin de la instalación de PostgreSQL. Para
ejecutarla mediante la línea de comandos (CMD), es necesario contar con privilegios de
administrador y navegar hasta dicho directorio.
El funcionamiento en consola se basa en la transformación del archivo binario a una cadena de
texto SQL. El comando básico requiere especificar el sistema de referencia espacial (SRID)
mediante el parámetro -s, seguido de la ruta del archivo de entrada y el nombre
de la tabla de salida. Para guardar el resultado en un archivo físico, se utiliza el
operador de redirección >. Un ejemplo de la sintaxis a utilizar sería:
shp2pgsql -s 4326 C:\\ruta\\archivo.shp nombre_tabla > C:\\ruta\\salida.sql
Una vez generado el archivo SQL, este debe ser abierto y ejecutado dentro del administrador
de bases de datos (pgAdmin) utilizando la herramienta de consultas (Query Tool) para
materializar la tabla en la base de datos.
De forma alternativa, esta herramienta posee una interfaz gráfica conocida como "PostGIS
Bundle" o "Shapefile Import/Export Manager". Esta opción facilita el proceso para usuarios
menos familiarizados con la consola. Tras establecer la conexión con el servidor ingresando
las credenciales (host, puerto, base de datos, usuario y contraseña), se seleccionan los
archivos a importar mediante el botón "Add File". Es crucial verificar y ajustar el SRID
(Sistema de Referencia de Identificación Espacial) en la columna correspondiente antes de
proceder con la importación, ya que el valor por defecto puede ser 0.
Librería de Transformación: ogr2ogr (GDAL)
La segunda metodología implica el uso de ogr2ogr, una potente utilidad de línea
de comandos perteneciente a la librería GDAL. A diferencia de la herramienta anterior, esta
permite una conexión directa con la base de datos sin generar archivos SQL intermedios y
soporta una amplia variedad de formatos de entrada, incluyendo GeoJSON. Para su ejecución se
recomienda utilizar la consola "OSGeo4W Shell", que se instala comúnmente junto con QGIS.
La sintaxis de ogr2ogr requiere definir el formato de salida con la bandera
-f "PostgreSQL" y construir una cadena de conexión explícita que incluya todos
los parámetros de autenticación. Un ejemplo completo de la estructura del comando es:
ogr2ogr -f "PostgreSQL" PG:"dbname=NombreBD host=localhost port=5432 user=postgres password=tu_clave" archivo_entrada.shp
Durante la clase se enfatiza la gestión de geometrías complejas. Si la importación falla
debido a discrepancias en el tipo de geometría (por ejemplo, al intentar cargar
MultiPolígonos), se debe utilizar la bandera -nlt (New Layer Type) para forzar
el tipo de geometría, por ejemplo: -nlt POLYGON o
-nlt MULTIPOLYGON.
Adicionalmente, para mantener un estándar en la estructura de la base de datos, se pueden
aplicar opciones de creación de capa con la bandera -lco (Layer Create
Options). Esto permite renombrar la clave primaria y la columna de geometría para que
coincidan con las convenciones de PostGIS (gid y geom). El comando refinado incluiría:
ogr2ogr ... -lco FID=gid -lco GEOMETRY_NAME=geom
Importación mediante Interfaz de QGIS
El tercer método explicado utiliza QGIS como cliente para gestionar la base de datos. Este
enfoque es completamente gráfico y no requiere el uso de consola. El proceso inicia en el
panel del navegador de QGIS, donde se debe crear una "Nueva Conexión" bajo el apartado
PostGIS, ingresando los parámetros del servidor y probando la conexión.
Una vez establecida la conexión, se utiliza la herramienta "Administrador de Bases de Datos"
(DB Manager). Dentro de esta interfaz, se selecciona la opción "Importar Capa/Archivo", lo
que permite cargar cualquier capa vectorial abierta en QGIS o almacenada en el disco
directamente hacia la base de datos PostGIS. Aquí se pueden definir parámetros como el
esquema (generalmente public), el nombre de la tabla de destino, la clave
primaria y el SRID.
Visualización y Sistemas de Referencia
Es vital tener en cuenta los sistemas de referencia espacial al visualizar los datos
cargados. Si la información importada posee un SRID diferente al del mapa base (comúnmente
WGS84 - SRID 4326), es posible que no se visualice correctamente en ciertos visores o
requiera transformación. En SQL, se puede utilizar la función ST_Transform para
reproyectar las geometrías al vuelo durante una consulta, por ejemplo:
SELECT ST_Transform(geom, 4326) FROM tabla_localidades;
Esta función asegura que los datos proyectados en sistemas locales (como Magna Sirgas) puedan
superponerse correctamente sobre mapas base globales. Al finalizar cualquiera de los
procesos de carga, se recomienda siempre realizar un "Refresh" (actualización) en el esquema
de la base de datos dentro de pgAdmin para verificar que las tablas se hayan creado
correctamente con sus respectivas columnas de atributos y geometría.
En el análisis de sistemas de información geográfica, es fundamental comprender cómo
interactúan las geometrías entre sí dentro de una base de datos espacial. Las entidades
geográficas establecen relaciones basadas en su posición en el espacio. Estas relaciones se
evalúan mediante funciones que retornan valores booleanos, es decir, verdadero
(true) si la condición se cumple o falso (false) en caso contrario.
Entre las operaciones principales se encuentra la intersección (ST_Intersects),
que determina si dos geometrías comparten algún espacio en común. La operación opuesta es la
disyunción (ST_Disjoint). Otras relaciones importantes incluyen el cruce
(ST_Crosses), la superposición (ST_Overlaps) y el contacto
(ST_Touches). Las funciones de contención (ST_Within,
ST_Contains) son esenciales para la jerarquía espacial.
Optimización mediante Índices Espaciales
Antes de ejecutar consultas espaciales complejas, es imprescindible optimizar el rendimiento
mediante la creación de índices espaciales de tipo GIST. Estos crean una
estructura de árbol basada en los cuadros delimitadores de las geometrías.
CREATE INDEX barrios_idx ON barrios USING GIST (geom);
Cálculos de Área
Una operación básica es el cálculo de áreas mediante la función ST_Area. Esta
función permite ordenar las divisiones administrativas por su extensión territorial.
SELECT * FROM departamentos
ORDER BY ST_Area(geom) DESC
LIMIT 1;
Análisis de Contención
El análisis de contención permite cuantificar elementos que se encuentran dentro de una
división mayor. Un caso práctico es el conteo de municipios por departamento usando
ST_Contains.
SELECT d.de_nombre, COUNT(m.cod_dane) AS total_municipios
FROM departamentos d, municipios m
WHERE ST_Contains(d.geom, m.geom)
GROUP BY d.de_nombre
ORDER BY total_municipios DESC;
Análisis de Intersección
La función ST_Intersects es ideal para seleccionar entidades puntuales que caen
dentro de un área de interés específica.
SELECT e.nombre, e.geom
FROM departamentos d, establecimientos_educativos e
WHERE d.de_nombre = 'Cundinamarca'
AND ST_Intersects(d.geom, e.geom);
Generación de Áreas de Influencia (Buffer)
Para análisis de proximidad, la función ST_Buffer genera una nueva geometría
poligonal alrededor de una entidad existente a una distancia definida.
SELECT nombre, ST_Buffer(geom, 1000)
FROM localidades;
Análisis de Adyacencia
El análisis de topología para determinar qué entidades son vecinas se realiza mediante
ST_Touches. Esta función devuelve verdadero si dos geometrías comparten un
borde pero no se superponen.
CREATE TABLE boyaca AS
SELECT * FROM departamentos
WHERE de_nombre = 'Boyacá';
SELECT d.de_nombre, d.geom
FROM departamentos d, boyaca b
WHERE ST_Touches(d.geom, b.geom);
En esta clase se explicará cómo realizar un análisis espacial avanzado utilizando PostGIS
para resolver un problema de ubicación óptima. El objetivo es identificar predios adecuados
para la construcción de un nuevo colegio público en el municipio de Anapoima, aplicando una
serie de criterios técnicos y espaciales que deben cumplirse de manera simultánea.
Los requisitos espaciales son: área superior a 5000 m², distancia mayor de 300 metros de
colegios de primaria existentes, retiro de más de 200 metros respecto a equipamientos
municipales, y ubicación exclusivamente dentro de zonas con uso de suelo residencial.
Filtrado por Superficie (ST_Area)
Para el primer requisito, se utiliza la función ST_Area aplicada a la columna de
geometría. Es preferible calcular el área directamente desde la geometría en lugar de
confiar en atributos precalculados.
CREATE TABLE manzanas_5000 AS
SELECT * FROM manzanas
WHERE ST_Area(geom) > 5000;
Análisis de Distancia a Colegios
Para evaluar la distancia respecto a los colegios de primaria, se aplica un área de
influencia mediante ST_Buffer de 300 metros. Se emplea ST_Union
para fusionar los buffers en una sola entidad y ST_Intersects igualado a falso
para descartar manzanas dentro del área de influencia.
CREATE TABLE buffer_colegios AS
SELECT ST_Union(ST_Buffer(geom, 300)) AS geom
FROM colegios_primaria;
CREATE TABLE manzanas_lejanas AS
SELECT m.* FROM manzanas_5000 m, buffer_colegios b
WHERE ST_Intersects(m.geom, b.geom) = FALSE;
Retiro de Equipamientos
Se sigue una metodología similar creando una zona de amortiguamiento de 200 metros alrededor
de los equipamientos municipales, reduciendo progresivamente el universo de candidatos.
CREATE TABLE buffer_equipamientos AS
SELECT ST_Union(ST_Buffer(geom, 200)) AS geom
FROM equipamientos;
Contención en Zona Residencial
El último criterio exige que la manzana esté contenida totalmente dentro de la zona de uso
residencial. Se utiliza ST_Contains, que devuelve verdadero solo si la
geometría está íntegramente dentro de los polígonos de uso residencial.
CREATE TABLE residencial_consolidado AS
SELECT ST_Union(geom) AS geom
FROM uso_suelo
WHERE tipo = 'Residencial';
SELECT m.*, ST_Transform(m.geom, 4326) AS geom_web
FROM manzanas_lejanas_total AS m, residencial_consolidado AS r
WHERE ST_Contains(r.geom, m.geom);
Al finalizar, se obtienen los lotes que cumplen estrictamente con toda la normativa. El uso
de bases de datos espaciales permite automatizar procesos de toma de decisiones complejos,
sustituyendo las tareas manuales de los SIG tradicionales por consultas SQL precisas y
replicables.
En esta clase se explicará el procedimiento técnico para la gestión de datos ráster dentro de
PostGIS, extendiendo las capacidades de almacenamiento y análisis espacial de PostgreSQL más
allá de los objetos vectoriales tradicionales. Se abordará desde la importación de archivos
mediante herramientas de línea de comandos hasta la ejecución de consultas SQL para la
exploración de metadatos.
Importación con raster2pgsql
Se utilizará la utilidad raster2pgsql, ubicada en el directorio bin
de PostgreSQL. Este ejecutable transforma la estructura binaria del ráster en un archivo de
sentencias SQL compatible con la base de datos.
raster2pgsql -s 32618 -I -C -M C:\\datos\\chia.tiff > chia.sql
Los parámetros son: -s define el SRID para georreferenciar correctamente la
imagen, -I crea un índice espacial sobre la columna ráster, y -C
aplica las restricciones estándar de PostGIS para ráster.
Una vez generado el archivo SQL, se debe ejecutar dentro de una base de datos con PostGIS
habilitado. La tabla resultante presentará una columna de tipo rast, que
almacena la información binaria y espacial de la imagen (a diferencia de geom
para datos vectoriales).
Exploración de Propiedades del Ráster
Para extraer propiedades sin necesidad de visualizar la imagen en un software externo, se
emplean funciones específicas de PostGIS:
SELECT
ST_Height(rast) AS filas,
ST_Width(rast) AS columnas,
ST_SRID(rast) AS srid,
ST_NumBands(rast) AS numero_bandas
FROM chia;
Estas funciones permiten validar la resolución de la imagen (filas y columnas) y verificar si
es multiespectral mediante el conteo de bandas.
Vista del Sistema: raster_columns
PostGIS mantiene una vista de sistema llamada raster_columns, esencial para la
administración de la base de datos. Esta vista proporciona información crítica como el
tamaño del píxel, el tipo de dato y los valores de 'no data'.
SELECT
r_table_name,
srid,
scale_x,
scale_y,
blocksize_x,
blocksize_y,
pixel_types
FROM raster_columns;
El análisis de estos atributos permite comprender la resolución espacial y la profundidad de
bit antes de proceder con operaciones como álgebra de mapas, generación de índices de
vegetación o reclasificación.
En esta clase se explicará el análisis de datos ráster en PostGIS, enfocándose en el
álgebra de mapas para la generación de índices espectrales. Una imagen
satelital está compuesta por múltiples bandas que representan diferentes regiones del
espectro electromagnético. Cada banda es una matriz donde cada píxel contiene un nivel
digital que refleja la reflectancia de la superficie terrestre.
El álgebra de mapas permite realizar operaciones matemáticas píxel a píxel entre bandas, lo
cual es la base para calcular índices que identifican coberturas como vegetación, humedad o
zonas urbanas. Se utilizará la función ST_MapAlgebra de PostGIS para ejecutar
expresiones matemáticas sobre los datos ráster.
Cálculo del NDVI (Índice de Vegetación)
El Índice de Vegetación de Diferencia Normalizada (NDVI) opera las bandas
del infrarrojo cercano y el rojo. En imágenes Landsat, corresponden a las bandas 4 y 3
respectivamente. La fórmula es: (NIR - Rojo) / (NIR + Rojo).
CREATE TABLE ndvi AS
SELECT ST_MapAlgebra(
rast, 4,
rast, 3,
'([rast1.val] - [rast2.val]) / ([rast1.val] + [rast2.val])',
'32BF'
) AS rast
FROM chia;
El tipo de dato 32BF (32 bits punto flotante) permite almacenar valores
decimales que oscilan entre -1 y 1. Los valores más altos representarán vegetación densa y
saludable.
Cálculo del NDWI (Índice de Agua)
El Índice de Agua de Diferencia Normalizada (NDWI) es fundamental para
resaltar cuerpos de agua o niveles de humedad en el suelo. Utiliza las bandas 2 (verde) y 4
(infrarrojo cercano).
CREATE TABLE ndwi AS
SELECT ST_MapAlgebra(
rast, 2,
rast, 4,
'([rast1.val] - [rast2.val]) / ([rast1.val] + [rast2.val])',
'32BF'
) AS rast
FROM chia;
Los valores positivos más altos del NDWI identificarán con precisión cuerpos de agua como
embalses o humedales. Esta metodología demuestra el potencial de PostGIS para realizar
análisis espaciales complejos mediante programación SQL.