Skip to content

Instantly share code, notes, and snippets.

@maxlawton
Created August 21, 2014 00:30
Show Gist options
  • Save maxlawton/c4a2c8903f79c56c9d45 to your computer and use it in GitHub Desktop.
Save maxlawton/c4a2c8903f79c56c9d45 to your computer and use it in GitHub Desktop.
Functions for computing geographical distances
var GeoDistance = (function () {
var _d = {};
// Earth Radius, in Miles
_d.RADIUS = 3958.7615;
_d.RAD_LAT = 3963.1906;
_d.RAD_LNG = 3949.9028;
_d.rad = function ( x ) {
return ( x * ( Math.PI / 180 ) );
}
var _rad = _d.rad;
//------------------------------------------------------------------------
// haversine
_d.haversine = function ( lat1, lng1, lat2, lng2 ) {
var R = _d.RADIUS;
var pLat1 = _rad( lat1 ),
pLat2 = _rad( lat2 ),
dLat = _rad( lat2 - lat1 ),
dLng = _rad( lng2 - lng1 );
var a = ( Math.sin( dLat / 2 ) * Math.sin( dLat / 2 ) +
Math.cos( pLat1 ) * Math.cos( pLat2 ) *
Math.sin( dLng / 2 ) * Math.sin( dLng / 2 ) );
var c = 2 * Math.atan2( Math.sqrt( a ), Math.sqrt( 1 - a ) );
var d = R * c;
return d;
}
//------------------------------------------------------------------------
// law of cosines
_d.cosines = function ( lat1, lng1, lat2, lng2 ) {
var R = _d.RADIUS,
pLat1 = _rad( lat1 ),
pLat2 = _rad( lat2 ),
dLng = _rad( lng2 - lng1 );
var c = Math.acos( Math.sin( pLat1 ) * Math.sin( pLat2 ) +
Math.cos( pLat1 ) * Math.cos( pLat2 ) *
Math.cos( dLng ) );
var d = c * R;
return d;
}
//========================================================================
// google SQL example
_d.haversql = function ( lat1, lng1, lat2, lng2 ) {
return ( _d.RADIUS *
Math.acos( Math.cos( _rad( lat2 ) ) *
Math.cos( _rad( lat1 ) ) *
Math.cos( _rad( lng1 ) - _rad( lng2 ) ) +
Math.sin( _rad( lat2 ) ) *
Math.sin( _rad( lat1 ) ) ) );
}
//------------------------------------------------------------------------
// google example, with asin
_d.ahaversine = function ( lat1, lng1, lat2, lng2 ) {
var R = _d.RADIUS;
var pLat1 = _rad( lat1 ),
pLat2 = _rad( lat2 ),
dLat = _rad( lat2 - lat1 ),
dLng = _rad( lng2 - lng1 );
var a = ( Math.sin( dLat / 2 ) * Math.sin( dLat / 2 ) +
Math.cos( pLat1 ) * Math.cos( pLat2 ) *
Math.sin( dLng / 2 ) * Math.sin( dLng / 2 ) );
var c = 2 * Math.asin( Math.sqrt( a ) );
var d = R * c;
return d;
}
//========================================================================
// export
return _d;
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment