localisation

Localisation

Nous allons utiliser les cartes proposées par Open Street Map et le langage Python afin de générer des cartes personnalisées. Plus exactement, nous allons utiliser une bibliothèque Python nommée Folium. Une bibliothèque Python permet de rajouter des fonctionnalités au langage de base. Folium va donc nous permettre de créer nos propres cartes à partir des cartes proposées par Open Street Map

À faire vous-même 1

Créez un dossier et nommez-le par exemple "cartoOSM"


À faire vous-même 2

Utilisez le logiciel spyder pour saisir le programme ci-dessous. Le fichier devra être enregistré dans le répertoire créé au "À faire vous-même 1" (le fichier pourra être nommé "carte_1.py").


import folium
c= folium.Map(location=[46.078025, 6.409053])
c.save('maCarte.html')
		

Une fois le code ci-dessus exécuté, rendez-vous dans le répertoire que vous avez créé au "À faire vous-même 1". Vous devriez trouver un fichier "maCarte.html". Double-cliquez sur ce fichier, cela devrait normalement ouvrir un navigateur web : la carte centrée sur la ville de Bonneville est à votre disposition. Notez bien que nous avons une véritable carte et pas une simple image (il est possible de zoomer ou de se déplacer).


Le programme du "À faire vous-même 2" est simple à comprendre :

  • La première ligne : "import folium" permet d'importer la bibliothèque folium afin de pouvoir l'utiliser
  • La deuxième ligne est le coeur de notre programme, nous définissons une variable "c" qui va contenir notre objet carte. "folium.Map(location=[46.078025, 6.409053])" génère cet objet carte, la carte sera centrée sur le point de latitude "46.078025" et de longitude "6.409053". Plus généralement nous avons "folium.Map(location=[latitude, longitude])". Il suffit donc de renseigner la bonne longitude et la bonne latitude pour que la carte soit centrée sur le point désiré.
  • La dernière ligne permet de générer la page HTML qui va permettre d'afficher la carte.

À faire vous-même 3

Modifiez le programme du "À faire vous-même 2" pour qu'il génère une carte centrée sur la ville de votre choix (la longitude et la latitude d'une ville sont facilement trouvables sur le web).


Il est possible d'obtenir un niveau de zoom différent en ajoutant un paramètre "zoom_start"

À faire vous-même 4

Saisissez et testez le programme ci-dessous (si vous désirez garder la carte précédente, n'oubliez pas de modifier la dernière ligne en changeant le nom du fichier HTML généré)


import folium
c= folium.Map(location=[46.078025, 6.409053],zoom_start=15)
c.save('maCarte.html')
		

Plus la valeur de "zoom_start" sera grande et plus le zoom sera important.


Afin de vraiment personnaliser la carte, il est possible d'ajouter des marqueurs sur la carte. Un marqueur sera simplement défini par ses coordonnées (latitude et longitude).

À faire vous-même 5

Saisissez et testez le programme ci-dessous


import folium
c= folium.Map(location=[46.078025, 6.409053],zoom_start=20)
folium.Marker([46.078637266899,  6.4111924884134]).add_to(c)
c.save('maCarte.html')
		

Nous avons uniquement ajouté la ligne "folium.Marker...", il faut juste renseigner les coordonnées souhaitées (ici 46.078637266899 pour la latitude et 6.4111924884134 pour la longitude)


Il est possible d'ajouter plusieurs marqueurs sur une même carte, il suffira d'ajouter autant de ligne "folium.Marker([latitude, longitude]).add_to(c)" que de marqueurs désirés.

Il est possible d'associer une information à un marqueur en ajoutant le paramètre "popup"

À faire vous-même 6

Saisissez et testez le programme ci-dessous


import folium
c= folium.Map(location=[46.078025, 6.409053],zoom_start=20)
folium.Marker([46.078637266899,  6.4111924884134],popup="Lycée G Fichet").add_to(c)
c.save('maCarte.html')
		

Il suffit de cliquer sur le marqueur pour que l'information définie par le paramètre "popup" apparaisse à l'écran (ici en cliquant sur le marqueur nous verrons donc apparaitre "Lycée G Fichet").

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. 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), si cela vous intéresse, pour en savoir plus, vous pouvez visionner cette vidéo.

La bibliothèque Python pyroutelib3 propose des "outils" pour calculer des itinéraires à partir des données d'Open Street Map.

À faire vous-même 1

Créez un dossier, nommé "itin". Enregistrez ensuite le fichier pyroutelib3.py (clic droit, "Enregistrer sous") dans ce dossier "itin".


À faire vous-même 2

En utilisant le logiciel spyder, 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(46.078025, 6.409053)
arrivee = router.findNode(46.193253,  6.234158)
status, route = router.doRoute(depart, arrivee)
if status == 'success':
    routeLatLons = list(map(router.nodeLatLon, route))
			

Une fois l'exécution du programme terminée (cela peut prendre quelques minutes), à l'aide de l'"explorateur de variables" de spyder, visionnez le contenu de la variable "routeLatLons". 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 2" :

  • 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 3

Modifiez le programme du "À faire vous-même 2", pour calculer le trajet entre deux villes de votre choix avec le moyen de transport de votre choix.


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 4

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


from pyroutelib3 import Router
import folium

router = Router("car")
depart = router.findNode(46.078025, 6.409053)
arrivee = router.findNode(46.193253,  6.234158)
status, route = router.doRoute(depart, arrivee)
if status == 'success':
    routeLatLons = list(map(router.nodeLatLon, route))

c= folium.Map(location=[46.078025, 6.409053],zoom_start=10)
for coord in routeLatLons:
    coord=list(coord)
    folium.Marker(coord).add_to(c)
c.save('maCarte.html')
			

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


for coord in routeLatLons:
    coord=list(coord)
    folium.Marker(coord).add_to(c)
			

qui permet de parcourir la liste de coordonnées (contenue dans la variable "routeLatLons") et d'ajouter un marqueur pour chaque couple de coordonnées.

À faire vous-même 5

Modifiez le programme du "À faire vous-même 4" pour qu'apparaisse sur une carte un itinéraire de votre choix (en définissant le point de départ, le point d'arrivée et le type de véhicule).