24 lines
773 B
TypeScript
24 lines
773 B
TypeScript
/** 球面距离(米) */
|
|
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`;
|
|
}
|