@openhps/core
Version:
Open Hybrid Positioning System - Core component
79 lines • 2.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CHEBYSHEV = exports.CANBERRA = exports.MANHATTAN = exports.EUCLIDEAN = exports.HAVERSINE = void 0;
const unit_1 = require("./unit");
/**
* Haversine formulate to calculate distance of two geographical points
* @param {number[]} pointA Point A
* @param {number[]} pointB Point B
* @returns {number} distance
*/
function HAVERSINE(pointA, pointB) {
const latRadA = unit_1.AngleUnit.DEGREE.convert(pointA[1], unit_1.AngleUnit.RADIAN);
const latRadB = unit_1.AngleUnit.DEGREE.convert(pointB[1], unit_1.AngleUnit.RADIAN);
const deltaLat = unit_1.AngleUnit.DEGREE.convert(pointB[1] - pointA[1], unit_1.AngleUnit.RADIAN);
const deltaLon = unit_1.AngleUnit.DEGREE.convert(pointB[0] - pointA[0], unit_1.AngleUnit.RADIAN);
const a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) +
Math.cos(latRadA) * Math.cos(latRadB) * Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return unit_1.GCS.EARTH_RADIUS_MEAN * c;
}
exports.HAVERSINE = HAVERSINE;
/**
* Euclidean distance function
* @param {number[]} pointA n-dimensional point
* @param {number[]} pointB n-dimensional point
* @returns {number} distance
*/
function EUCLIDEAN(pointA, pointB) {
let distance = 0;
for (let i = 0; i < pointA.length; i++) {
distance += Math.pow(pointA[i] - pointB[i], 2);
}
distance = Math.sqrt(distance);
return distance;
}
exports.EUCLIDEAN = EUCLIDEAN;
/**
* Manhattan distance function
* @param {number[]} pointA n-dimensional point
* @param {number[]} pointB n-dimensional point
* @returns {number} distance
*/
function MANHATTAN(pointA, pointB) {
let distance = 0;
for (let i = 0; i < pointA.length; i++) {
distance += Math.abs(pointA[i] - pointB[i]);
}
return distance;
}
exports.MANHATTAN = MANHATTAN;
/**
* Canberra distance function
* @param {number[]} pointA n-dimensional point
* @param {number[]} pointB n-dimensional point
* @returns {number} distance
*/
function CANBERRA(pointA, pointB) {
let distance = 0;
for (let i = 0; i < pointA.length; i++) {
distance += Math.abs(pointA[i] - pointB[i]) / (Math.abs(pointA[i]) + Math.abs(pointB[i]));
}
return distance;
}
exports.CANBERRA = CANBERRA;
/**
* Chebyshev distance function
* @param {number[]} pointA n-dimensional point
* @param {number[]} pointB n-dimensional point
* @returns {number} distance
*/
function CHEBYSHEV(pointA, pointB) {
let maxDistance = 0;
for (let i = 0; i < pointA.length; i++) {
maxDistance = Math.max(maxDistance, Math.abs(pointA[i] - pointB[i]));
}
return maxDistance;
}
exports.CHEBYSHEV = CHEBYSHEV;
//# sourceMappingURL=DistanceFunction.js.map