Untitled

 avatar
unknown
dart
a year ago
1.5 kB
6
Indexable
double haversine(double lat1, double lon1, double lat2, double lon2) {
  print('Calculating distance from ($lat1, $lon1) to ($lat2, $lon2)');

  double dlon = _degreesToRadians(lon2 - lon1);
  double dlat = _degreesToRadians(lat2 - lat1);
  double a = pow(sin(dlat / 2), 2) + cos(_degreesToRadians(lat1)) * cos(_degreesToRadians(lat2)) * pow(sin(dlon / 2), 2);
  double c = 2 * atan2(sqrt(a), sqrt(1 - a));
  double r = 6371.0;  // Radius of the Earth in kilometers
  double distance = c * r * 1000;  // Convert to meters
  print('Computed distance: $distance meters');
  return distance;
}

List<Alert> sortAlertsBySeverityAndDistance(List<Alert> alerts, double userLatitude, double userLongitude) {
  // Calculate distance once and store it in a map to avoid recalculating
  Map<Alert, double> distanceMap = {};
  for (var alert in alerts) {
    distanceMap[alert] = haversine(alert.latitude, alert.longitude, userLatitude, userLongitude);
  }

  // Sort by severity
  alerts.sort((a, b) => compareAlertLevels(a.severity, b.severity));

  // Further sort each severity level by distance using precomputed distances
  Map<String, List<Alert>> groupedBySeverity = {};
  for (var alert in alerts) {
    groupedBySeverity.putIfAbsent(alert.severity, () => []).add(alert);
  }

  List<Alert> sortedAlerts = [];
  groupedBySeverity.forEach((severity, group) {
    group.sort((a, b) => distanceMap[a].compareTo(distanceMap[b]));
    sortedAlerts.addAll(group);
  });

  return sortedAlerts;
}
Editor is loading...
Leave a Comment