import 'dart:convert'; import 'dart:io'; // Test la route Saint-Martin -> Paris (autoroute avec péage) // Pour vérifier que la polyline longue se décode correctement en Dart void main() async { final envFile = File('functions/.env'); final lines = await envFile.readAsLines(); String apiKey = ''; for (var line in lines) { if (line.startsWith('API_MAPS=')) { apiKey = line.split('=')[1].replaceAll('"', '').trim(); } } final url = 'https://routes.googleapis.com/directions/v2:computeRoutes'; final client = HttpClient(); final request = await client.postUrl(Uri.parse(url)); request.headers.set('Content-Type', 'application/json'); request.headers.set('X-Goog-Api-Key', apiKey); request.headers.set('X-Goog-FieldMask', 'routes.distanceMeters,routes.duration,routes.polyline.encodedPolyline'); final payload = jsonEncode({ "travelMode": "DRIVE", "routingPreference": "TRAFFIC_AWARE", "routeModifiers": { "avoidTolls": false }, "origin": { "address": "401 route du camping, 69850 Saint Martin en haut" }, "destination": { "address": "Paris, France" } }); request.write(payload); final response = await request.close(); final responseBody = await response.transform(utf8.decoder).join(); final json = jsonDecode(responseBody); final routes = json['routes'] as List; final polyStr = routes[0]['polyline']['encodedPolyline'] as String; final dist = routes[0]['distanceMeters']; print('Distance: ${(dist/1000).round()} km'); print('Polyline longueur: ${polyStr.length} chars'); print('Polyline (50 premiers): ${polyStr.substring(0, 50)}'); // Décoder final pts = _decodePolyline(polyStr); print('Points décodés: ${pts.length}'); // Chercher les points invalides var invalides = 0; for (final pt in pts) { if (pt[0].abs() > 90 || pt[1].abs() > 180) { invalides++; if (invalides <= 3) print(' *** INVALIDE: ${pt[0]}, ${pt[1]}'); } } if (invalides == 0) { print('✅ Tous les ${pts.length} points sont valides WGS84'); print('Premier: ${pts[0][0].toStringAsFixed(5)}, ${pts[0][1].toStringAsFixed(5)}'); print('Dernier: ${pts.last[0].toStringAsFixed(5)}, ${pts.last[1].toStringAsFixed(5)}'); } else { print('❌ $invalides points invalides détectés'); } client.close(); } List> _decodePolyline(String encoded) { List> poly = []; int index = 0, len = encoded.length; int lat = 0, lng = 0; while (index < len) { int b, shift = 0, result = 0; do { if (index >= len) break; b = encoded.codeUnitAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lat += dlat; shift = 0; result = 0; do { if (index >= len) break; b = encoded.codeUnitAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng; double finalLat = lat / 1e5; double finalLng = lng / 1e5; poly.add([finalLat, finalLng]); } return poly; }