Une des fonctions les plus communes de la géographie et des systèmes modernes, c'est le calcul de la distance géographique entre deux coordonnées de Longitude et de Latitude. Il n'y a aucune nécessité de grande connaissance en trigonométrie pour arriver à se genre de calcul dans le format qu'on le souhaite, Km, Miles ou Miles Nautiques. Ainsi, si vous savez les coordonnées suivantes :
Ville | Latitude | Longitude |
---|---|---|
Montréal | 45 31N | 73 34O |
Paris | 48 50N | 2 20E |
A l'aide du code source Oberon suivant pour le Oxford Oberon-2 Compiler, vous trouvez la réponse que vous souhaitez :
MODULE coordtodelta;
IMPORT Math,Out;
PROCEDURE ArcCos(a:REAL):REAL;
BEGIN
IF ABS(a)=1.0 THEN
RETURN (1-a)*Math.pi/2.0;
ELSE
RETURN Math.Arctan(-a/Math.Sqrt(1-a*a))+2*Math.Arctan(1);
END;
END ArcCos;
PROCEDURE CoordToDeltaKm(
Q1Latitude,Q1LatiDeg:REAL;Q1LatiDirection:CHAR;
Q1Longitude,Q1LongDeg:REAL;Q1LongDirection:CHAR;
Q2Latitude,Q2LatiDeg:REAL;Q2LatiDirection:CHAR;
Q2Longitude,Q2LongDeg:REAL;Q2LongDirection:CHAR
):REAL;
VAR
a1,b1,a2,b2,RawDelta:REAL;
BEGIN
a1:=(Q1Latitude+(Q1LatiDeg/60))*Math.pi/180;
IF Q1LatiDirection = 'N'THEN
a1:=-a1;
END;
b1:=(Q1Longitude+(Q1LongDeg/60))*Math.pi/180;
IF Q1LongDirection = 'O'THEN
b1:=-b1;
END;
a2:=(Q2Latitude+(Q2LatiDeg/60))*Math.pi/180;
IF Q2LatiDirection = 'N'THEN
a2:=-a2;
END;
b2:=(Q2Longitude+(Q2LongDeg/60))*Math.pi/180;
IF Q2LongDirection = 'O'THEN
b2:=-b2;
END;
RawDelta := ArcCos(Math.Cos(a1)*Math.Cos(b1)*Math.Cos(a2)*Math.Cos(b2) + Math.Cos(a1)*Math.Sin(b1)*Math.Cos(a2)*Math.Sin(b2) + Math.Sin(a1)*Math.Sin(a2));
RETURN RawDelta * 6378.0;
END CoordToDeltaKm;
PROCEDURE CoordToDeltaStatuteMiles(
Q1Latitude,Q1LatiDeg:REAL;Q1LatiDirection:CHAR;
Q1Longitude,Q1LongDeg:REAL;Q1LongDirection:CHAR;
Q2Latitude,Q2LatiDeg:REAL;Q2LatiDirection:CHAR;
Q2Longitude,Q2LongDeg:REAL;Q2LongDirection:CHAR
):REAL;
VAR
a1,b1,a2,b2,RawDelta:REAL;
BEGIN
a1:=(Q1Latitude+(Q1LatiDeg/60))*Math.pi/180;
IF Q1LatiDirection = 'N'THEN
a1:=-a1;
END;
b1:=(Q1Longitude+(Q1LongDeg/60))*Math.pi/180;
IF Q1LongDirection = 'O'THEN
b1:=-b1;
END;
a2:=(Q2Latitude+(Q2LatiDeg/60))*Math.pi/180;
IF Q2LatiDirection = 'N'THEN
a2:=-a2;
END;
b2:=(Q2Longitude+(Q2LongDeg/60))*Math.pi/180;
IF Q2LongDirection = 'O'THEN
b2:=-b2;
END;
RawDelta := ArcCos(Math.Cos(a1)*Math.Cos(b1)*Math.Cos(a2)*Math.Cos(b2) + Math.Cos(a1)*Math.Sin(b1)*Math.Cos(a2)*Math.Sin(b2) + Math.Sin(a1)*Math.Sin(a2));
RETURN RawDelta * 3963.1;
END CoordToDeltaStatuteMiles;
PROCEDURE CoordToDeltaNauticalMiles(
Q1Latitude,Q1LatiDeg:REAL;Q1LatiDirection:CHAR;
Q1Longitude,Q1LongDeg:REAL;Q1LongDirection:CHAR;
Q2Latitude,Q2LatiDeg:REAL;Q2LatiDirection:CHAR;
Q2Longitude,Q2LongDeg:REAL;Q2LongDirection:CHAR
):REAL;
VAR
a1,b1,a2,b2,RawDelta:REAL;
BEGIN
a1:=(Q1Latitude+(Q1LatiDeg/60))*Math.pi/180;
IF Q1LatiDirection = 'N'THEN
a1:=-a1;
END;
b1:=(Q1Longitude+(Q1LongDeg/60))*Math.pi/180;
IF Q1LongDirection = 'O'THEN
b1:=-b1;
END;
a2:=(Q2Latitude+(Q2LatiDeg/60))*Math.pi/180;
IF Q2LatiDirection = 'N'THEN
a2:=-a2;
END;
b2:=(Q2Longitude+(Q2LongDeg/60))*Math.pi/180;
IF Q2LongDirection = 'O'THEN
b2:=-b2;
END;
RawDelta := ArcCos(Math.Cos(a1)*Math.Cos(b1)*Math.Cos(a2)*Math.Cos(b2) + Math.Cos(a1)*Math.Sin(b1)*Math.Cos(a2)*Math.Sin(b2) + Math.Sin(a1)*Math.Sin(a2));
RETURN RawDelta * 3443.9;
END CoordToDeltaNauticalMiles;
BEGIN
Out.String("Distance entre Montréal et Paris en Km: ");
Out.Real(CoordToDeltaKm(45, 31,'N',73, 34,'O',48, 50,'N', 2, 20,'E'));
Out.Ln;
Out.String("Distance entre Montréal et Paris en Miles: ");
Out.Real(CoordToDeltaStatuteMiles(45, 31,'N', 73, 34,'O', 48, 50,'N', 2, 20,'E'));
Out.Ln;
Out.String("Distance entre Montréal et Paris en Miles Nautique: ");
Out.Real(CoordToDeltaNauticalMiles(45, 31,'N', 73, 34,'O', 48, 50,'N', 2, 20,'E'));
Out.Ln;
END coordtodelta.
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
Dernière mise à jour : Samedi, le 7 avril 2018