add initial project files for Flutter app with platform-specific configs and basic routing setup
This commit is contained in:
54
lib/pages/map/routing/osrm_routing_service.dart
Normal file
54
lib/pages/map/routing/osrm_routing_service.dart
Normal file
@@ -0,0 +1,54 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:latlong2/latlong.dart';
|
||||
|
||||
class OsrmRoutingService {
|
||||
const OsrmRoutingService({
|
||||
this.baseUrl = 'https://router.project-osrm.org',
|
||||
this.profile = 'driving',
|
||||
});
|
||||
|
||||
final String baseUrl;
|
||||
final String profile;
|
||||
|
||||
Future<List<LatLng>> fetchRoute(List<LatLng> waypoints) async {
|
||||
if (waypoints.length < 2) {
|
||||
return <LatLng>[];
|
||||
}
|
||||
|
||||
final coordinates = waypoints
|
||||
.map((point) => '${point.longitude},${point.latitude}')
|
||||
.join(';');
|
||||
final uri = Uri.parse(
|
||||
'$baseUrl/route/v1/$profile/$coordinates'
|
||||
'?overview=full&geometries=geojson',
|
||||
);
|
||||
|
||||
final response = await http.get(uri);
|
||||
if (response.statusCode != 200) {
|
||||
throw Exception('Routing request failed (${response.statusCode})');
|
||||
}
|
||||
|
||||
final payload = jsonDecode(response.body) as Map<String, dynamic>;
|
||||
final routes = payload['routes'];
|
||||
if (routes is! List || routes.isEmpty) {
|
||||
throw Exception('No route returned');
|
||||
}
|
||||
|
||||
final geometry = routes.first['geometry'] as Map<String, dynamic>?;
|
||||
final coordinatesList = geometry?['coordinates'];
|
||||
if (coordinatesList is! List || coordinatesList.isEmpty) {
|
||||
throw Exception('Route geometry missing');
|
||||
}
|
||||
|
||||
return coordinatesList.map((pair) {
|
||||
if (pair is! List || pair.length < 2) {
|
||||
throw Exception('Invalid coordinate pair in route geometry');
|
||||
}
|
||||
final lon = (pair[0] as num).toDouble();
|
||||
final lat = (pair[1] as num).toDouble();
|
||||
return LatLng(lat, lon);
|
||||
}).toList();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user