Calculs d’itinéraires

Comme vous avez pu le constater quand vous avez travaillé sur Open Street Map, il est possible de définir les voies de communication (principalement les routes). La base de données OSM contient donc les routes (enfin, la plupart des routes…). En utilisant ces données, il est possible de développer des outils capables de calculer des itinéraires routiers (comme le propose tous les logiciels « GPS » : Waze, ViaMichelin, Mappy…) : vous renseignez votre lieu de départ, votre lieu d’arrivée puis le logiciel calcule votre itinéraire. Ce calcul d’itinéraire repose sur des algorithmes relativement complexes, par exemple l’algorithme de Dijkstra qui permet d’obtenir le plus court chemin entre deux points.

À faire vous-même 1

Sans entrer dans les détails, l’algorithme de Dijkstra travaille sur des graphes (chaque ville est un sommet du graphe et chaque route est une arête du graphe), visionnez cette vidéo pour en savoir plus.

À faire vous-même 2

Expliquez en quelques lignes le principe de l’algorithme de Dijkstra.


La bibliothèque Python pyroutelib3 propose des « outils » pour calculer des itinéraires à partir des données d’Open Street Map. Merci à Mikolaj Kuranowski pour le développement de cette bibliothèque et le support apporté pour l’application suivante.

À faire vous-même 3

Créez dans votre répertoire géolocolisation un dossier, nommé « itin« . Ouvrez ensuite l’éditeur Thonny.

Installer la bibliothèque:

pyroutelib3

Cette instruction permet d’installer la bibliothèque pyroutelib3 et l’utiliser dans le programme ci-dessous.


À faire vous-même 4

En utilisant le logiciel Thonny, saisir le code ci-dessous. Enregistrez le fichier contenant ce code dans le dossier « itin« . Testez ensuite ce programme.


from pyroutelib3 import Router
router = Router("car")
depart = router.findNode(45.24938,4.67202)
arrivee = router.findNode(45.28690,4.72849)
status, route = router.doRoute(depart, arrivee)
if status == 'success':
    routeLatLons = list(map(router.nodeLatLon, route))
print(routeLatLons)
			

Une fois l’exécution du programme terminée (cela peut prendre quelques minutes !!), à l’aide de l' »explorateur de variables » de Thonny, visionnez le contenu des variables . Pour cela, taper le nom de la variable dans la fenêtre de commandes (droite) de l’éditeur Thonny. Comme vous pouvez le constater, cette variable contient une liste de couples de valeurs (latitude, longitude). Cette liste contient donc les coordonnées des différents points par lesquels il faut passer pour se rendre du point de départ jusqu’au point d’arrivée (en passant bien évidemment par les routes définies dans Open Street Map).


Quelques explications sur le programme proposé dans le « À faire vous-même 4 » :

  • Nous commençons par importer la bibliothèque « pyroutelib3 » avec la première ligne « from pyroutelib3 import Router »
  • La deuxième ligne permet de définir le véhicule qui sera utilisé pour effectuer le trajet. Dans notre cas, nous utilisons une voiture (« car« ), mais il est possible de choisir d’autres moyens de transport : cycle, foot, horse, tram, train
  • Les 2 lignes suivantes permettent de définir le point de départ et le point d’arrivée. Nous avons « router.findNode(latitude, longitude)« , il suffit de renseigner la latitude et la longitude du lieu.
  • La ligne « status, route = router.doRoute(depart, arrivee) » permet d’effectuer le calcul de l’itinéraire.
  • La dernière ligne est exécutée uniquement si le calcul est mené à son terme (« if » de la ligne précédente). La variable « routeLatLons » contient la liste des coordonnées des points de cheminement (points qui constituent le chemin entre le point de départ et le point d’arrivée)

À faire vous-même 5

Modifiez le programme du À faire vous-même 4, pour calculer le trajet entre St Félicien (45.0865,4.6276) et La Louvesc (45.1202,4.5343) avec comme moyen de transport le vélo (véhicule = « cycle »).


Avoir une liste de coordonnées, c’est déjà pas mal, mais cette liste n’est pas très exploitable telle quelle. Nous allons donc utiliser ce que nous avons déjà vu précédemment sur la création de cartes.

À faire vous-même 6

Testez le programme ci-dessous (une fois le programme Python exécuté, ouvrez avec un navigateur web le fichier « maCarte_6.html« ).

from pyroutelib3 import Router
import folium

router = Router("car")
depart = router.findNode(45.24938,4.67202)
arrivee = router.findNode(45.28690,4.72849)
status, route = router.doRoute(depart, arrivee)
if status == 'success':
    routeLatLons = list(map(router.nodeLatLon, route))
    
liste_points=[]
c= folium.Map(location=[45.26072, 4.70264],zoom_start=13)
for coord in routeLatLons:
    liste_points.append(coord)
folium.PolyLine(liste_points, color="blue", weight=5, opacity=0.8).add_to(c)
c.save('maCarte_6.html')

Le programme ci-dessous ne devrait pas vous poser trop de problèmes. Seule nouveauté, la boucle « for » :

for coord in routeLatLons:
    liste_points.append(coord)
folium.PolyLine(liste_points, color="blue", weight=5, opacity=0.8).add_to(c)			

qui permet de parcourir la liste de coordonnées (contenue dans la variable « routeLatLons ») et de tracer une ligne bleue entre chaque point de la liste.

Faites une copie d’écran de la carte OSM ainsi créée avec la ligne d’itinéraire. Insérer là dans votre CR.

À faire vous-même 7

Modifiez le programme du À faire vous-même 6 pour qu’apparaisse sur une carte l’itinéraire entre St Félicien et La Louvesc en vélo (cycle).

Faites une copie d’écran de la carte OSM ainsi créée avec la ligne d’itinéraire. Insérer là dans votre CR.