Calcul d’une distance entre deux points du Globe à 50 m près (niveau : débutant)
Le but de cet article est de proposer un code capable d’effectuer des calculs plus précis que les SIG (système d’information géographique) habituels comme par exemple Google Earth.
Les formules proposées sont issues du livre de Jean Meeus (astronome belge spécialisé en mécanique céleste et en astronomie mathématique et sphérique).
L'auteur annonce une précision de l'ordre de la cinquantaine de mètres.
Il y a cinq parties :
1.Présentation de l’ouvrage
2. Extraits de l’ouvrage
3. Implémentation en langage python
4. Exemple : distance entre le fort Delgrès et la tour Eiffel
5. Ouvertures
1.Présentation de l’ouvrage
Ce livre est une référence dans les mathématiques associées à l’astronomie. Il m’a été recommandé, il y a quelques années par un responsable de l’IMCCE. La table des matière (ci-dessous) donne une idée de sa richesse.
2. Extraits de l’ouvrage
La précision des calculs vient du fait que les formules tiennent compte de l’aplatissement de la Terre.
Par la suite, on aura (valeurs adoptées par l’Union Astronomique Internationale en 1976) :
- rayon équatorial terrestre a = 6378,14 km
- aplatissement f = 1 / 298,257
3. Implémentation en langage python
from math import sqrt, sin, cos, tan, acos, atan, pi
def saisie(angle,exemple):
h,min,s, pointCard = input("Saisir la "
+ angle + "\nExemple : \nsaisir"
+ exemple).split()
print(angle + " : " + h + "° " + min
+ "' " + s + "\" "+pointCard)
if pointCard == 'O' or pointCard == 'S':
signe = -1
else:
signe = 1
# conversion en radian de l'angle saisi
valeur = (signe * (float(h) + float(min) / 60
+ float(s) / 3600)) * pi / 180
return valeur
#PROGRAMME PRINCIPAL
# Distance entre deux points de la Terre
a = 6378.14 # rayon équatorial
f = 1 / 298.257 # applatissement de la Terre
exempleLat = " 48 50 11 N \npour 48°50'11\"N\n"
exempleLong = " 2 20 14 E \npour 2°20'14\"E\n"
lat1 = saisie("latitude du lieu 1",exempleLat)
long1 = saisie("longitude du lieu 1",exempleLong)
lat2 = saisie("latitude du lieu 2",exempleLat)
long2 = saisie("longitude du lieu 2",exempleLong)
# Variables intermédiares
F = (lat1 + lat2) * 0.5
G = (lat1 - lat2) *0.5
Lambda = (long1 - long2) * 0.5
S = (sin(G) * cos(Lambda)) ** 2 + (cos(F) * sin(Lambda)) ** 2
C = (cos(G) * cos(Lambda)) ** 2 + (sin(F) * sin(Lambda)) ** 2
w = atan(sqrt(S / C))
R = sqrt(S * C) / w
D = 2 * w * a
H1 = (3 * R - 1)/(2 * C)
H2 = (3 * R + 1)/(2 * S)
# Formule
s = D * (1 + f * H1 * (sin(F) * cos(G)) ** 2 - f * H2 * (cos(F) * sin(G)) ** 2)
# Formule rapide
d = acos(sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos((long1 - long2)))
s_approchee = 6371 * d
# Affichage
print(">> s = ",round(s,2),"km","|| s_approchee = ",round(s_approchee,2),"km <<")
print("Ecart",round(abs(s-s_approchee),2),"km")
4. Exemple : distance entre le fort Delgrès et la tour Eiffel
Si on considère le fort Delgrès à Basse Terre et la tour Eiffel à Paris, on obtient :
Données pour le fort Delgrès :
Latitude : 15° 59’ 19’’ N
Longitude : 61° 43’ 23’’ O
Données pour la tour Eiffel :
Latitude : 48° 51’ 30’’ N
Longitude : 2° 17’ 40’’ E
>> s = 6789.83 km
>> s_approchee = 6785.01 km
>> écart 4.82 km
5. Ouvertures
- Comparer les résultats avec ceux des exercices d’enseignement scientifique de première
- Comparer les résultats avec Google Earth
- Chercher des outils sur le web encore plus précis (il existe une bibliothèque python dédiée à ce livre https://pymeeus.readthedocs.io/en/latest/ , mais également d’autres sites proposant des méthodes de calculs plus élaborées, Astropy, libnova ou http://www.movable-type.co.uk/scripts/latlong-vincenty.html par exemple )
- Pour la spécialité NSI, implémenter le code à partir de l’article et améliorer l’interface de saisie