Gladir.com - Oberon - Calcul la distance entre deux coordonnées de Longitude et Latitude


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éss 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.16761889
Distance entre Montréal et Paris en Miles: 3423.85470217
Distance entre Montréal et Paris en Miles Nautique: 2975.30044884


Dernière mise à jour: Mardi, le 7 février 2006