/* * 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; }