OpenStreetMap en Elastic

SotMes 2026 · Madrid · 7 de noviembre
Jorge Sanz · Geoinquieto
Elastic · ela.st/2611-sotmes

Elastic ayuda a transformar datos
en respuestas, acciones y resultados

  • 2012
    fundada en
  • ~4.000
    empleades
  • 40+
    países con empleades
  • 5.000 M+
    descargas
  • 54 %
    de Fortune 500
  • ESTC
    cotiza en la NYSE

https://elastic.co

Stack de Elastic: BELK (AGPL/SSPL/ELv2)

Kibana Maps

  • capas, agregaciones y análisis geoespacial, habitualmente integrados dentro de un cuadro de mando
  • también parte de otras soluciones: visualizador genérico de datos, mapa de seguridad o mapa de logs

Ejemplo: mapa global de ventas por país, agregando datos por código ISO

Por qué un servicio de mapas propio

  • Hasta 2016, Kibana dependía de un proveedor externo de mapas: Mapquest
  • Independencia: datos abiertos, procesados y publicados con software abierto
  • Licencias: El producto necesita poder usarse en muchos entornos
  • Objetivo: mapas en cualquier despliegue y para cualquier usuario

Contexto: Slate, agosto 2016

Elastic Maps Service (EMS)

  • Tile Service
    Mapas base vectoriales y raster
  • File Service
    Límites administrativos
  • Landing Page
    https://maps.elastic.co

Se actualiza sin esperar a las versiones del Stack. EMS Server es la versión sin conexión.

Tile Service: de OSM al mapa

flowchart TB
  A["`OSM planet
  (*cada 3 meses*)`"]
  B["planet.mbtiles"]
  C["TileServer GL + middleware + varnish"]
  D["Kibana"]
  E["Landing Page"]
  
  A --> |Planetiler\nperfil OpenMapTiles| B
  B --> C
  C --> D
  C --> E

Cómo se generan los mapas base

Del planeta de OSM a un fichero por nivel de zoom

Generación del mapa base

  • Un Makefile orquesta la creación de una máquina virtual temporal mediante terraform
    • Instala dependencias
    • Configura monitorización
    • Arranca el proceso automáticamente
  • Un único jar (Planetiler) descarga el planeta de OSM y genera la base de datos SQLite planet.mbtiles
  • Resultado final: Dos snapshots en GCP, uno para el resultado final y otro para las bases de datos intermedias

Wikidata

  • Planetiler obtiene los nombres multilingües de Wikidata
  • Wikidata limita o bloquea las IP de Google Cloud: aplicar una caché
flowchart LR
  A["Planetiler necesita el nombre de un objeto"] --> B{"¿Está en la caché?"}
  B --> C["Sí: usar el nombre guardado"]
  B --> D["No: pedirlo a Wikidata"]
  D --> E["Guardarlo en la caché"]
  E --> C

Un fichero por zoom

Por qué:
Los clientes que usan la versión off-line pueden elegir el nivel de detalle de sus mapas

Cómo:
Se parte del mbtiles completo (zoom 14). Para cada nivel, de 14 a 8:

  1. Se eliminan los datos del nivel superior
  2. Se actualiza maxzoom en los metadatos
  3. Se copia la base de datos y se comprime

Pruebas y despliegue

flowchart LR
  A["Snapshot de disco"] --> B["Prueba en desarrollo"]
  B --> C["Comparar con producción"]
  C --> D["Activar el snapshot"]
  D --> E["Despliegue automático"]
  • Comparación con Maputnik y Maperture
  • Pruebas del planet.mbtiles aislado
  • Pruebas en un despliegue de Tile Service para pruebas
  • El despliegue a producción se lanza al fusionar el cambio en terraform
  • El snapshot anterior se conserva por si hay que volver atrás

Los cinco estilos de EMS

Classic, Light, Dark, Light blue y Dark blue

Atribución y licencias

Ideas a futuro

  • Estilo Stamen Toner: estilo con alto contraste
  • Añadir datos temáticos: para normalizar
  • Point of view maps: soportar fronteras o topónimos en disputa
  • Servir imágenes de satélite
  • Retirar teselas raster
  • PMTiles: simplificar la arquitectura

Recursos

Gracias!

Preguntas ahora, o en la desconferencia de esta tarde
Jorge Sanz · jorge.sanz@elastic.co · Elastic · ela.st/2611-sotmes

Tiempo total: 20 minutos (unos 17 de charla y 3 de preguntas).

Contexto rápido de Elastic. Verificar las cifras antes de la charla.

0:00 a 1:30. Ajustar a tu gusto. No entrar en licencias de producto.

1:30 a 3:00. Lens y el mapa de red de Security aparecen como consumidores en la presentación general de 2026.

3:00 a 4:00. Decir "un incidente en 2016". El nombre interno del incidente no es necesario.

4:00 a 5:30. EMS Server solo se menciona de pasada. Más información: https://www.elastic.co/elastic-maps-service

5:30 a 8:00. No entrar en el detalle de Licensor ni de Varnish. Basta con decir que hay algo de lógica propia por encima. Enlaces: Planetiler https://github.com/onthegomap/planetiler y OpenMapTiles https://github.com/openmaptiles/openmaptiles

8:00 a 9:00. El resultado supera los 60 GB.

9:00 a 10:00. Buena anécdota para asistentes con una situación parecida.

10:00 a 11:30. Estas bases de datos también se ofrecen como descarga para entornos sin conexión.

11:30 a 13:00. Producción se despliega con pipelines de Buildkite tras fusionar el pull request. Si recuperar el estado anterior se necesita por motivos legales o de calidad, el snapshot sigue en GCP.

13:00 a 15:00. Las versiones recientes de Kibana usan Light blue y Dark blue por defecto.

15:00 a 16:30. Explorar las capas en maps.elastic.co.

16:30 a 17:30. Confirmar el último punto antes de la charla. Es una frase mía, no sale de las fuentes.

17:30 a 18:30. Presentar como idea, no como plan. Objetivo: reducir la carga de cómputo pasando a un stack sin TileServer GL. Todavía no es un compromiso, solo una línea de exploración. Si alguien tiene experiencia con PMTiles en producción, invitar a comentarla. Enlace: https://docs.protomaps.com/pmtiles