Calcul de Distances
Paris-New York : 5 837 km. Mais comment calculer cette distance a partir des coordonnees GPS ? La formule de Pythagore ne fonctionne pas sur une sphere ! Decouvrez la formule de Haversine et implementez votre propre calculateur de distance.
Objectifs du cours
- Calculer la distance entre deux points GPS avec la formule de Haversine
- Comprendre pourquoi Pythagore ne fonctionne pas sur une sphere
- Implementer un calculateur de distance en Python
- Connaitre les approximations et leur precision
- Calculer des distances pour des applications reelles (randonnee, vol)
Erreurs courantes a eviter
- Utiliser la formule de Pythagore pour des distances > quelques km
- Oublier de convertir les degres en radians
- Confondre distance a vol d'oiseau et distance routiere
- Ignorer la courbure de la Terre pour les grandes distances
**Le probleme de la Terre spherique**
Sur une feuille de papier (surface plane), la distance entre deux points est simple : d = sqrt((x2-x1)^2 + (y2-y1)^2)
Mais la Terre est une sphere ! Sur une sphere : - Les lignes droites n'existent pas (on suit la courbure) - La plus courte distance est un "arc de grand cercle" - Les degres de longitude n'ont pas la meme longueur partout
**Exemple concret** :
Paris (48.86 N, 2.35 E) vers New York (40.71 N, 74.01 W)
Avec Pythagore (FAUX) : - Diff latitude : 48.86 - 40.71 = 8.15 degres - Diff longitude : 2.35 - (-74.01) = 76.36 degres - Distance "Pythagore" : sqrt(8.15^2 + 76.36^2) = 76.8 degres - En km (1 deg ~ 111 km) : 8 524 km FAUX !
Avec Haversine (CORRECT) : - Distance reelle : 5 837 km
**Erreur de Pythagore** : +46% !
**Quand peut-on utiliser Pythagore ?**
Pour des distances tres courtes (< 10 km) dans une zone limitee : - GPS dans une ville - Navigation interieure - Drone sur un champ
**Pour les autres cas** : il faut la formule de Haversine.
# Pourquoi Pythagore ne suffit pas sur une sphere
import math
print("=== PYTHAGORE vs HAVERSINE ===\n")
# Coordonnees
paris = {"lat": 48.8566, "lon": 2.3522, "nom": "Paris"}
new_york = {"lat": 40.7128, "lon": -74.0060, "nom": "New York"}
print(f"De : {paris['nom']} ({paris['lat']} N, {paris['lon']} E)")
print(f"A : {new_york['nom']} ({new_york['lat']} N, {new_york['lon']} W)")
# Methode 1 : Pythagore (FAUX pour grandes distances)
print("\n--- Methode Pythagore (plane) ---")
diff_lat = paris['lat'] - new_york['lat']
diff_lon = paris['lon'] - new_york['lon']
distance_degres = math.sqrt(diff_lat**2 + diff_lon**2)
# 1 degre ~ 111 km (approximation)
distance_pythagore = distance_degres * 111
print(f"Difference latitude : {diff_lat:.2f} degres")
print(f"Difference longitude : {diff_lon:.2f} degres")
print(f"Distance 'Pythagore' : {distance_degres:.2f} degres")
print(f"En kilometres : {distance_pythagore:.0f} km")
# Methode 2 : Haversine (CORRECT)
print("\n--- Methode Haversine (spherique) ---")
def haversine(lat1, lon1, lat2, lon2):
R = 6371 # Rayon de la Terre en km
# Conversion en radians
lat1_rad = math.radians(lat1)
lat2_rad = math.radians(lat2)
dlat = math.radians(lat2 - lat1)
dlon = math.radians(lon2 - lon1)
# Formule de Haversine
a = math.sin(dlat/2)**2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon/2)**2
c = 2 * math.asin(math.sqrt(a))
return R * c
distance_haversine = haversine(paris['lat'], paris['lon'],
new_york['lat'], new_york['lon'])
print(f"Distance Haversine : {distance_haversine:.0f} km")
# Comparaison
print("\n--- Comparaison ---")
erreur = (distance_pythagore - distance_haversine) / distance_haversine * 100
print(f"Distance reelle (Haversine) : {distance_haversine:.0f} km")
print(f"Distance Pythagore (fausse) : {distance_pythagore:.0f} km")
print(f"Erreur de Pythagore : +{erreur:.1f}%")
# Ou Pythagore est acceptable
print("\n\n=== QUAND UTILISER PYTHAGORE ? ===\n")
# Pour des distances courtes
tests = [
("Paris - Versailles", 48.8566, 2.3522, 48.8035, 2.1266),
("Paris - Orly", 48.8566, 2.3522, 48.7233, 2.3794),
("Paris - Lyon", 48.8566, 2.3522, 45.7640, 4.8357),
("Paris - Marseille", 48.8566, 2.3522, 43.2965, 5.3698)
]
print(f"{'Trajet':<25} {'Haversine':<12} {'Pythagore':<12} {'Erreur':<10}")
print("-" * 60)
for nom, lat1, lon1, lat2, lon2 in tests:
d_haver = haversine(lat1, lon1, lat2, lon2)
# Pythagore avec correction cos(latitude)
dlat = (lat2 - lat1) * 111 # km
dlon = (lon2 - lon1) * 111 * math.cos(math.radians((lat1+lat2)/2))
d_pyth = math.sqrt(dlat**2 + dlon**2)
erreur = abs(d_haver - d_pyth) / d_haver * 100
print(f"{nom:<25} {d_haver:<12.1f} {d_pyth:<12.1f} {erreur:<10.1f}%")
print("\n=> Pythagore acceptable pour distances < 50 km avec correction cos(lat)")Quiz de validation
1. Pourquoi ne peut-on pas utiliser la formule de Pythagore pour calculer de grandes distances sur Terre ?
2. Quelle est la formule standard pour calculer la distance GPS ?
3. Quel est le rayon moyen de la Terre utilise dans les calculs ?
4. Quelle formule offre la meilleure precision pour les calculs geodesiques ?
5. Quel coefficient approximatif permet d'estimer la distance route a partir de la distance a vol d'oiseau en ville ?
