simplegeoloc
Version:
SimpleGeoLoc simple items with geolocation, near items function
49 lines (36 loc) • 1.21 kB
JavaScript
EarthRadius = 6371; // km
function haversine(lat1, lon1, lat2, lon2) { // degrees
var dLat = toRadians(lat2-lat1);
var dLon = toRadians(lon2-lon1);
var lat1 = toRadians(lat1);
var lat2 = toRadians(lat2);
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));
var d = EarthRadius * c;
return d;
}
function toRadians(degrees) {
return degrees * (Math.PI / 180);
}
function Store() {
var data = [];
this.add = function (latitude, longitude, item) {
data.push([latitude, longitude, item]);
};
this.near = function (latitude, longitude, radius) {
var result = [];
data.forEach(function (datum) {
var distance = haversine(latitude, longitude, datum[0], datum[1]);
if (Math.abs(distance) <= radius)
result.push({ latitude: datum[0], longitude: datum[1], item: datum[2] });
});
return result;
};
}
function createStore() {
return new Store();
}
module.exports = {
createStore: createStore
};