/** 球面距离(米) */ export function haversineMeters( lat1: number, lng1: number, lat2: number, lng2: number, ): number { const toRad = (d: number) => (d * Math.PI) / 180; const R = 6371000; const dLat = toRad(lat2 - lat1); const dLng = toRad(lng2 - lng1); const a = Math.sin(dLat / 2) ** 2 + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLng / 2) ** 2; return 2 * R * Math.asin(Math.min(1, Math.sqrt(a))); } export function formatDistanceMeters(meters: number | null | undefined): string { if (meters == null || !Number.isFinite(meters) || meters < 0) return '—'; if (meters < 1000) return `${Math.max(1, Math.round(meters))}m`; const km = meters / 1000; return `${km < 10 ? km.toFixed(1) : Math.round(km)}km`; }