# Calculating distance between two map points - Haversine functions in JavaScript

Jump to: navigation, search
Article Metadata

Article
Created: Maveric (31 Dec 2010)
Last edited: hamishwillee (05 Dec 2011)

## Overview

With this JavaScript code and modified by your own needs, you should be able to calculate the distance mathematically between two points on a map, using the Haversine formula. The code is an excerpt, so there may be variables that are not needed defined.

## Source file

`// Define variables  var your_longitudes = new Array();  var your_latitudes = new Array();  var R = 6371; // Earth's mean radius in km used by calculateDistance()  var dLat = 0;  var dLon = 0;  var d = 0;  var ylatFirst = "";  var ylatSecond = "";  var ylonFirst =  "";  var ylonSecond = "";  var lat1 = "";  var lat2 = "";  var lon1 = "";  var lon2 = "";  var i = 0;  var z = 0;  ... /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */// extend Number object with methods for converting degrees/radians/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */          Number.prototype.toRad = function() {  // convert degrees to radians	 return this * Math.PI / 180;	 }          Number.prototype.toDeg = function() {  // convert radians to degrees (signed)	 return this * 180 / Math.PI; 	 }         /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */	 // Use Haversine formula to calculate distance (in km) between two points specified by	 // latitude/longitude (in numeric degrees)	 //	 // from: Haversine formula - R. W. Sinnott, "Virtues of the Haversine",	 //       Sky and Telescope, vol 68, no 2, 1984	 //       http://www.census.gov/cgi-bin/geo/gisfaq?Q5.1	 //         /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */           function calculateDistance ()          { 		  dLat = (ylatSecond-ylatFirst).toRad();		  dLon = (ylonSecond-ylonFirst).toRad();       		  ylatFirst_floated = parseFloat(ylatFirst).toRad();		  ylatSecond_floated = parseFloat(ylatSecond).toRad();       		  var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(ylatFirst_floated) * Math.cos(lat2) *                   Math.sin(dLon/2) * Math.sin(dLon/2);		  var c = 2 * Math.asin(Math.sqrt(a));	    	  d = R * c;  // d equals to the distance between the two points in kilometers.          }       ... 	calculateDistance(ylatFirst.parseDeg(), ylonFirst.parseDeg(), ylatSecond.parseDeg(), ylonSecond.parseDeg());    alert('Distance between your points is : '+d+' km.'); 	...        /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */    // extend String object with method for parsing degrees or lat/long values to numeric degrees	//	// this is very flexible on formats, allowing signed decimal degrees, or deg-min-sec suffixed by	// compass direction (NSEW). A variety of separators are accepted (eg 3º 37' 09"W) or fixed-width	// format without separators (eg 0033709W). Seconds and minutes may be omitted. (Minimal validation	// is done).	//    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */ 	String.prototype.parseDeg = function()         {	  if (!isNaN(this)) return Number(this);                    // signed decimal degrees without NSEW	  var degLL = this.replace(/^-/,'').replace(/[NSEW]/i,'');  // strip off any sign or compass dir'n	  var dms = degLL.split(/[^0-9.]+/);                        // split out separate d/m/s	  for (var i in dms) if (dms[i]=='') dms.splice(i,1);       // remove empty elements (see note below)	  switch (dms.length) {                                     // convert to decimal degrees... 	  case 3:                                             // interpret 3-part result as d/m/s          var deg = dms[0]/1 + dms[1]/60 + dms[2]/3600; break;          case 2:                                                         // interpret 2-part result as d/m          var deg = dms[0]/1 + dms[1]/60; break;          case 1:                                                         // decimal or non-separated dddmmss 	  if (/[NS]/i.test(this)) degLL = '0' + degLL;                  // - normalise N/S to 3-digit degrees            var deg = dms[0].slice(0,3)/1 + dms[0].slice(3,5)/60 + dms[0].slice(5)/3600; break;  	    default: return NaN;		  }		  if (/^-/.test(this) || /[WS]/i.test(this)) deg = -deg;            // take '-', west and south as -ve		  return deg;	}	// note: whitespace at start/end will split() into empty elements (except in IE)`
This page was last modified on 5 December 2011, at 05:35.
266 page views in the last 30 days.
Nokia Developer aims to help you create apps and publish them so you can connect with users around the world.