зеркало из https://github.com/mozilla/gecko-dev.git
59 строки
1.4 KiB
JavaScript
59 строки
1.4 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
const EXPORTED_SYMBOLS = ["LocationHelper"];
|
|
|
|
function isPublic(ap) {
|
|
let mask = "_nomap";
|
|
let result = ap.ssid.indexOf(mask, ap.ssid.length - mask.length);
|
|
return result == -1;
|
|
}
|
|
|
|
function sort(a, b) {
|
|
return b.signal - a.signal;
|
|
}
|
|
|
|
function encode(ap) {
|
|
return { macAddress: ap.mac, signalStrength: ap.signal };
|
|
}
|
|
|
|
/**
|
|
* Shared utility functions for modules dealing with
|
|
* Location Services.
|
|
*/
|
|
|
|
class LocationHelper {
|
|
static formatWifiAccessPoints(accessPoints) {
|
|
return accessPoints
|
|
.filter(isPublic)
|
|
.sort(sort)
|
|
.map(encode);
|
|
}
|
|
|
|
/**
|
|
* Calculate the distance between 2 points using the Haversine formula.
|
|
* https://en.wikipedia.org/wiki/Haversine_formula
|
|
*/
|
|
static distance(p1, p2) {
|
|
let rad = x => (x * Math.PI) / 180;
|
|
// Radius of the earth.
|
|
let R = 6371e3;
|
|
let lat = rad(p2.lat - p1.lat);
|
|
let lng = rad(p2.lng - p1.lng);
|
|
|
|
let a =
|
|
Math.sin(lat / 2) * Math.sin(lat / 2) +
|
|
Math.cos(rad(p1.lat)) *
|
|
Math.cos(rad(p2.lat)) *
|
|
Math.sin(lng / 2) *
|
|
Math.sin(lng / 2);
|
|
|
|
let c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
|
|
return R * c;
|
|
}
|
|
}
|