81 lines
2.4 KiB
Dart
81 lines
2.4 KiB
Dart
import 'road_alert_models.dart';
|
|
import 'road_alert_provider_interface.dart';
|
|
import 'us_speed_camera_database.dart';
|
|
|
|
class OsmRoadAlertProvider implements RoadAlertProvider {
|
|
final UsSpeedCameraDatabase _database;
|
|
|
|
OsmRoadAlertProvider({UsSpeedCameraDatabase? database})
|
|
: _database = database ?? UsSpeedCameraDatabase.instance;
|
|
|
|
@override
|
|
String get id => 'osm_us_cameras';
|
|
|
|
@override
|
|
String get name => 'US Speed Cameras (Offline OSM)';
|
|
|
|
@override
|
|
Set<RoadAlertCategory> get supportedCategories => const {
|
|
RoadAlertCategory.speedCamera,
|
|
RoadAlertCategory.police,
|
|
};
|
|
|
|
@override
|
|
Future<RoadAlertProviderStatus> testConnection(String apiKey) async {
|
|
// Offline local database is always available and connected
|
|
return RoadAlertProviderStatus.connected;
|
|
}
|
|
|
|
@override
|
|
Future<List<RoadAlert>> getAlerts({
|
|
required double latitude,
|
|
required double longitude,
|
|
required double radiusMeters,
|
|
String? apiKey,
|
|
}) async {
|
|
if (!_database.isInitialized) {
|
|
await _database.initialize();
|
|
}
|
|
|
|
final cameras = _database.findCamerasNear(
|
|
latitude: latitude,
|
|
longitude: longitude,
|
|
radiusMeters: radiusMeters,
|
|
);
|
|
|
|
final now = DateTime.now();
|
|
|
|
return cameras.map((camera) {
|
|
final isPoliceTrap = camera.type == 'speed_trap';
|
|
final category = isPoliceTrap
|
|
? RoadAlertCategory.police
|
|
: RoadAlertCategory.speedCamera;
|
|
|
|
final description = isPoliceTrap
|
|
? 'Speed enforcement checkpoint (${camera.speedLimitMph != null ? "${camera.speedLimitMph} MPH" : "Patrol"})'
|
|
: (camera.speedLimitMph != null
|
|
? 'Speed camera ahead (${camera.speedLimitMph} MPH limit)'
|
|
: 'Speed enforcement camera ahead');
|
|
|
|
return RoadAlert(
|
|
id: camera.id,
|
|
providerId: id,
|
|
category: category,
|
|
latitude: camera.latitude,
|
|
longitude: camera.longitude,
|
|
heading: camera.direction,
|
|
roadName: camera.roadName,
|
|
description: description,
|
|
reportedAt: DateTime(2026, 1, 1),
|
|
expiresAt: null, // Fixed infrastructure does not expire
|
|
lastUpdated: now,
|
|
confidence: 0.98,
|
|
severity: RoadAlertSeverity.high,
|
|
source: 'OpenStreetMap US',
|
|
sourceType: RoadAlertSourceType.providerReported,
|
|
distanceFromUser: camera.distanceMeters,
|
|
);
|
|
}).toList();
|
|
}
|
|
}
|