Calculate Distance
Calculate straight-line distance between two points using the Haversine formula
Source Code
const [point1, point2, unit = "km"] = process.argv.slice(2);
if (!point1 || !point2) {
console.error("Error: both point1 and point2 are required");
console.error("Format: lat,lon (e.g., '40.7128,-74.0060')");
process.exit(1);
}
// Parse coordinate string to lat/lon
function parseCoordinates(str) {
const coordPattern = /^(-?\d+\.?\d*),\s*(-?\d+\.?\d*)$/;
const match = str.trim().match(coordPattern);
if (!match) {
throw new Error(`Invalid coordinate format: "${str}". Expected: lat,lon`);
}
return {
lat: parseFloat(match[1]),
lon: parseFloat(match[2]),
};
}
// Convert degrees to radians
function toRadians(degrees) {
return degrees * (Math.PI / 180);
}
// Haversine formula for great-circle distance
function haversineDistance(lat1, lon1, lat2, lon2) {
const R_KM = 6371; // Earth's radius in kilometers
const dLat = toRadians(lat2 - lat1);
const dLon = toRadians(lon2 - lon1);
const a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(toRadians(lat1)) *
Math.cos(toRadians(lat2)) *
Math.sin(dLon / 2) *
Math.sin(dLon / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return R_KM * c;
}
async function main() {
const p1 = parseCoordinates(point1);
const p2 = parseCoordinates(point2);
console.log(`Point 1: ${p1.lat}, ${p1.lon}`);
console.log(`Point 2: ${p2.lat}, ${p2.lon}`);
const distanceKm = haversineDistance(p1.lat, p1.lon, p2.lat, p2.lon);
let distance, unitLabel;
if (unit === "miles") {
distance = distanceKm * 0.621371;
unitLabel = "miles";
} else {
distance = distanceKm;
unitLabel = "km";
}
// Round to reasonable precision
const rounded = distance < 1 ? distance.toFixed(3) : distance.toFixed(2);
console.log(`Distance: ${rounded} ${unitLabel}`);
console.log(
JSON.stringify({
success: true,
point1: p1,
point2: p2,
distance: parseFloat(rounded),
unit: unitLabel,
distanceKm: parseFloat(distanceKm.toFixed(3)),
})
);
}
main().catch((err) => {
console.error("Calculation failed:", err.message);
process.exit(1);
});