Tecnología · Arquitectura

Ninguna ruta, tesela ni matriz de tiempos sale a un tercero. Por eso no te las factura nadie.

Un GMAO que consume servicios de mapas de pago tiene un coste que crece con tu uso, y cada consulta le cuenta a ese proveedor dónde está tu personal. Aquí PostGIS, Valhalla, VROOM, Planetiler y el servidor de teselas corren dentro de la instalación, desplegados con Docker Compose. No es una preferencia técnica: cambia la estructura de costes y quién ve las posiciones de tu equipo.

Esquema · el recorrido de una tesela
FRONTERA DE LA INSTALACIÓNDOCKER COMPOSENAVEGADORMapLibre GL1pide z/x/y6recibe la teselaTESELASNginx dedicadosin pasar por la API2leeVOLUMEN COMPARTIDOCaché en discoversionada por capacamino habitualsolo si faltacálculo de rutas3si falta5la guardaRUTEO · OSMValhallamatriz de tiemposAPI · FASTAPIGenerador MVT4SQLBASE DE DATOSPostGISdatos y geometríaFRONTERA DE LA INSTALACIÓNDOCKER COMPOSENAVEGADORMapLibre GL1pide z/x/y6recibe la teselaTESELASNginx dedicadosin pasar por la API2leeVOLUMEN COMPARTIDOCaché en discoversionada por capacamino habitualsolo si faltacálculo de rutas3si falta5la guardaAPI · FASTAPIGenerador MVTRUTEO · OSMValhallamatriz de tiempos4SQLBASE DE DATOSPostGISdatos y geometría
Ilustración esquemática, no captura de pantalla.
La consecuencia económica

Sin coste por llamada, sin cuota de proveedor.

Con un servicio de mapas de pago, el coste variable crece con el uso. Cada matriz de tiempos, cada geocodificación y cada tesela se factura, y cuanto más usa el sistema tu equipo, más pagas.

Con los motores dentro de la instalación, calcular la matriz de proximidad de toda la plantilla cada vez que se abre el panel de asignación no cuesta nada. Por eso la cercanía se calcula siempre, y no solo cuando alguien se acuerda de pedirla.

Y la consecuencia que no es económica: las posiciones del personal y las rutas no salen de la instalación, porque no hay un tercero al que consultarlas.

Componentes

Qué corre y para qué.

ComponenteTecnologíaFunción
APIFastAPI (Python)Toda la lógica de negocio, sobre /api/v1 más la API pública en su propio espacio.
Base de datosPostgreSQL + PostGISDatos y geometría. Con pg_cron y pg_partman.
Frontend webPHP + MapLibre GLAplicación de gestión y portal de cliente.
Servidor de teselasNginx dedicadoSirve las teselas MVT cacheadas en disco sin pasar por la API.
RuteoValhalla sobre OSMRutas, matrices origen-destino, map matching e isócronas.
OptimizaciónVROOMSolver de rutas con ventanas temporales y capacidades.
Mapa basePlanetilerGenera PMTiles de OpenStreetMap para cualquier región.
DespliegueDocker ComposeDos redes: una interna y una de proxy, con TLS automático.
Teselas vectoriales

Por qué el mapa no se atasca con la red completa.

Si el inventario se dibuja con marcadores del navegador, el mapa se atasca al mostrar una red completa: el DOM no aguanta cien mil elementos y hay que paginar o filtrar, que es exactamente lo que le quita la utilidad al mapa.

Aquí el inventario se sirve como teselas vectoriales MVT generadas desde PostGIS, cacheadas en disco en un volumen compartido y servidas por un Nginx dedicado que no pasa por la API. La caché lleva versionado por capa y purga selectiva: al cambiar un estilo o un dato se invalida lo que toca, no todo.

Cartografía

Mapa base propio y paquetes offline.

  • Mapa base OSM propio Generado con Planetiler para la región que haga falta, con catálogo dinámico de regiones. Sin clave de API de terceros.
  • PMTiles de activos Las teselas del inventario empaquetadas para uso offline en el dispositivo.
  • MBTiles de ortofoto Ortofoto del PNOA descargada del IGN y recortada al ámbito de trabajo.
  • Capas WMS externas De terceros, con descubrimiento automático por GetCapabilities.
  • Estilos MapLibre completos Relleno, trazo, patrón, símbolo, etiqueta y filtro por zoom, con estilo temático por propiedad y leyenda derivada.
Decisiones de arquitectura

Cuatro que conviene conocer antes de evaluar.

  • Geometrías en EPSG:3857 Internamente, coherente con la teselación web, con transformación a 4326 en las fronteras del sistema.
  • Circuit breakers Ante Valhalla y VROOM, con estado consultable en el health check. Si el motor de rutas cae, la aplicación degrada en lugar de bloquearse.
  • Particionado mensual de telemetría Con gestión automática de particiones y retención: 60 días para posiciones de personal, 90 para vehículo.
  • Lógica compartida en PL/pgSQL Elegibilidad, disponibilidad, horario efectivo y detección de geofences viven en la base de datos, para que web, móvil y procesos automáticos den el mismo resultado.

Preguntas frecuentes

¿Se puede desplegar en nuestra propia infraestructura?
Todo el sistema se despliega con Docker Compose sobre dos redes. La respuesta depende de tu entorno, y preferimos darla sobre el caso concreto que en abstracto.
¿Qué pasa si Valhalla o VROOM no responden?
Hay circuit breakers ante ambos, con su estado expuesto en el health check. Las funciones que dependen del cálculo de rutas degradan; el resto del sistema sigue operando.
¿Cuántas migraciones de esquema lleva el producto?
El esquema se gestiona con Alembic y va por 75 revisiones. Da una idea del recorrido del producto mejor que cualquier adjetivo.

Última actualización:

Lo siguiente: quién ve qué y dónde vive el dato.