60 lines
1.8 KiB
JavaScript
60 lines
1.8 KiB
JavaScript
/**
|
|
* Contians utility functions for calculating values on geometries
|
|
* @module geomutils
|
|
**/
|
|
|
|
//File for geom utils
|
|
if (!Number.prototype.toRad) {
|
|
Number.prototype.toRad = function() {
|
|
return this * Math.PI / 180;
|
|
};
|
|
|
|
}
|
|
|
|
var greatCircleRadius = {
|
|
miles: 3956,
|
|
km: 6367
|
|
};
|
|
|
|
/**
|
|
* Calculates the distance between the two points using the haversine method.
|
|
* @param {number} lat1 The latitude of the first point.
|
|
* @param {number} lon1 The longtitude of the first point.
|
|
* @param {number} lat2 The latitude of the first point.
|
|
* @param {number} lon2 The longtitude of the first point.
|
|
* @returns {number} The distance in miles between the two points.
|
|
**/
|
|
exports.calculateDistance = function(lat1, lon1, lat2, lon2) {
|
|
var dLat = (lat2 - lat1).toRad(),
|
|
dLon = (lon2 - lon1).toRad();
|
|
|
|
lat1 = lat1.toRad();
|
|
lat2 = lat2.toRad();
|
|
|
|
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));
|
|
return greatCircleRadius.km * c;
|
|
};
|
|
|
|
/**
|
|
* Calcuates the midpoint between the two points passed in.
|
|
* @param {number} lat1 The latitude of the first point.
|
|
* @param {number} lon1 The longtitude of the first point.
|
|
* @param {number} lat2 The latitude of the first point.
|
|
* @param {number} lon2 The longtitude of the first point.
|
|
*/
|
|
exports.calculateMidpoint = function(lat1, lon1, lat2, lon2) {
|
|
var dLat = (lat2 - lat1).toRad(),
|
|
dLon = (lon2 - lon1).toRad();
|
|
|
|
lat1 = lat1.toRad();
|
|
lat2 = lat2.toRad();
|
|
|
|
var Bx = Math.cos(lat2) * Math.cos(dLon);
|
|
var By = Math.cos(lat2) * Math.sin(dLon);
|
|
var lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2),
|
|
Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By));
|
|
var lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx);
|
|
};
|