title: Distance between two gps coordinates - javascript
body: <p>I am searching to know the concept behind this since last month and till now I got these resources</p>
  
  <ol>
  <li><a href="https://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude-longitude-points">How do I calculate distance between two latitude-longitude points?</a></li>
  <li><a href="http://www.manuel-bieh.de/publikationen/scripts/geolib/demo.html" rel="nofollow noreferrer">geolib.js</a></li>
  <li><a href="https://stackoverflow.com/questions/18883601/function-to-calculate-distance-between-two-coordinates-shows-wrong">Function to calculate distance between two coordinates shows wrong</a></li>
  <li><a href="http://www.movable-type.co.uk/scripts/latlong.html" rel="nofollow noreferrer">Calculate distance, bearing and more between Latitude/Longitude points</a></li>
  </ol>
  
  <p><strong>But I still can't figure out the right distance between specified coordinates</strong></p>
  
  <p>As an instance, I have two coordinates</p>
  
  <p>Start lat: 26.26594
  Start long: 78.2095508
  Destination lat: 21.24386
  Destination long: 81.611</p>
  
  <p>and I got the result as 655.358 KM, but actually (I had measured it using my bike's odometer) those are just ~3 KM far, then why I am getting this answer.</p>
  
  <p>I had even checked for my implementation on that geolib.js (2nd item I have specified in the list items), it is also showing the same result (655.358).</p>
  
  <p>I can't figure it out</p>
  
  <p>JS</p>
  
  <pre><code>// initialising the distance calculation
  
  function geoLocationInit() {
          $('.fd-loc-err').html(''); // empty the error shown, if there is any already
          $('.fd-dist-rest-user').html('&lt;img src="/images/loader.gif" alt="loading"/&gt;'); // loader
          var options = {timeout:120000};
          if (navigator.geolocation) {
              navigator.geolocation.watchPosition(getLocation, gotError, options);
          }
          else {
              locationError = 'Your Browser does not support geolocation';
              showLocationError(locationError);
          }
      }
  
  
  
  //finding the coordinates of user
  
  function getLocation(current) {
          var userLat = current.coords.latitude, userLong = current.coords.longitude;
          var distance = getDistance(userLat, userLong, restLatitude, restLongitude);
          $('.fd-dist-rest-user').html('~' + (distance/1000).toFixed(2) + ' km away'); // fd-dist-rest-user is the &lt;div&gt; tag where i have show the distance calculated
      }
  
  
      function toRad(value) {
          return value * Math.PI / 180;
      }
  
  
      // calculating distance using Vincenty Formula
      function getDistance(lat1, lon1, lat2, lon2) {
          var a = 6378137, b = 6356752.314245,  f = 1/298.257223563;
          var L = toRad(lon2-lon1);
          var U1 = Math.atan((1-f) * Math.tan(toRad(lat1)));
          var U2 = Math.atan((1-f) * Math.tan(toRad(lat2)));
          var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);
          var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);
  
          var lambda = L, lambdaP, iterLimit = 100;
          do 
          {
              var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);
              var sinSigma = Math.sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
              if (sinSigma==0) return 0;
  
              var cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda;
              var sigma = Math.atan2(sinSigma, cosSigma);
              var sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
              var cosSqAlpha = 1 - sinAlpha*sinAlpha;
              var cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha;
              if (isNaN(cos2SigmaM)) cos2SigmaM = 0;
              var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
              lambdaP = lambda;
              lambda = L + (1-C) * f * sinAlpha * (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
          } while (Math.abs(lambda-lambdaP) &gt; 1e-12 &amp;&amp; --iterLimit&gt;0);
  
          if (iterLimit==0) return NaN
  
          var uSq = cosSqAlpha * (a*a - b*b) / (b*b);
          var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
          var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
          var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
          var s = b*A*(sigma-deltaSigma);
          return s;
      }
  
  
  // Error handling for the geolocation
  
      function gotError(error) {
          switch(error.code) {
              case 1: 
                  locationError = 'You need to give the permission to use your location to calculate the distances between this restaurant and you &lt;button class="btn btn-danger fd-detect-lctn-try-agn"&gt;Please try again&lt;/button&gt;';
                  break;
              case 2:
                  locationError = 'TIME OUT - You need to give permission to use your location to show the distance of this restaurant from your current position &lt;button class="btn btn-danger fd-detect-lctn-try-agn"&gt;Please try again&lt;/button&gt;';
                  break;
              case 3:
                  locationError = 'It took to long getting your position, &lt;button class="btn btn-danger fd-detect-lctn"&gt;Please try again&lt;/button&gt;';
                  break;
              default:
                  locationError = 'An unknown error has occurred, &lt;button class="btn btn-danger fd-detect-lctn"&gt;Please try again&lt;/button&gt;';
          }
          showLocationError(locationError);
      }
  
      function showLocationError(msg) {
          $('.fd-loc-err').html(msg);
          $('.fd-dist-rest-user').html('');
      }
  </code></pre>
  
  <p><strong>I am getting the latitude and longitude from my database then calling the geoLocationInit function on a button click (below is the following code)</strong></p>
  
  <pre><code>restLongitude = response['longitude'];
  restLatitude = response['latitude'];
  geoLocationInit(); /* getting location initialisation */
  </code></pre>