97 lines
3.7 KiB
JavaScript
Executable File
97 lines
3.7 KiB
JavaScript
Executable File
class LibHelper {
|
|
|
|
static EARTH_RADIUS_M = 6371000;
|
|
static EARTH_RADIUS_KM = 6371;
|
|
static EARTH_RADIUS_MILES = 3959; // 3958.756 || 3959 || 3963
|
|
|
|
static setErrMsg(msg) {
|
|
if (process.env.NODE_ENV == 'development') {
|
|
return msg;
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Calculates the great-circle distance between two points, with
|
|
* the Haversine formula.
|
|
* @param float latitudeFrom Latitude of start point in [deg decimal]
|
|
* @param float longitudeFrom Longitude of start point in [deg decimal]
|
|
* @param float latitudeTo Latitude of target point in [deg decimal]
|
|
* @param float longitudeTo Longitude of target point in [deg decimal]
|
|
* @param float earthRadius Mean earth radius in [m]
|
|
* @return float Distance between points in [m] (same as earthRadius)
|
|
* reference: https://stackoverflow.com/questions/14750275/haversine-formula-with-php
|
|
* tolak ukur: tarik garis lurus
|
|
* more accurate using km/meters than miles i think ~ rafifmulia
|
|
*/
|
|
static haversineGreatCircleDistance(latFrom, lngFrom, latTo, lngTo, earthRadius = LibHelper.EARTH_RADIUS_M) {
|
|
// convert from degrees to radians
|
|
let latFromRads = LibHelper.degsToRads(latFrom);
|
|
let lngFromRads = LibHelper.degsToRads(lngFrom);
|
|
let latToRads = LibHelper.degsToRads(latTo);
|
|
let lngToRads = LibHelper.degsToRads(lngTo);
|
|
|
|
let latDelta = latToRads - latFromRads;
|
|
let lngDelta = lngToRads - lngFromRads;
|
|
|
|
let angle = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(latDelta / 2), 2) + Math.cos(latFromRads) * Math.cos(latToRads) * Math.pow(Math.sin(lngDelta / 2), 2)));
|
|
let distance = angle * earthRadius;
|
|
|
|
return distance;
|
|
}
|
|
|
|
// reference: https://www.codegrepper.com/code-examples/javascript/deg2rad+javascript
|
|
// degrees to radians
|
|
static degsToRads(deg) {
|
|
return (deg * Math.PI) / 180.0;
|
|
}
|
|
// radians to degrees
|
|
static radsToDegs(rad) {
|
|
return rad * 180.0 / Math.PI;
|
|
}
|
|
|
|
// round up with precisions digits => 4 == (10000)
|
|
// reference: https://stackoverflow.com/questions/11832914/how-to-round-to-at-most-2-decimal-places-if-necessary
|
|
static milesToKm(miles, precisionDigits = 10000) {
|
|
return Math.round(((miles * 1.609) + Number.EPSILON) * precisionDigits) / precisionDigits;
|
|
}
|
|
static milesToMeters(miles, precisionDigits = 10000) {
|
|
return Math.round(((miles * 1609) + Number.EPSILON) * precisionDigits) / precisionDigits;
|
|
}
|
|
static milesToMiles(meters, precisionDigits = 10000) {
|
|
return Math.round(((meters) + Number.EPSILON) * precisionDigits) / precisionDigits;
|
|
}
|
|
static kmToMiles(km, precisionDigits = 10000) {
|
|
return Math.round(((km / 1.609) + Number.EPSILON) * precisionDigits) / precisionDigits;
|
|
}
|
|
static kmToMeters(km, precisionDigits = 10000) {
|
|
return Math.round(((km * 1000) + Number.EPSILON) * precisionDigits) / precisionDigits;
|
|
}
|
|
static kmToKm(meters, precisionDigits = 10000) {
|
|
return Math.round(((meters) + Number.EPSILON) * precisionDigits) / precisionDigits;
|
|
}
|
|
static metersToKm(meters, precisionDigits = 10000) {
|
|
return Math.round(((meters / 1000) + Number.EPSILON) * precisionDigits) / precisionDigits;
|
|
}
|
|
static metersToMiles(meters, precisionDigits = 10000) {
|
|
return Math.round(((meters / 1609) + Number.EPSILON) * precisionDigits) / precisionDigits;
|
|
}
|
|
static metersToMeters(meters, precisionDigits = 10000) {
|
|
return Math.round(((meters) + Number.EPSILON) * precisionDigits) / precisionDigits;
|
|
}
|
|
|
|
static hex2bin(hex) {
|
|
return ("00000000" + (parseInt(hex, 16)).toString(2)).slice(-8);
|
|
}
|
|
|
|
static splitEvery4Char(str) {
|
|
if (str) {
|
|
str = '' + str;
|
|
let splitEvery4Char = str.match(/.{1,4}/g)
|
|
return splitEvery4Char.join(' ')
|
|
}
|
|
return '';
|
|
}
|
|
};
|
|
|
|
module.exports = LibHelper; |