feat(travel): implement Mapbox route recreation using Mapbox Directions API

This commit is contained in:
ElPoyo
2026-06-05 12:09:17 +02:00
parent 21d7bc8b87
commit cb35ddac22
+46 -10
View File
@@ -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);