Calcul de distance entre 2 communes ou 2 codes postaux

J’ai rencontré sur un projet le besoin de calculer des distances entre villes, avec interrogation directe de la distance dans une base de données.

Je me suis donc intéressé à l’Orthodromie, qui permet de calculer une distance sur une sphère (en prenant la courbure moyenne de la Terre, car elle n’est pas une sphère parfaite). Le but du projet n’est pas de calculer une distance par la route, mais la distance la plus courte respectant la courbure de la terre.

Wikipedia donne une méthode intéressante (http://fr.wikipedia.org/wiki/Orthodromie) :

Distance orthodromique entre deux points de la surface terrestre

Calculons la distance à vol d’

oiseau entre deux points A et B de la surface terrestre. Sur la sphère le chemin le plus court pour aller du point A au point B consiste à suivre le grand cercle passant par ces points. La plus courte distance de A à B, appelée distance orthodromique, est donc égale à la longueur de l’arc AB sur ce cercle. Un tel chemin représente aussi une géodésique sur la surface. Le principe de calcul de la longueur de cette plus courte route est le suivant. Pour connaître l’arc AB il suffit de déterminer l’angle de sommet O (le centre de la Terre) sous-tendu par le segment AB. On commence par calculer la longueur du segment rectiligne AB (le tunnel en quelque sorte). Puis le sinus de la moitié de l’angle AOB est égal au rapport de AB/2 au rayon de la sphère. On en déduit la valeur de l’angle cherché.

Considérons un repère orthonormé Oxyz. Soient θ et φ les coordonnées angulaires d’un point P sur la sphère (voir la figure), θ étant l’angle entre l’axe Oz et le rayon OP (c’est la colatitude de P : sa latitude estπ/2 – θ) et φ l’angle azimutal, c’est-à-dire l’angle polaire que fait la projection de OP sur le plan xOy avec l’axe Ox.

En prenant le rayon de la sphère pour unité, les coordonnées cartésiennes des points A (point 1) et B (point 2) s’expriment en fonction des coordonnées polaires par les formules classiques

\begin{cases} x_1 =

et

\begin{cases} x_2 =

Le carré de la longueur du segment AB (c’est-à-dire du tunnel virtuel sous Terre) est

{\rm AB}^2 \,=\, (x_2 - x_1)^2 +(y_2 - y_1)^2 + (z_2 -z_1)^2

soit

\mathrm{AB}^2 = 2 \ [1 - \sin\theta_1\sin\theta_2\cos(\varphi_2-\varphi_1) -\cos\theta_1\cos\theta_2 ] \,.

La distance rectiligne h = AB/ 2 représente le sinus de la moitié de l’angle au centre AOB recherché. Autrement dit l’arc AB sur la sphère (de rayon pris pour unité, rappelons-le) est

{\rm arc(AB)} \,=\, 2\ \arcsin h

où h est défini par son carré

h^2\,=\, (1/2)\,[1 - \sin\theta_1\sin\theta_2\cos(\varphi_2-\varphi_1) -\cos\theta_1\cos\theta_2 ]\,.

Pour simplifier cette relation on part de

\cos2u \,=\, 1 -2 \sin^2 u

qui entraîne

\cos(2\ \arcsin h)\,=\, 1 - 2\sin^2(\arcsin h)

soit

\cos(2\ \arcsin h) \,=\,1 - 2h^2 \,.

En inversant cette dernière formule nous obtenons

2\ \arcsin h \,=\, \arccos(1-2h^2) \,.

et l’expression de l’arc AB devient (toujours sur une sphère de rayon unité)

\mathrm{arc(AB)} \,=\, \arccos\ [\sin\theta_1 \sin\theta_2 \cos(\varphi_2-\varphi_1) + \cos\theta_1\cos\theta_2]\,.

Sur Terre on repère un point par sa latitude et sa longitude. La latitude lat est le complément à π / 2 de la colatitude θ, ce qui veut dire que

lat\, = \, \pi/2 - \theta\,.

En notant R le rayon terrestre (soit 6 378 kilomètres, rayon équatorial moyen) et en notant long la différence de longitude (ϕ2 – ϕ1) entre les deux points, nous obtenons la formule finale donnant la distance orthodromique entre les points A et B de latitude lat1 et lat2 et de différence de longitude long comme :

\mathrm{arc(AB)}\, =\, R \times \arccos\  [\cos(\lambda_1)\cos(\lambda_2)\cos(\varphi) + \sin(\lambda_1)\sin(\lambda_2)] \,.

En W-langage cela donne :
Distance = Round(6371 * ArcCosinusR( (CosR(Latitude1) *
CosR(Latitude2) * CosR(Longitude2-Longitude1)) +
(SinR(Latitude1) * SinR(Latitude2)) ), 1)

L’exemple WinDev s’appuie sur des données fournies par l’INSEE, qui donnent la latitude/longitude pour chaque commune/code postal. Au premier lancement, une fichier Hyperfile est initialisé et utilisé pour effectuer les calculs.

Exemple de calcul :

Exemple_WinDev_-_Calcul_de_la_Distance_entre_2_villes_par_orthodromie.png

Le code source (format WInDev 11, migrable facilement dans les versions postérieures) est ici : orthodromie_windev.zip

Les commentaires sont fermés.