Conceptos básicos de PostGIS
PostGIS añade tipos de geometría y geografía, funciones espaciales e índices a PostgreSQL. Mantén los datos geoespaciales transaccionales en Postgres; delega la renderización de mapas y los cálculos pesados de tiles a servidores de tiles o bibliotecas cliente.
Receta
CREATE EXTENSION IF NOT EXISTS postgis WITH SCHEMA extensions VERSION '3.5.2';
CREATE TABLE stores (
id serial PRIMARY KEY,
name text NOT NULL,
geom extensions.geometry(Point, 4326) NOT NULL
);
INSERT INTO stores (name, geom) VALUES
('NYC Flagship', extensions.ST_SetSRID(extensions.ST_MakePoint(-73.9857, 40.7484), 4326)),
('LA Branch', extensions.ST_SetSRID(extensions.ST_MakePoint(-118.2437, 34.0522), 4326));
-- Tiendas cercanas a menos de 5 km de un punto (geografía para distancias en metros)
SELECT name,
extensions.ST_Distance(
geom::extensions.geography,
extensions.ST_SetSRID(extensions.ST_MakePoint(-73.99, 40.75), 4326)::extensions.geography
) AS meters
FROM stores
ORDER BY meters
LIMIT 10;Cuándo usar esto: Zonas de entrega, seguimiento de activos, geovallas y uniones espaciales donde los datos ya residen en tu base de datos OLTP.
Ejemplo práctico
CREATE INDEX stores_geom_gist ON stores USING gist (geom);
EXPLAIN (ANALYZE, BUFFERS)
SELECT id, name
FROM stores
WHERE extensions.ST_DWithin(
geom::extensions.geography,
extensions.ST_SetSRID(extensions.ST_MakePoint(-73.99, 40.75), 4326)::extensions.geography,
5000
);
SELECT extensions.PostGIS_Version();
SELECT extensions.ST_AsGeoJSON(geom) FROM stores WHERE id = 1;Lo que esto demuestra:
geometry(Point, 4326)almacena latitud/longitud WGS84- Se convierte a
geographypara distancias en metros geodésicas - El índice GiST soporta el prefiltro de caja delimitadora
ST_DWithin ST_AsGeoJSONalimenta mapas web sin una canalización de exportación separada
Profundización
Postgres vs Servidor de Tiles
| Responsabilidad | Postgres + PostGIS | Servidor de Tiles (Martin, pg_tileserv, Mapbox) |
|---|---|---|
| Almacenar características | Sí | Lee desde Postgres o caché |
| Uniones espaciales | Sí | No |
| Renderizar tiles de mapas | Posible pero no ideal | Canalización optimizada de MVT/WebP |
| Actualizaciones transaccionales | Sí | Caché eventualmente consistente |
| Análisis de superposición pesada | SQL | Limitado |
Patrón: PostGIS es el sistema de registro. El servidor de tiles genera tiles vectoriales para mapas base y superposiciones. La aplicación consulta Postgres para búsquedas, entradas de enrutamiento y lógica de negocio.
Tipos principales
geometry- Matemáticas planas en un sistema de coordenadas proyectado; rápido para áreas locales con SRID correcto.geography- Cálculos de esferoides; distancias en metros sobre WGS84.- SRID 4326 - Predeterminado de latitud/longitud GPS para mapas web.
Orden de instalación
CREATE EXTENSION postgis;
-- complementos opcionales después del núcleo
CREATE EXTENSION postgis_topology;
CREATE EXTENSION postgis_raster; -- si se aprueban cargas de trabajo de rasterFija las versiones en la lista de permitidos ADR. Actualiza con ALTER EXTENSION postgis UPDATE y postgis_extensions_upgrade() cuando las notas de la versión lo requieran.
Salida de API
-- GeoJSON para APIs
SELECT json_build_object(
'type', 'FeatureCollection',
'features', json_agg(extensions.ST_AsGeoJSON(s.*)::json)
) FROM stores s;Trampas comunes
- Lat/lon invertidos -
ST_MakePoint(lon, lat)no (lat, lon). Solución: Convención de revisión de código; pruebas de sanidadST_Y/ST_X. - SRID faltante - Las geometrías SRID 0 rompen la semántica de distancia. Solución: Restricción
NOT NULLcongeometry(Point, 4326)yST_SetSRIDen la inserción. - Geometría para distancia global - Unidades incorrectas en geometría 4326. Solución: Convertir a
geographypara metros o proyectar a UTM local. - Servir tiles desde SQL crudo -
ST_AsMVTpesado en tablas sin índice derrite la CPU. Solución: Capa de tiles dedicada con geom simplificada y GiST. - WKT no validado - Polígonos inválidos de cargas de usuario. Solución: Restricción de verificación
ST_IsValidoST_MakeValiden la ingesta con auditoría. - PostGIS en el esquema público - Contamina el
search_path. Solución:WITH SCHEMA extensionsen instalaciones nuevas.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| Solo geolib de aplicación | Pocos puntos estáticos | Uniones espaciales entre tablas |
| Elasticsearch geo | Ya se usa ES para búsqueda | Fuerte FK con núcleo relacional |
| Servidor GIS dedicado (GeoServer) | Estándares complejos WMS/WFS | API REST GeoJSON simple |
| BigQuery GIS | Análisis de almacén de datos | Latencia de geovallas OLTP |
Preguntas frecuentes
PostGIS en Postgres gestionado?
Disponible en RDS, Cloud SQL, AlloyDB con matriz de versiones. Fijar en la lista de permitidos.2D vs 3D?
La mayoría de las aplicaciones usan Puntos/Polígonos 2D. Dimensiones Z cuando la elevación importa.Extensión Raster?
postgis_raster para flujos de trabajo de satélite; aprobación de operaciones separada y planificación de almacenamiento.MVT en SQL?
ST_AsMVT es posible; preferir servidor de tiles para caché y simplificación.Replicación?
Las columnas de geometría se replican normalmente; verificar la versión de la extensión en las réplicas.pg_upgrade?
Ejecutar postgis_extensions_upgrade después de una actualización importante de PG según la documentación.Columna JSON vs GeoJSON?
Almacenar tipo de geometría; emitir GeoJSON en el límite de la API.Mapas sin conexión móviles?
Enviar tiles o extractos de GeoJSON; PostGIS sigue siendo el almacén de servidor autoritativo.Confusión de CRS?
Documentar SRID por tabla; nunca mezclar 4326 y UTM local sin transformación.Próximas lecturas?
Artículo Geometría vs Geografía para la elección del tipo.Relacionados
- Geometría vs Geografía - tipos y distancia
- Índices Espaciales - patrones GiST
- Rendimiento de PostGIS - simplificar y prefiltrar
- Conceptos básicos de extensiones - instalar y fijar
- Mejores prácticas de PostGIS - SRID y validación
Versiones de Stack: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PostGIS 3.5+, pgbouncer 1.x, y Patroni 3.x.