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.

Difficulte:
35 min
+35 XP

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.

Python
# 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 ?

Pixel