diff --git a/em2rp/functions/src/travel.js b/em2rp/functions/src/travel.js index 4f2b99a..1f26cf8 100644 --- a/em2rp/functions/src/travel.js +++ b/em2rp/functions/src/travel.js @@ -49,16 +49,52 @@ function loadTollStations() { // ───────────────────────────────────────────── async function getUlysTollLegs(encodedPolyline) { try { - const url = 'https://api-ulys.azure-api.net/placemark/v2/legs?precision=6&includeLayersIds=GaresPeage'; - const body = JSON.stringify(encodedPolyline); - const res = await axios.post(url, body, { - headers: { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(body).toString(), - 'Host': 'api-ulys.azure-api.net', - }, - timeout: 10000, - }); + const polylineCoords = polylineLib.decode(encodedPolyline); + const ulysUrl = 'https://api-ulys.azure-api.net/placemark/v2/legs?precision=5&includeLayersIds=GaresPeage'; + let finalPolyline = encodedPolyline; + + // OPTION 1 : Mapbox Route Recreation + if (process.env.MAPBOX_API_KEY && polylineCoords.length > 2) { + logger.info('[Travel] MAPBOX_API_KEY is present. Recreating route with Mapbox for Ulys precision...'); + try { + // Extraire jusqu'à 25 waypoints (limite Mapbox Directions API) équidistants + const maxWaypoints = 25; + const waypoints = []; + const step = Math.max(1, Math.floor(polylineCoords.length / (maxWaypoints - 1))); + for (let i = 0; i < polylineCoords.length; i += step) { + waypoints.push(polylineCoords[i]); + } + if (waypoints[waypoints.length - 1] !== polylineCoords[polylineCoords.length - 1]) { + waypoints[waypoints.length - 1] = polylineCoords[polylineCoords.length - 1]; // Ensure last point is exactly destination + } + + // Mapbox expects longitude,latitude + const coordinatesString = waypoints.map(p => `${p[1]},${p[0]}`).join(';'); + const mapboxUrl = `https://api.mapbox.com/directions/v5/mapbox/driving/${coordinatesString}?geometries=polyline&overview=full&access_token=${process.env.MAPBOX_API_KEY}`; + + const mapboxRes = await axios.get(mapboxUrl); + if (mapboxRes.data && mapboxRes.data.routes && mapboxRes.data.routes.length > 0) { + finalPolyline = mapboxRes.data.routes[0].geometry; + logger.info('[Travel] Mapbox route recreation successful.'); + } + } catch (mapboxErr) { + logger.error('[Travel] Mapbox API error:', mapboxErr.response ? mapboxErr.response.data : mapboxErr.message); + // Fallback to Google Maps polyline if Mapbox fails + } + } + + // Appeler Ulys /legs + const res = await axios.post( + ulysUrl, + JSON.stringify(finalPolyline), + { + headers: { + 'Content-Type': 'application/json', + 'Host': 'api-ulys.azure-api.net' + }, + timeout: 10000, + } + ); return res.data; } catch (e) { logger.warn('[Travel] Ulys /legs failed:', e.message);