@openhps/core
Version:
Open Hybrid Positioning System - Core component
69 lines • 2.33 kB
JavaScript
import { AngleUnit, GCS } from './unit';
/**
* Haversine formulate to calculate distance of two geographical points
* @param {number[]} pointA Point A
* @param {number[]} pointB Point B
* @returns {number} distance
*/
export function HAVERSINE(pointA, pointB) {
const latRadA = AngleUnit.DEGREE.convert(pointA[1], AngleUnit.RADIAN);
const latRadB = AngleUnit.DEGREE.convert(pointB[1], AngleUnit.RADIAN);
const deltaLat = AngleUnit.DEGREE.convert(pointB[1] - pointA[1], AngleUnit.RADIAN);
const deltaLon = AngleUnit.DEGREE.convert(pointB[0] - pointA[0], 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 GCS.EARTH_RADIUS_MEAN * c;
}
/**
* Euclidean distance function
* @param {number[]} pointA n-dimensional point
* @param {number[]} pointB n-dimensional point
* @returns {number} distance
*/
export 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;
}
/**
* Manhattan distance function
* @param {number[]} pointA n-dimensional point
* @param {number[]} pointB n-dimensional point
* @returns {number} distance
*/
export function MANHATTAN(pointA, pointB) {
let distance = 0;
for (let i = 0; i < pointA.length; i++) {
distance += Math.abs(pointA[i] - pointB[i]);
}
return distance;
}
/**
* Canberra distance function
* @param {number[]} pointA n-dimensional point
* @param {number[]} pointB n-dimensional point
* @returns {number} distance
*/
export 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;
}
/**
* Chebyshev distance function
* @param {number[]} pointA n-dimensional point
* @param {number[]} pointB n-dimensional point
* @returns {number} distance
*/
export 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;
}