mirror of
https://github.com/orangecoding/fredy.git
synced 2026-06-16 12:31:07 +00:00
* migra for distance * adding distance calculator * adding ability to store home address * improve distance calculation * calculating distance * show distance in grid view * upgrading dependencies * moving to react 19 * ability to clone a job * fixing tests * polishing
36 lines
1.2 KiB
JavaScript
36 lines
1.2 KiB
JavaScript
/*
|
|
* Copyright (c) 2026 by Christian Kellner.
|
|
* Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause
|
|
*/
|
|
|
|
const R = 6371000; // Earth radius in meters
|
|
/**
|
|
* Calculate the great-circle distance between two points on Earth using the Haversine formula.
|
|
* This is to calculate the distance between the listing address & the address provided by the user. I know, it is only
|
|
* a rough estimation as this calculates the distance as a straight line, but it's more convenient than using an external
|
|
* service and still gives a good approximation for sorting purposes.
|
|
* Returns distance in meters.
|
|
*
|
|
* @param {number} lat1
|
|
* @param {number} lon1
|
|
* @param {number} lat2
|
|
* @param {number} lon2
|
|
* @returns {number}
|
|
*/
|
|
export function distanceMeters(lat1, lon1, lat2, lon2) {
|
|
const toRad = (deg) => (deg * Math.PI) / 180;
|
|
|
|
const phi1 = toRad(lat1);
|
|
const phi2 = toRad(lat2);
|
|
const dPhi = toRad(lat2 - lat1);
|
|
const dLambda = toRad(lon2 - lon1);
|
|
|
|
const a =
|
|
Math.sin(dPhi / 2) * Math.sin(dPhi / 2) +
|
|
Math.cos(phi1) * Math.cos(phi2) * Math.sin(dLambda / 2) * Math.sin(dLambda / 2);
|
|
|
|
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
|
|
return Math.round(R * c * 10) / 10;
|
|
}
|