Section courante

A propos

Section administrative du site

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 :

  1. WITH TEXT_IO;
  2.  
  3. PROCEDURE CoordToDelta IS
  4.    
  5.    USE TEXT_IO;   
  6.  
  7.    PI : CONSTANT := 3.1415_92653_58979_32384_62643_38327_95029;
  8.    
  9.    FUNCTION Sqrt(X:in Float) RETURN Float IS
  10.       A,B,M,XN:FLOAT;
  11.    BEGIN
  12.       IF X<=0.0 THEN
  13.          RETURN 0.0;
  14.       ELSE
  15.          M:=1.0;
  16.          XN:=X;
  17.          WHILE XN>=2.0 LOOP
  18.             XN:=0.25*XN;
  19.             M:=2.0*M;
  20.          END LOOP;
  21.          WHILE XN<0.5 LOOP
  22.             XN:=4.0*XN;
  23.             M:=0.5*M;
  24.          END LOOP;
  25.          A:=XN;
  26.          B:=1.0-XN;
  27.          LOOP
  28.             A:=A*(1.0+0.5*B);
  29.             B:=0.25*(3.0+B)*B*B;
  30.             EXIT WHEN B<1.0E-15;
  31.          END LOOP;
  32.          RETURN A*M;
  33.       END IF;
  34.    END;
  35.  
  36.    FUNCTION COS(X:IN Float) RETURN Float IS
  37.       R,S:Float;      
  38.       I:Integer;
  39.    BEGIN
  40.       R:=X*X;
  41.       S:=42.0;
  42.       I:=11;
  43.       WHILE I>=1 LOOP
  44.          S:=4.0*Float(I)-2.0+(-R)/S;
  45.          I:=I-1;
  46.       END LOOP;
  47.       S:=S*S;
  48.       RETURN (S-R)/(S+R);
  49.    END;
  50.  
  51.    FUNCTION SIN(X:IN Float) RETURN Float IS
  52.       R,S:Float;
  53.       I:Integer;
  54.    BEGIN
  55.       R:=X*X;
  56.       S:=42.0;
  57.       I:=11;
  58.       WHILE I>=1 LOOP
  59.          S:=4.0*Float(I)-2.0+(-R)/S;
  60.          I:=I-1;
  61.       END LOOP;
  62.       RETURN 2.0*X*S/(S*S+R);
  63.    END;
  64.  
  65.    FUNCTION ArcTan(X:IN Float) RETURN Float IS
  66.       A,B:Float;
  67.       N:Integer;
  68.    BEGIN
  69.       A := 1.0 / Sqrt(1.0 + (X * X));
  70.       B := 1.0;
  71.  
  72.       N:=1;
  73.       WHILE N<=11 LOOP
  74.          A := (A + B) / 2.0;
  75.          B := Sqrt(A * B);
  76.          N:=N+1;
  77.       END LOOP;
  78.       RETURN X / (Sqrt(1.0 + (X * X)) * A);
  79.    END;
  80.  
  81.    FUNCTION ArcCos(A:IN Float) RETURN Float IS BEGIN      
  82.       IF ABS(A)=1.0 THEN         
  83.          RETURN (1.0-A)*PI/2.0;         
  84.       ELSE         
  85.          RETURN Arctan((-A/Sqrt(1.0-(A*A))))+(2.0*Arctan(1.0));                  
  86.       END IF;            
  87.    END;
  88.    
  89.    FUNCTION CoordToDeltaKm (      
  90.       Q1Latitude,Q1LatiDeg: IN FLOAT; Q1LatiDirection: IN CHARACTER;      
  91.       Q1Longitude,Q1LongDeg: IN FLOAT; Q1LongDirection: IN CHARACTER;      
  92.       Q2Latitude,Q2LatiDeg: IN FLOAT; Q2LatiDirection: IN CHARACTER;      
  93.       Q2Longitude,Q2LongDeg: IN FLOAT; Q2LongDirection: IN CHARACTER         
  94.          ) RETURN FLOAT IS
  95.       A1,B1,A2,B2,RawDelta:FLOAT;      
  96.    BEGIN      
  97.       A1:=(Q1Latitude+(Q1LatiDeg/60.0))*PI/180.0;          
  98.       IF Q1LatiDirection='N'THEN         
  99.          A1:=-A1;         
  100.       END IF;      
  101.       B1:=(Q1Longitude+(Q1LongDeg/60.0))*PI/180.0;      
  102.       IF Q1LongDirection='O'THEN         
  103.          B1:=-B1;                  
  104.       END IF;      
  105.       A2:=(Q2Latitude+(Q2LatiDeg/60.0))*PI/180.0;      
  106.       IF Q2LatiDirection='N'THEN         
  107.          A2:=-A2;         
  108.       END IF;      
  109.       B2:=(Q2Longitude+(Q2LongDeg/60.0))*PI/180.0;      
  110.       IF Q2LongDirection='O'THEN         
  111.          B2:=-B2;         
  112.       END IF;      
  113.       RawDelta:=ARCCOS(COS(A1)*COS(B1)*COS(A2)*COS(B2) +         
  114.          COS(A1)*SIN(B1)*COS(A2)*SIN(B2) + SIN(A1)*SIN(A2));       
  115.       RETURN RawDelta*6378.0;      
  116.    END CoordToDeltaKm;
  117.    
  118.    FUNCTION CoordToDeltaStatuteMiles(      
  119.       Q1Latitude,Q1LatiDeg:IN FLOAT;Q1LatiDirection:IN CHARACTER;      
  120.       Q1Longitude,Q1LongDeg:IN FLOAT;Q1LongDirection:IN CHARACTER;      
  121.       Q2Latitude,Q2LatiDeg:IN FLOAT;Q2LatiDirection:IN CHARACTER;      
  122.       Q2Longitude,Q2LongDeg:IN FLOAT;Q2LongDirection:IN CHARACTER         
  123.          ) RETURN FLOAT IS            
  124.       A1,B1,A2,B2,RawDelta:FLOAT;      
  125.    BEGIN      
  126.       A1:=(Q1Latitude+(Q1LatiDeg/60.0))*PI/180.0;      
  127.       IF Q1LatiDirection='N'THEN         
  128.          A1:=-A1;         
  129.       END IF;      
  130.       B1:=(Q1Longitude+(Q1LongDeg/60.0))*PI/180.0;      
  131.       IF Q1LongDirection='O'THEN         
  132.          B1:=-B1;         
  133.       END IF;      
  134.       A2:=(Q2Latitude+(Q2LatiDeg/60.0))*PI/180.0;          
  135.       IF Q2LatiDirection='N'THEN         
  136.          A2:=-A2;         
  137.       END IF;      
  138.       B2:=(Q2Longitude+(Q2LongDeg/60.0))*PI/180.0;      
  139.       IF Q2LongDirection='O'THEN         
  140.          B2:=-B2;         
  141.       END IF;      
  142.       RawDelta:=ARCCOS(COS(A1)*COS(B1)*COS(A2)*COS(B2) +         
  143.          COS(A1)*SIN(B1)*COS(A2)*SIN(B2) + SIN(A1)*SIN(A2));         
  144.       RETURN RawDelta*3963.1;      
  145.    END CoordToDeltaStatuteMiles;
  146.    
  147.    FUNCTION CoordToDeltaNauticalMiles(      
  148.       Q1Latitude,Q1LatiDeg:IN FLOAT;Q1LatiDirection:IN CHARACTER;      
  149.       Q1Longitude,Q1LongDeg:IN FLOAT;Q1LongDirection:IN CHARACTER;      
  150.       Q2Latitude,Q2LatiDeg:IN FLOAT;Q2LatiDirection:IN CHARACTER;      
  151.       Q2Longitude,Q2LongDeg:IN FLOAT;Q2LongDirection:IN CHARACTER         
  152.          ) RETURN FLOAT IS            
  153.       A1,B1,A2,B2,RawDelta:FLOAT;      
  154.    BEGIN      
  155.       A1:=(Q1Latitude+(Q1LatiDeg/60.0))*PI/180.0;      
  156.       IF Q1LatiDirection='N'THEN         
  157.          A1:=-A1;         
  158.       END IF;      
  159.       B1:=(Q1Longitude+(Q1LongDeg/60.0))*PI/180.0;      
  160.       IF Q1LongDirection='O'THEN         
  161.          B1:=-B1;         
  162.       END IF;      
  163.       A2:=(Q2Latitude+(Q2LatiDeg/60.0))*PI/180.0;      
  164.       IF Q2LatiDirection='N'THEN         
  165.          A2:=-A2;         
  166.       END IF;      
  167.       B2:=(Q2Longitude+(Q2LongDeg/60.0))*PI/180.0;            
  168.       IF Q2LongDirection='O'THEN         
  169.          B2:=-B2;               
  170.       END IF;         
  171.       RawDelta:=ARCCOS(COS(A1)*COS(B1)*COS(A2)*COS(B2) +         
  172.          COS(A1)*SIN(B1)*COS(A2)*SIN(B2) + SIN(A1)*SIN(A2));         
  173.       RETURN RawDelta * 3443.9;         
  174. END CoordToDeltaNauticalMiles;
  175.  
  176. BEGIN
  177.    PUT_LINE("Distance entre Montréal et Paris en Km: " & FLOAT'IMAGE(      
  178.          CoordToDeltaKm(45.0, 31.0,'N',73.0, 34.0,'O',48.0, 50.0,'N', 2.0,  20.0,'E')));         
  179.    PUT_LINE("Distance entre Montréal et Paris en Miles: " & FLOAT'IMAGE(      
  180.          CoordToDeltaStatuteMiles(45.0, 31.0,'N', 73.0, 34.0,'O',    48.0, 50.0,'N', 2.0,  20.0,'E')));         
  181.    PUT_LINE("Distance entre Montréal et Paris en Miles Nautique: " &  FLOAT'IMAGE(      
  182.          CoordToDeltaNauticalMiles(45.0, 31.0,'N', 73.0, 34.0,'O',    48.0, 50.0,'N', 2.0,  20.0,'E')));         
  183. 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 : Samedi, le 25 août 2012