¿Qué es PostGIS? ¿Cuándo y cómo debería usarlo?

¿Qué es PostGIS?
PostGIS es esencialmente un complemento de código abierto para la base de datos PostgreSQL que agrega soporte para objetos geográficos y convierte a PostgreSQL en una base de datos espacial.
¿Cuándo debería usar PostGIS?
Si tenés bases de datos con direcciones que querés ubicar en un mapa o bases de datos que guardan valores geométricos complejos, PostGIS es tu opción.
¿Cómo instalo PostGIS?
Esto va a depender de tu entorno de trabajo, si estás usando docker, acá tenés un pequeño tutorial.
En caso de que tengas un PostgreSQL corriendo en Linux, deberías usar los siguientes comandos en tu consola:
# Por favor revisá si esta es la última versión acá
wget http://postgis.net/stuff/postgis-3.3.3dev.tar.gz
tar -xvzf postgis-3.3.3dev.tar.gz
cd postgis-3.3.3dev
./configure
make
make install
Habilitando PostGIS en mi base de datos
Después de instalar PostGIS, tenés que habilitarlo en tu base de datos (tranquilo, podés hacerlo en PgAdmin)
Para lograr esto, consultemos los siguientes comandos:
CREATE EXTENSION IF NOT EXISTS plpgsql;
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster; -- OPCIONAL
CREATE EXTENSION postgis_topology; -- OPCIONAL

Después de hacer esto, vas a notar que cuando creás una tabla, ahora tenés disponibles las columnas geometry y geography.

¿Cómo actualizo PostGIS?
A partir de la versión 3 en adelante, si instalaste PostGIS usando extensiones, actualizarlo es tan simple como ejecutar la siguiente consulta:
SELECT postgis_extensions_upgrade();
Para versiones anteriores que también fueron instaladas con extensiones:
ALTER EXTENSION postgis UPDATE;
SELECT postgis_extensions_upgrade();
-- Esta segunda llamada es necesaria para reempaquetar la extensión postgis_raster
SELECT postgis_extensions_upgrade();
En caso de que no hayas usado ninguna de estas opciones o tengas múltiples versiones de PostGIS, podés revisar la documentación acá.
El tipo de dato geometry, el modelo abstracto
El tipo de dato geometry es un modelo abstracto que acepta los siguientes Features Access para generar valores geométricos:
Point
LineString
LinearRing
Polygon
MultiPoint
MultiLineString
MultiPolygon
GeometryCollection
PolyhedralSurface
Triangle
TIN
¿Cómo uso el tipo de dato geometry?
-- Crear tabla para valores geométricos
CREATE TABLE geometrical_values (name varchar, geom geometry);
-- Insertar algunos valores geométricos
INSERT INTO geometrical_values VALUES
('Point', 'POINT(0 0)'),
('Linestring', 'LINESTRING(1 1, 2 2, 3 2, 3 3)'),
('Polygon', 'POLYGON((4 4, 5 4, 5 5, 4 5, 4 4))');
-- Seleccionar los valores geométricos
SELECT name,geom FROM geometrical_values;
En PgAdmin 4 (que soporta la extensión PostGIS) vas a ver el siguiente ícono después de hacer estas consultas:

Si hacés clic en él, te va a dar la representación geométrica de nuestra consulta SELECT:

El tipo de dato geography
El tipo de dato geography no soporta TINS, POLYHEDRALSURFACEs, ni curvas, ya que asume que estás usando un mapa mundial como lienzo.
¿Cómo uso el tipo de dato geography?
Marcando puntos en un mapa con PostGIS
-- Crear tabla para valores de geography
CREATE TABLE geographycal_values (name varchar, geof geography);
INSERT INTO geographycal_values (name, geof) VALUES ('USA', ST_GeogFromText('SRID=4326;POINT(-100 40)') );
INSERT INTO geographycal_values (name, geof) VALUES ('Mexico', ST_GeogFromText('SRID=4326;POINT(-100 20)') );
INSERT INTO geographycal_values (name, geof) VALUES ('France', ST_GeogFromText('SRID=4326;POINT(0 49)') );
SELECT name,geof FROM geographycal_values;
Si hacés clic en tu ícono de nuevo, podrías ver algo así en tu visor de geometría:

Como podés ver, ahora los puntos están ubicados en un mapa.
Fíjate que en nuestro código usamos POINT con algunos valores adentro, bueno, esos son longitud y latitud, mirá cómo funciona este código (y por favor notá que Google te da latitud y longitud y no al revés, te va a ahorrar algunos dolores de cabeza):
INSERT INTO geographycal_values (name, geof) VALUES ('Argentina', ST_GeogFromText('SRID=4326;POINT(-58.480599 -34.626677)') );
También podrías usar LINESTRING para trazar una línea entre estados, POLYGON para definir el área de un estado, o cualquier otro tipo de dato (excepto los que dijimos antes).
Conclusión
PostGIS es una herramienta poderosa para convertir las tablas de tu base de datos en una gestión Geométrica o Geográfica potente. También podés crear tus propios mapas con él y mostrarlos usando Leaflet o cualquier otra librería de mapas.
¡Te invito a probarlo!
¡Nos vemos en el próximo!