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 Ada suivant, vous trouvez la réponse que vous souhaitez :
- WITH TEXT_IO;
-
- PROCEDURE CoordToDelta IS
-
- USE TEXT_IO;
-
- PI : CONSTANT := 3.1415_92653_58979_32384_62643_38327_95029;
-
- FUNCTION Sqrt(X:in Float) RETURN Float IS
- A,B,M,XN:FLOAT;
- BEGIN
- IF X<=0.0 THEN
- RETURN 0.0;
- ELSE
- M:=1.0;
- XN:=X;
- WHILE XN>=2.0 LOOP
- XN:=0.25*XN;
- M:=2.0*M;
- END LOOP;
- WHILE XN<0.5 LOOP
- XN:=4.0*XN;
- M:=0.5*M;
- END LOOP;
- A:=XN;
- B:=1.0-XN;
- LOOP
- A:=A*(1.0+0.5*B);
- B:=0.25*(3.0+B)*B*B;
- EXIT WHEN B<1.0E-15;
- END LOOP;
- RETURN A*M;
- END IF;
- END;
-
- FUNCTION COS(X:IN Float) RETURN Float IS
- R,S:Float;
- I:Integer;
- BEGIN
- R:=X*X;
- S:=42.0;
- I:=11;
- WHILE I>=1 LOOP
- S:=4.0*Float(I)-2.0+(-R)/S;
- I:=I-1;
- END LOOP;
- S:=S*S;
- RETURN (S-R)/(S+R);
- END;
-
- FUNCTION SIN(X:IN Float) RETURN Float IS
- R,S:Float;
- I:Integer;
- BEGIN
- R:=X*X;
- S:=42.0;
- I:=11;
- WHILE I>=1 LOOP
- S:=4.0*Float(I)-2.0+(-R)/S;
- I:=I-1;
- END LOOP;
- RETURN 2.0*X*S/(S*S+R);
- END;
-
- FUNCTION ArcTan(X:IN Float) RETURN Float IS
- A,B:Float;
- N:Integer;
- BEGIN
- A := 1.0 / Sqrt(1.0 + (X * X));
- B := 1.0;
-
- N:=1;
- WHILE N<=11 LOOP
- A := (A + B) / 2.0;
- B := Sqrt(A * B);
- N:=N+1;
- END LOOP;
- RETURN X / (Sqrt(1.0 + (X * X)) * A);
- END;
-
- FUNCTION ArcCos(A:IN Float) RETURN Float IS BEGIN
- IF ABS(A)=1.0 THEN
- RETURN (1.0-A)*PI/2.0;
- ELSE
- RETURN Arctan((-A/Sqrt(1.0-(A*A))))+(2.0*Arctan(1.0));
- END IF;
- END;
-
- FUNCTION CoordToDeltaKm (
- Q1Latitude,Q1LatiDeg: IN FLOAT; Q1LatiDirection: IN CHARACTER;
- Q1Longitude,Q1LongDeg: IN FLOAT; Q1LongDirection: IN CHARACTER;
- Q2Latitude,Q2LatiDeg: IN FLOAT; Q2LatiDirection: IN CHARACTER;
- Q2Longitude,Q2LongDeg: IN FLOAT; Q2LongDirection: IN CHARACTER
- ) RETURN FLOAT IS
- A1,B1,A2,B2,RawDelta:FLOAT;
- BEGIN
- A1:=(Q1Latitude+(Q1LatiDeg/60.0))*PI/180.0;
- IF Q1LatiDirection='N'THEN
- A1:=-A1;
- END IF;
- B1:=(Q1Longitude+(Q1LongDeg/60.0))*PI/180.0;
- IF Q1LongDirection='O'THEN
- B1:=-B1;
- END IF;
- A2:=(Q2Latitude+(Q2LatiDeg/60.0))*PI/180.0;
- IF Q2LatiDirection='N'THEN
- A2:=-A2;
- END IF;
- B2:=(Q2Longitude+(Q2LongDeg/60.0))*PI/180.0;
- IF Q2LongDirection='O'THEN
- B2:=-B2;
- END IF;
- RawDelta:=ARCCOS(COS(A1)*COS(B1)*COS(A2)*COS(B2) +
- COS(A1)*SIN(B1)*COS(A2)*SIN(B2) + SIN(A1)*SIN(A2));
- RETURN RawDelta*6378.0;
- END CoordToDeltaKm;
-
- FUNCTION CoordToDeltaStatuteMiles(
- Q1Latitude,Q1LatiDeg:IN FLOAT;Q1LatiDirection:IN CHARACTER;
- Q1Longitude,Q1LongDeg:IN FLOAT;Q1LongDirection:IN CHARACTER;
- Q2Latitude,Q2LatiDeg:IN FLOAT;Q2LatiDirection:IN CHARACTER;
- Q2Longitude,Q2LongDeg:IN FLOAT;Q2LongDirection:IN CHARACTER
- ) RETURN FLOAT IS
- A1,B1,A2,B2,RawDelta:FLOAT;
- BEGIN
- A1:=(Q1Latitude+(Q1LatiDeg/60.0))*PI/180.0;
- IF Q1LatiDirection='N'THEN
- A1:=-A1;
- END IF;
- B1:=(Q1Longitude+(Q1LongDeg/60.0))*PI/180.0;
- IF Q1LongDirection='O'THEN
- B1:=-B1;
- END IF;
- A2:=(Q2Latitude+(Q2LatiDeg/60.0))*PI/180.0;
- IF Q2LatiDirection='N'THEN
- A2:=-A2;
- END IF;
- B2:=(Q2Longitude+(Q2LongDeg/60.0))*PI/180.0;
- IF Q2LongDirection='O'THEN
- B2:=-B2;
- END IF;
- RawDelta:=ARCCOS(COS(A1)*COS(B1)*COS(A2)*COS(B2) +
- COS(A1)*SIN(B1)*COS(A2)*SIN(B2) + SIN(A1)*SIN(A2));
- RETURN RawDelta*3963.1;
- END CoordToDeltaStatuteMiles;
-
- FUNCTION CoordToDeltaNauticalMiles(
- Q1Latitude,Q1LatiDeg:IN FLOAT;Q1LatiDirection:IN CHARACTER;
- Q1Longitude,Q1LongDeg:IN FLOAT;Q1LongDirection:IN CHARACTER;
- Q2Latitude,Q2LatiDeg:IN FLOAT;Q2LatiDirection:IN CHARACTER;
- Q2Longitude,Q2LongDeg:IN FLOAT;Q2LongDirection:IN CHARACTER
- ) RETURN FLOAT IS
- A1,B1,A2,B2,RawDelta:FLOAT;
- BEGIN
- A1:=(Q1Latitude+(Q1LatiDeg/60.0))*PI/180.0;
- IF Q1LatiDirection='N'THEN
- A1:=-A1;
- END IF;
- B1:=(Q1Longitude+(Q1LongDeg/60.0))*PI/180.0;
- IF Q1LongDirection='O'THEN
- B1:=-B1;
- END IF;
- A2:=(Q2Latitude+(Q2LatiDeg/60.0))*PI/180.0;
- IF Q2LatiDirection='N'THEN
- A2:=-A2;
- END IF;
- B2:=(Q2Longitude+(Q2LongDeg/60.0))*PI/180.0;
- IF Q2LongDirection='O'THEN
- B2:=-B2;
- END IF;
- RawDelta:=ARCCOS(COS(A1)*COS(B1)*COS(A2)*COS(B2) +
- COS(A1)*SIN(B1)*COS(A2)*SIN(B2) + SIN(A1)*SIN(A2));
- RETURN RawDelta * 3443.9;
- END CoordToDeltaNauticalMiles;
-
- BEGIN
- PUT_LINE("Distance entre Montréal et Paris en Km: " & FLOAT'IMAGE(
- CoordToDeltaKm(45.0, 31.0,'N',73.0, 34.0,'O',48.0, 50.0,'N', 2.0, 20.0,'E')));
- PUT_LINE("Distance entre Montréal et Paris en Miles: " & FLOAT'IMAGE(
- CoordToDeltaStatuteMiles(45.0, 31.0,'N', 73.0, 34.0,'O', 48.0, 50.0,'N', 2.0, 20.0,'E')));
- PUT_LINE("Distance entre Montréal et Paris en Miles Nautique: " & FLOAT'IMAGE(
- CoordToDeltaNauticalMiles(45.0, 31.0,'N', 73.0, 34.0,'O', 48.0, 50.0,'N', 2.0, 20.0,'E')));
- 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 25 août 2012