Untitled
unknown
dart
a year ago
2.0 kB
6
Indexable
double haversine(double lat1, double lon1, double lat2, double lon2) { // Log the inputs for debugging 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; } double? safeHaversine(double? lat1, double? lon1, double? lat2, double? lon2) { if (lat1 == null || lon1 == null || lat2 == null || lon2 == null) { print('Null latitude/longitude provided'); return null; } return haversine(lat1, lon1, lat2, lon2); } 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) { double? distance = safeHaversine(alert.latitude, alert.longitude, userLatitude, userLongitude); if (distance != null) { distanceMap[alert] = distance; } else { distanceMap[alert] = double.infinity; // Assign a large value for missing data } } // 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