21 lines
712 B
Dart
21 lines
712 B
Dart
import 'dart:math';
|
|
|
|
const double _earthRadiusKm = 6371;
|
|
|
|
/// Distância em linha reta (km) entre duas coordenadas, pela fórmula de
|
|
/// Haversine — suficiente para ordenar/agrupar consultórios por
|
|
/// proximidade, sem precisar de nenhum pacote de mapas.
|
|
double haversineDistanceKm(double lat1, double lon1, double lat2, double lon2) {
|
|
final dLat = _toRadians(lat2 - lat1);
|
|
final dLon = _toRadians(lon2 - lon1);
|
|
final a = sin(dLat / 2) * sin(dLat / 2) +
|
|
cos(_toRadians(lat1)) *
|
|
cos(_toRadians(lat2)) *
|
|
sin(dLon / 2) *
|
|
sin(dLon / 2);
|
|
final c = 2 * atan2(sqrt(a), sqrt(1 - a));
|
|
return _earthRadiusKm * c;
|
|
}
|
|
|
|
double _toRadians(double degrees) => degrees * pi / 180;
|