Comment calculer le cap entre 2 positions géographiques en JavaScript ?

Réponses rédigées par Antoine
Dernière mise à jour : 2019-12-03 18:30:27
Thèmes : cap - distance - calcul - javascript
Question

Bonjour, Sur cette page, vous répondez à la question :

Comment calculer la distance entre deux points GPS latitude et longitude en JavaScript ?

https://www.collaborativejob.com/2417/comment-calculer-distance-latitude-longitude-javascript

A cette formule, je souhaiterais pouvoir calculer un cap à suivre entre ces 2 points. Le calcul du cap est différent en fonction de l'éloignement de ces 2 points, car la terre est ronde ! Mais je souhaiterais pouvoir très simplement calculer ce cap sur 2 points qui ne seront pas éloignés de plus de 100km l'un de l'autre (donc en projection plate).

Réponse

Bonjour, en me basant sur l'une de mes précédentes réponses qui concernait le calcul d'un Azimut en PHP, j'ai adapté les fonctions et la formule à JavaScript.

Dans l'exemple ci-dessous on calcule donc le cap entre Paris et Marseille, et ce en utilisant uniquement JavaScript.

<script>
function radians_to_degrees(radians)
{
  var pi = Math.PI;
  return radians * (180/pi);
}

function degrees_to_radians(degrees)
{
  var pi = Math.PI;
  return degrees * (pi/180);
}

function getCardinaux(degrees) {
   var tmp = Math.round(degrees/ 22.5);
   switch(tmp) {
      case 1:
         var direction = "NNE";
         break;
      case 2:
         var direction = "NE";
         break;
      case 3:
         var direction = "ENE";
         break;
      case 4:
         var direction = "E";
         break;
      case 5:
         var direction = "ESE";
         break;
      case 6:
         var direction = "SE";
         break;
      case 7:
         var direction = "SSE";
         break;
      case 8:
         var direction = "S";
         break;
      case 9:
         var direction = "SSW";
         break;
      case 10:
         var direction = "SW";
         break;
      case 11:
         var direction = "WSW";
         break;
      case 12:
         var direction = "W";
         break;
      case 13:
         var direction = "WNW";
         break;
      case 14:
         var direction = "NW";
         break;
      case 15:
         var direction = "NNW";
         break;
      default:
         var direction = "N";
   }
   return direction;
}

var lat_depart = 48.864716;
var lng_depart = 2.349014;
var lat_arrivee = 43.296398;
var lng_arrivee = 5.370000;			
var degres = (radians_to_degrees(Math.atan2(Math.sin(degrees_to_radians(lng_arrivee) - degrees_to_radians(lng_depart)) * Math.cos(degrees_to_radians(lat_arrivee)), Math.cos(degrees_to_radians(lat_depart)) * Math.sin(degrees_to_radians(lat_arrivee)) - Math.sin(degrees_to_radians(lat_depart)) * Math.cos(degrees_to_radians(lat_arrivee)) * Math.cos(degrees_to_radians(lng_arrivee) - degrees_to_radians(lng_depart)))) + 360) % 360;		
var degres = Math.ceil(degres * 100) / 100;

alert("Cap " + degres + " " + getCardinaux(degres));
</script>