Aller au contenu

Recherche d'itinéraire en python

On va voir comment python peut servir à chercher un plus court chemin entre deux coordonnées GPS sur la carte openstreetmap, et comment on peut afficher le résultat.

Préparation : Ouvrez Thonny, allez dans Tools -> Manage Packages et recherchez (ignorez les pop-up d'erreur en cliquant sur Close) :

  • pyroutelib3 et cliquez sur Install
  • urllib3 et cliquez sur ... et dans Desired Version choisissez la 1.26.20 puis installez
  • folium et cliquez sur Install

Exécution

Voici le code à copier, lire puis exécuter :

from pyroutelib3 import Router
import folium

router = Router("foot") # pour se déplacer à pied, "cycle" pour en vélo, "car" en voiture

# on cherche le sommet (Node) le plus près des coordonnées du lycée :
depart = router.findNode(45.179333, 5.731521)
# on cherche le sommet le plus près de la Bastille
arrivee = router.findNode(45.198709, 5.725296)

# puis on utilise la fonction qui va chercher l'itinéraire avec un algorithme similaire à Dijkstra
status, route = router.doRoute(depart, arrivee)

if status == 'success':
    liste_coordonnees = list(map(router.nodeLatLon, route))

# on crée la carte avec la bibliothèque folium
c = folium.Map(location=[45.179333, 5.731521],zoom_start=10)

# et pour chaque coordonnée sur le chemin, on ajoute un marqueur sur la carte
for coord in liste_coordonnees:
    coord=list(coord)
    folium.Marker(coord).add_to(c)

# enfin on enregistre en html, ouvrez ensuite ce fichier pour voir le résultat
c.save('rando_bastille.html')

Conversion DMS (degré minute seconde) et degrés décimaux

Les coordonnées GPS sont données soit : * en degrés décimaux par exemple : 45.179333, 5.731521 (si la latitude est vers le sud, ou la longitude vers l'ouest les nombres seront négatifs) * en degré minute seconde comme : 45°10'46"N, 5°43'54"E où le système est en base 60 : une minute vaut 1/60e de degré et une seconde 1/60e de minute.

DMS -> décimaux

Avec ce qu'on a dit, 49° 25' 56.813” correspond à :

49 + 25/60 + 56.813/(60 * 60) = 49.4324481 °

Dans Thonny, recopiez et complétez la fonction suivante qui prend trois paramètres (le nombre de degrés, minutes, secondes) et renvoie la mesure en décimal. Une fois le code exécuté (avec le bouton play vert) dans la partie du haut de Thonny, testez la fonction en l'appelant dans la console en dessous.

def dms_vers_decimal(degres, minutes, secondes):
    decimal = # mettez la formule ici pour calculer la valeur décimale
    return decimal

puis testez dans la console par exemple dms_vers_decimal(49,25,56.813)

décimaux -> DMS

On souhaite convertir 49.4324481 en degrés minutes et secondes.

On effectue 3 étapes : - Les chiffres avant la virgule sont les degrés (49). - Les chiffres suivant la virgule sont à multiplier par 60. La partie entière définit les minutes : 0.4324481 × 60 = 25.946886 soit 25'. - Les chiffres après la virgule du résultat précédent sont à multiplier par 60 pour obtenir les secondes : 0.946886 × 60 = 56.81316”

Ainsi, 49.4324481° correspond à 49° 25' 56.81316”.

Partie entière et partie décimale en Python

On souhaite extraire la partie entière et la partie décimale de 25.5.

Testez dans la console python les expressions : * int(25.5) * 25.5 % 1

Qu'est-ce qui permet d'obtenir la partie entière ? la partie décimale ?

fonction de conversion

Copiez la fonction dans la partie script de Thonny et complétez-la

def decimal_vers_dms(decimal):
    # compléter pour obtenir les degrés
    degres = 
    # compléter pour le nombre de minutes en décimal
    minutes_decimal = 
    # compléter pour le nombre de minutes (nombre entier)
    minutes = 
    # compléter pour le nombre de secondes
    secondes = 
    return degres, minutes, secondes

Puis testez dans la console les exemples vus au dessus et vérifiez les résultats.