@lipagas/ember-core
Version:
Provides all the core services, decorators and utilities for building a Fleetbase extension for the Console.
60 lines (49 loc) • 2.01 kB
JavaScript
var haversine = (function () {
var RADII = {
km: 6371,
mile: 3960,
meter: 6371000,
nmi: 3440,
};
// convert to radians
var toRad = function (num) {
return (num * Math.PI) / 180;
};
// convert coordinates to standard format based on the passed format option
var convertCoordinates = function (format, coordinates) {
switch (format) {
case '[lat,lon]':
return { latitude: coordinates[0], longitude: coordinates[1] };
case '[lon,lat]':
return { latitude: coordinates[1], longitude: coordinates[0] };
case '{lon,lat}':
return { latitude: coordinates.lat, longitude: coordinates.lon };
case '{lat,lng}':
return { latitude: coordinates.lat, longitude: coordinates.lng };
case 'geojson':
return {
latitude: coordinates.geometry.coordinates[1],
longitude: coordinates.geometry.coordinates[0],
};
default:
return coordinates;
}
};
return function haversine(startCoordinates, endCoordinates, options) {
options = options || {};
var R = options.unit in RADII ? RADII[options.unit] : RADII.km;
var start = convertCoordinates(options.format, startCoordinates);
var end = convertCoordinates(options.format, endCoordinates);
var dLat = toRad(end.latitude - start.latitude);
var dLon = toRad(end.longitude - start.longitude);
var lat1 = toRad(start.latitude);
var lat2 = toRad(end.latitude);
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
if (options.threshold) {
return options.threshold > R * c;
}
return R * c;
};
})();
export default haversine;