L'une des opérations les plus courantes en géographie, en navigation, en cartographie et dans les systèmes informatiques modernes consiste à calculer la distance séparant deux points à la surface de la Terre. Cette problématique est aujourd'hui omniprésente, que ce soit dans les systèmes GPS, les applications de cartographie en ligne, les logiciels de planification d'itinéraires, les outils météorologiques ou encore les systèmes de suivi de véhicules et d'aéronefs. Bien que le calcul puisse sembler complexe à première vue, il repose sur quelques principes mathématiques relativement simples faisant intervenir les coordonnées géographiques de latitude et de longitude.
Contrairement à ce que l'on pourrait croire, il n'est pas nécessaire d'être un expert en trigonométrie sphérique pour effectuer ce type de calcul. Une fois les coordonnées connues, il suffit de les convertir dans un format exploitable par les fonctions mathématiques du langage de programmation afin d'obtenir la distance séparant deux lieux. Selon les besoins, cette distance peut être exprimée en kilomètres, en miles terrestres ou encore en miles nautiques, ces derniers étant particulièrement utilisés dans les domaines de la navigation maritime et aérienne. Cette flexibilité permet d'adapter les résultats à différents contextes professionnels ou scientifiques.
Prenons comme exemple deux villes bien connues situées sur des continents différents : Montréal, au Canada, et Paris, en France :
| Ville | Latitude | Longitude |
|---|---|---|
| Montréal | 45 31N | 73 34O |
| Paris | 48 50N | 2 20E |
En utilisant leurs coordonnées géographiques respectives, il devient possible de calculer avec précision la distance qui les sépare en tenant compte de la courbure terrestre. Le programme C++ présenté ci-dessous effectue automatiquement les conversions nécessaires et applique les formules trigonométriques appropriées afin de déterminer cette distance dans plusieurs unités de mesure. Les résultats obtenus permettent ainsi de comparer directement la distance entre ces deux métropoles en kilomètres, en miles terrestres et en miles nautiques :
Essayer maintenant !
- #include <cmath>
- #include <iostream>
-
- #define M_PI 3.14159265358979224
-
- double CoordToDeltaKm(
- double Q1Latitude,double Q1LatiDeg, char Q1LatiDirection,
- double Q1Longitude,double Q1LongDeg, char Q1LongDirection,
- double Q2Latitude,double Q2LatiDeg, char Q2LatiDirection,
- double Q2Longitude,double Q2LongDeg, char Q2LongDirection
- ) {
- double a1,b1,a2,b2,RawDelta;
- a1=(Q1Latitude+(Q1LatiDeg/60))*M_PI/180;
- if(Q1LatiDirection=='N') a1=-a1;
- b1=(Q1Longitude+(Q1LongDeg/60))*M_PI/180;
- if(Q1LongDirection=='O') b1=-b1;
- a2=(Q2Latitude+(Q2LatiDeg/60))*M_PI/180;
- if(Q2LatiDirection=='N') a2=-a2;
- b2=(Q2Longitude+(Q2LongDeg/60))*M_PI/180;
- if(Q2LongDirection=='O') b2=-b2;
- RawDelta = acos(cos(a1)*cos(b1)*cos(a2)*cos(b2) + cos(a1)*sin(b1)*cos(a2)*sin(b2) + sin(a1)*sin(a2));
- return RawDelta * 6378.0;
- }
-
- double CoordToDeltaStatuteMiles(
- double Q1Latitude,double Q1LatiDeg, char Q1LatiDirection,
- double Q1Longitude,double Q1LongDeg, char Q1LongDirection,
- double Q2Latitude,double Q2LatiDeg, char Q2LatiDirection,
- double Q2Longitude,double Q2LongDeg, char Q2LongDirection
- ) {
- double a1,b1,a2,b2,RawDelta;
- a1=(Q1Latitude+(Q1LatiDeg/60))*M_PI/180;
- if(Q1LatiDirection=='N') a1=-a1;
- b1=(Q1Longitude+(Q1LongDeg/60))*M_PI/180;
- if(Q1LongDirection=='O') b1=-b1;
- a2=(Q2Latitude+(Q2LatiDeg/60))*M_PI/180;
- if(Q2LatiDirection=='N') a2=-a2;
- b2=(Q2Longitude+(Q2LongDeg/60))*M_PI/180;
- if(Q2LongDirection=='O') b2=-b2;
- RawDelta = acos(cos(a1)*cos(b1)*cos(a2)*cos(b2) + cos(a1)*sin(b1)*cos(a2)*sin(b2) + sin(a1)*sin(a2));
- return RawDelta * 3963.1;
- }
-
- double CoordToDeltaNauticalMiles(
- double Q1Latitude,double Q1LatiDeg, char Q1LatiDirection,
- double Q1Longitude,double Q1LongDeg, char Q1LongDirection,
- double Q2Latitude,double Q2LatiDeg, char Q2LatiDirection,
- double Q2Longitude,double Q2LongDeg, char Q2LongDirection
- ) {
- double a1,b1,a2,b2,RawDelta;
- a1=(Q1Latitude+(Q1LatiDeg/60))*M_PI/180;
- if(Q1LatiDirection=='N') a1=-a1;
- b1=(Q1Longitude+(Q1LongDeg/60))*M_PI/180;
- if(Q1LongDirection=='O') b1=-b1;
- a2=(Q2Latitude+(Q2LatiDeg/60))*M_PI/180;
- if(Q2LatiDirection=='N') a2=-a2;
- b2=(Q2Longitude+(Q2LongDeg/60))*M_PI/180;
- if(Q2LongDirection=='O') b2=-b2;
- RawDelta = acos(cos(a1)*cos(b1)*cos(a2)*cos(b2) + cos(a1)*sin(b1)*cos(a2)*sin(b2) + sin(a1)*sin(a2));
- return RawDelta * 3443.9;
- }
-
- int main() {
- std::cout << "Distance entre Montreal et Paris en Km: " <<
- CoordToDeltaKm(45, 31,'N', 73, 34,'O', 48, 50,'N', 2, 20,'E') << std::endl;
- std::cout << "Distance entre Montreal et Paris en Miles: " <<
- CoordToDeltaStatuteMiles(45, 31,'N', 73, 34,'O', 48, 50,'N', 2, 20,'E') << std::endl;
- std::cout << "Distance entre Montreal et Paris en Miles Nautique: " <<
- CoordToDeltaNauticalMiles(45, 31,'N', 73, 34,'O', 48, 50,'N', 2, 20,'E') << std::endl;
- return 0;
- }
on obtiendra le résultat suivant :
Distance entre Montréal et Paris en Km: 5510.16761889Distance entre Montréal et Paris en Miles: 3423.85470217
Distance entre Montréal et Paris en Miles Nautique: 2975.30044884