Cálculo de rutas - TeamSecurityFirst/GeoGuardianWiki GitHub Wiki
En un principio, ibamos a delegar la funcionalidad del cálculo de tiempo y distancia de nuestras rutas a los servicios de Google Maps. Sin embargo, viendo que el servicio se había vuelvo de pago, tuvimos que barajar otras opciones.
En un primer momento pensamos en calcular la distancia euclídea entre los puntos que indicase el usuario (su ubicación actual y el punto de destino). Este método no era nada eficaz, sobre todo en ciudades, ya que la línea recta casi nunca es una opción para el desplazamiento.
Al final nos decidimos por emplear OSRM (Open Source Routing Machine) para el cálculo de las mismas. La hemos considerado la implementación más estable dentro que estaba a nuestro alcance.
Con el procedimiento aquí descrito se pueden arrancar una o varias instancias de Open Street Routing Machine para realizar cálculos sobre rutas del mundo real.
El procedimiento requiere de una máquina Linux con docker instalado. Además, es necesario tener instalado docker-compose o, en su defecto, portainer, como microservicio ejecutándose en un contenedor.
Se requiere indicar las instrucciones a seguir para crear y preparar los archivos de mapa necesarios. En este caso, crea 3 perfiles (andando, bici y coche) para el mapa de España, debido a que indicar un territorio superior, consumía demasiados recursos y tiempo (necesitamos el cálculo de las rutas de manera inmediata). Para ampliar esta información se puede acceder aquí. A pesar de tener una exactitud muy adecuada, desde nuestro backend hemos incluido un delay de seguridad al tiempo del desplazamiento, aumentando un 20% el valor a la duración de la ruta que este servicio nos devuelve.
El flujo de creación y cálculo de rutas comienza en el cliente, cuando el usuario quiere crear una ruta. Esto se hará cuando interaccione con la barra de búsqueda y selecciona una localización.
Esta ruta se registrará en la pantalla de usuario, estando disponible para activarse en cualquier momento.
Cuando los usuarios quieran activarla, se mostrará un diálogo diciéndole que seleccione el método de desplazamiento. A nuestro backend, se hará una llamada con argumentos la localización de la ruta, y el método de desplazamiento (andando, en bici o en coche).
De esta manera, la ruta quedará activa. En nuestro servidor se registrará una task en Django lista para ejecutarse en el tiempo estimado por nuestra entidad OSRM. Si el id con la geofence creada en la ruta avisa de que el usuario ha entrado en su destino, esta tarea se desactivará. Por el contrario, si llega al tiempo establecido y no ha recibido este aviso, se hará una llamada a la notificación de todos los métodos de notificación los seguidores del usuario.
Por último, se ha incluído un Handler de espera desde el cliente en cuanto se activa una ruta. De esta manera, se espera la respuesta del servidor que se ha calculado de manera correcta, junto con el tiempo estimado para ella. Los usuarios podrán consultar en todo momento cual es el tiempo de duración de la misma.