code icon Code

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);
});