Visualizando la Maratón Barcelona 2025 como un grafo

 

Recorrido Maratón Barcelona 2025

En Graph Everywhere siempre buscamos formas innovadoras de representar y explorar datos complejos. El pasado 16 de marzo se celebró la Zurich Maratón de Barcelona 2025, y como algunos componentes del equipo participamos en dicha carrera, se nos ocurrió una idea: ¡convertir el recorrido oficial de la maratón en un grafo!

El punto de partida: un archivo GPX

La organización de la maratón publicó el trazado completo en formato GPX. Este archivo contiene una serie de coordenadas GPS (latitud, longitud y elevación) que describen paso a paso el trayecto desde el Passeig de Gràcia hasta el Arc de Triomf, pasando por lugares emblemáticos como la Sagrada Família, el Port Olímpic, el Monument a Colom o la Avinguda Diagonal.

Transformando el recorrido en un grafo

A partir del archivo GPX, extraímos más de mil puntos que conforman el recorrido. Cada uno de estos puntos se transformó en un nodo del grafo en Neo4j, con las siguientes propiedades:

  • latitude
  • longitude
  • elevation

Luego, conectamos cada nodo con el siguiente usando relaciones :SIGUIENTE, que representan el orden del recorrido y contienen una propiedad distancia_m con la distancia en metros entre ambos puntos.

CREATE (p0:Punto {id: 0, latitude: 41.38887, longitude: 2.16922, elevation: 35.86})
CREATE (p1:Punto {id: 1, latitude: 41.38933, longitude: 2.16864, elevation: 35.66})
...
MATCH (a:Punto {id: 0}), (b:Punto {id: 1})
CREATE (a)-[:SIGUIENTE {distancia_m: 60.05}]->(b)
...

Este enfoque no solo permite visualizar el recorrido como una red, sino que abre la puerta a consultas más complejas:

  • ¿Cuál es el tramo más empinado?
  • ¿Dónde hay más curvas cerradas?
  • ¿Cuáles son los segmentos más largos entre puntos?
  • ¿Qué tiempo medio he hecho en cada Km? ¿En cada 10Km?

Consultas útiles:

1. calcular la distancia total recorrida

Una de las consultas más sencillas y reveladoras que podemos hacer es sumar la distancia total entre todos los puntos. Esto se puede hacer fácilmente en Cypher:

MATCH ()-[r:SIGUIENTE]->()
RETURN sum(r.distancia_m) AS distancia_total_metros,
       round(sum(r.distancia_m) / 1000.0, 2) AS distancia_total_km

Este código nos devuelve la distancia total recorrida por el grafo, confirmando que el trazado corresponde a los 42,195 kilómetros de una maratón.

2. ¿Qué tiempo hice?

Siempre hay que estar orgulloso de terminar, pero con qué tiempo lo hice? aquí vemos el Cypher que nos suma el tiempo de todos los tramos. Podría restar el último del primero y hacer lo mismo? sí, pero no sería tan divertido. Ya veis que Cypher nos da muchas posibilidades.

 

MATCH (p1:Punto)-[r:SIGUIENTE]->(p2:Punto)
WITH sum((datetime(p2.timestamp).epochMillis - datetime(p1.timestamp).epochMillis) / 1000.0) AS totalSecs
RETURN totalSecs/3600.0 AS totalHours,
       totalSecs/60.0 AS totalMinutes,
       floor(totalSecs/3600) AS Horas,
       floor(totalSecs%3600/60) AS Minutos,
       floor(totalSecs%3600%60) AS Segundos;

Como veis el total fueron 3h 42m 31s.

╒══════════════════╤══════════════════╤═════╤═══════╤════════╕
│totalHours        │totalMinutes      │Horas│Minutos│Segundos│
╞══════════════════╪══════════════════╪═════╪═══════╪════════╡
│3.7086111111111113│222.51666666666668│3.0  │42.0   │31.0    │
└──────────────────┴──────────────────┴─────┴───────┴────────┘

 

Visualizando el recorrido

Con herramientas como Bloom o Neo4j Browser, podemos ver el recorrido como una línea continua de nodos conectados, y aplicar filtros geoespaciales o de distancia para analizar secciones específicas. Incluso podríamos combinarlo con otros datos: avituallamientos, ubicación de espectadores, o registros en tiempo real de corredores con dispositivos GPS.

Vista del recorrido en Neo4j Browser

Pero lo interesante es poder ver además el recorrido sobre un mapa. Herramientas como Linkurious Enterprise nos lo permiten hacer, como vemos a continuación:

Y si hacemos Zoom en el detalle de la zona de llegada, podemos ver cómo se ven todos los tramos y el contenido de un nodo.

Como vemos cada nodo tiene la información de Latitud, Longitud y Elevación además del TimeStamp del momento en el que se pasó por ese punto.

 

Usando librerías JS

Si lo que queremos es realizar nuestra propia aplicación para visualizar el grafo, podemos usar librerías como Cytoscape, que nos dan muchas posibilidades y muchas de ellas tienen la ventaja de ser gratuitas, pero claro, nos obligan a realizar un desarrollo de código y eso hace que los costes que no pagamos por un lado seguramente los acabamos consumiendo en recursos internos. El resultado es la imagen que vemos al inicio de este artículo.

Aquí os comparto una aplicación que hemos desarrollado usando el framework:

  • Cytoscape: visualización de grafos
  • Leaflet: gestión de mapas
  • Chart: librería para visualizar gráficos

Podéis ver el ejemplo aquí: 👉 Aplicación ejemplo

Como véis tenemos un pequeño gráfico de línea en la parte superior que representa la altimetría de cada punto. Si hacemos click en un punto de la gráfica se nos ilumina el nodo correspondiente en la parte inferior. Los nodos tienen un color distinto según cada tramo de 10Km, y el mapa y el recorrido permiten hacer Zoom y Pan para desplazarnos y ver cada tramo.

Una nueva forma de gestionar rutas

Este experimento con la Maratón de Barcelona 2025 es solo un ejemplo de cómo los grafos pueden ayudarnos a entender mejor recorridos, trayectorias y rutas. Desde visualizaciones urbanas hasta rutas de logística o controles de recorridos en ciberseguridad, la representación en grafos nos permite ver conexiones donde antes solo veíamos listas.

¡Seguimos corriendo con los grafos!

Visita nuestro blog

Share This