persister l'affichage des itinéraires

This commit is contained in:
Tykayn 2025-05-04 23:48:53 +02:00 committed by tykayn
parent da7292e746
commit dd6fbeb0a1
5 changed files with 109 additions and 103 deletions

View file

@ -305,6 +305,8 @@ function updateURLWithMapCoordinatesAndZoom() {
history.replaceState(null, null, url);
updateExternalEditorsLinks();
}
@ -611,9 +613,10 @@ function displayPointsFromApi(points, convert_to_osm_json) {
},
onEachFeature: eachFeature,
});
// Mettre à jour le compteur de stations filtrées
updateFilteredStationsCount();
calculerEtAfficherItineraire(endItinerary);
}
function displaySocketsList(feature) {
@ -655,6 +658,12 @@ function makePopupOfFeature(feature) {
}
})
popupContent += '</div>'
// Ajouter l'affichage des tarifs si l'option est activée
if ($('#display_charges').is(':checked') && feature.properties.tags.charge) {
popupContent += '<div class="charge-info"><strong>Tarifs :</strong> ' + feature.properties.tags.charge + '</div>'
}
return popupContent;
}
@ -1691,6 +1700,7 @@ async function calculerEtAfficherItineraire(destination, mode = 'car') {
const consumptionPerKm = parseFloat($('#consumption_per_km').val()) || 160;
const minBatteryLevel = parseFloat($('#min_battery_level').val()) || 15;
const chargeToLevel = parseFloat($('#charge_to_level').val()) || 80;
const maxChargePower = parseFloat($('#max_charge_power').val()) || 50;
// Construire l'URL OSRM
const url = `https://router.project-osrm.org/route/v1/${mode}/${startLon},${startLat};${endLon},${endLat}?overview=full&geometries=geojson&alternatives=false&steps=false`;
@ -1786,111 +1796,64 @@ async function calculerEtAfficherItineraire(destination, mode = 'car') {
const pauseDurationMinutes = 10;
const totalPauseTimeMinutes = numberOfPauses * pauseDurationMinutes;
// Ajouter les marqueurs de pause
window.pauseMarkers = [];
// Calculer les temps de recharge nécessaires
let totalRechargeTimeMinutes = 0;
if (numberOfPauses > 0) {
const totalDistance = route.distance;
const pauseInterval = totalDistance / (numberOfPauses + 1);
for (let i = 1; i <= numberOfPauses; i++) {
const pauseDistance = pauseInterval * i;
let accumulatedDistance = 0;
let pauseCoords;
// Trouver les coordonnées pour cette pause
for (let j = 0; j < coords.length - 1; j++) {
const segmentDistance = L.latLng(coords[j]).distanceTo(coords[j + 1]);
if (accumulatedDistance + segmentDistance >= pauseDistance) {
const ratio = (pauseDistance - accumulatedDistance) / segmentDistance;
pauseCoords = [
coords[j][0] + (coords[j + 1][0] - coords[j][0]) * ratio,
coords[j][1] + (coords[j + 1][1] - coords[j][1]) * ratio
];
break;
}
accumulatedDistance += segmentDistance;
}
if (pauseCoords) {
// Calculer la distance restante jusqu'à la prochaine pause ou la fin
const nextPauseDistance = (i < numberOfPauses) ? pauseInterval : (totalDistance - pauseDistance);
const consumptionToNextPause = (nextPauseDistance / 1000) * consumptionPerKm / 1000; // en kWh
const batteryLevelNeeded = (consumptionToNextPause / batteryCapacity) * 100 + minBatteryLevel;
// Calculer le niveau de batterie actuel à ce point
const currentBatteryLevel = ((batteryStartKwh - (pauseDistance / 1000 * consumptionPerKm / 1000)) / batteryCapacity) * 100;
// Rechercher les stations de recharge autour du point de pause
const chargingStations = await searchChargingStationsAroundPoint(pauseCoords[0], pauseCoords[1]);
// Créer le contenu du popup avec les stations trouvées
let popupContent = `<div class="pause-info">
<h3>Pause recommandée n°${i}</h3>
<p>Durée : 10 minutes</p>
<p>Niveau de batterie actuel : ${currentBatteryLevel.toFixed(1)}%</p>
<p>Niveau de batterie nécessaire : ${batteryLevelNeeded.toFixed(1)}%</p>
<p>Distance jusqu'à la prochaine pause : ${(nextPauseDistance / 1000).toFixed(1)} km</p>`;
if (chargingStations.length > 0) {
popupContent += `<div class="charging-stations">
<h4>Stations de recharge à proximité (${chargingStations.length}) :</h4>
<ul>`;
chargingStations.forEach(station => {
const name = station.tags?.name || 'Sans nom';
const operator = station.tags?.operator || 'Opérateur inconnu';
const distance = L.latLng(pauseCoords).distanceTo([station.lat, station.lon]).toFixed(0);
popupContent += `<li>
<strong>${name}</strong><br>
Opérateur : ${operator}<br>
Distance : ${distance} m
</li>`;
});
popupContent += `</ul></div>`;
} else {
popupContent += `<p>Aucune station de recharge trouvée dans un rayon de 1.5 km</p>`;
}
popupContent += `</div>`;
const pauseMarker = L.marker(pauseCoords, {
icon: L.divIcon({
className: 'pause-marker',
html: '⏸️',
iconSize: [30, 30]
})
}).addTo(map);
pauseMarker.bindPopup(popupContent);
window.pauseMarkers.push(pauseMarker);
}
const nextPauseDistance = (i < numberOfPauses) ? pauseInterval : (totalDistance - pauseDistance);
// Calculer la consommation jusqu'à la prochaine pause
const consumptionToNextPause = (nextPauseDistance / 1000) * consumptionPerKm / 1000; // en kWh
const batteryLevelNeeded = (consumptionToNextPause / batteryCapacity) * 100 + minBatteryLevel;
// Calculer le niveau de batterie actuel
const currentBatteryLevel = ((batteryStartKwh - (pauseDistance / 1000 * consumptionPerKm / 1000)) / batteryCapacity) * 100;
// Calculer la quantité d'énergie à recharger
const energyToRecharge = (batteryLevelNeeded - currentBatteryLevel) * batteryCapacity / 100;
// Calculer le temps de recharge nécessaire
const rechargeTimeHours = energyToRecharge / maxChargePower;
const rechargeTimeMinutes = Math.ceil(rechargeTimeHours * 60);
// Ajouter le temps de recharge au total (minimum 10 minutes)
totalRechargeTimeMinutes += Math.max(rechargeTimeMinutes, pauseDurationMinutes);
}
}
// Afficher distance, durée, et boutons de mode de transport
const distanceKm = (route.distance / 1000).toFixed(1);
const durationMin = Math.round(route.duration / 60);
const totalDurationMin = durationMin + totalPauseTimeMinutes;
// Convertir les différentes durées en format lisible
const formatDuration = (minutes) => {
if (minutes >= 60) {
const hours = Math.floor(minutes / 60);
const mins = minutes % 60;
return `${hours}h${mins > 0 ? ` ${mins}min` : ''}`;
}
return `${minutes} min`;
};
// Convertir la durée totale en heures et minutes si nécessaire
let durationDisplay = '';
if (totalDurationMin >= 60) {
const hours = Math.floor(totalDurationMin / 60);
const minutes = totalDurationMin % 60;
durationDisplay = `${hours}h${minutes > 0 ? ` ${minutes}min` : ''}`;
} else {
durationDisplay = `${totalDurationMin} min`;
}
const durationNoPause = formatDuration(durationMin);
const durationWithPauses = formatDuration(durationMin + totalPauseTimeMinutes);
const durationWithRecharge = formatDuration(durationMin + totalRechargeTimeMinutes);
$('#current_station_infos').html(`
$('#routing_infos').html(`
<section class="routing">
<h2>Itinéraire</h2>
<div>Distance: <strong>${distanceKm} km</strong></div>
<div>Durée estimée: <strong>${durationDisplay}</strong> (dont ${totalPauseTimeMinutes} min de pause)</div>
<div class="battery-info">
<h3>Niveaux de batterie :</h3>
<div>Départ : <strong>${batteryStartLevel}%</strong></div>
<div>Arrivée : <strong>${batteryEndLevel.toFixed(1)}%</strong></div>
</div>
<div class="duration-info">
<h3>Durées estimées :</h3>
<div>Sans pause : <strong>${durationNoPause}</strong></div>
<div>Avec pauses (10 min) : <strong>${durationWithPauses}</strong></div>
<div>Avec recharges : <strong>${durationWithRecharge}</strong></div>
</div>
<div>Nombre de pauses recommandées: <strong>${numberOfPauses}</strong> (10 min toutes les 2h)</div>
<div>Niveau de batterie final estimé: <strong>${batteryEndLevel.toFixed(1)}%</strong></div>
<div>Consommation totale estimée: <strong>${totalConsumptionKwh.toFixed(1)} kWh</strong></div>
<div>
<button onclick="calculerEtAfficherItineraire(window.lastRouteDestination, 'car')">🚗 Voiture</button>
@ -1909,7 +1872,14 @@ async function calculerEtAfficherItineraire(destination, mode = 'car') {
function setStartMarker(latlng) {
if (startMarker) map.removeLayer(startMarker);
startMarker = L.marker(latlng, { draggable: true, icon: L.divIcon({className: 'start-marker', html: '🟢', iconSize: [30, 30]}) }).addTo(map);
startMarker = L.marker(latlng, {
draggable: true,
icon: L.divIcon({
className: 'start-marker',
html: '🟢<br>départ',
iconSize: [30, 30]
})
}).addTo(map);
startCoords = [latlng.lat, latlng.lng];
startMarker.on('dragend', function(e) {
startCoords = [e.target.getLatLng().lat, e.target.getLatLng().lng];
@ -1919,7 +1889,14 @@ function setStartMarker(latlng) {
function setEndMarker(latlng) {
if (endMarker) map.removeLayer(endMarker);
endMarker = L.marker(latlng, { draggable: true, icon: L.divIcon({className: 'end-marker', html: '🔴', iconSize: [30, 30]}) }).addTo(map);
endMarker = L.marker(latlng, {
draggable: true,
icon: L.divIcon({
className: 'end-marker',
html: '🔴<br>arrivée',
iconSize: [30, 30]
})
}).addTo(map);
endCoords = [latlng.lat, latlng.lng];
endMarker.on('dragend', function(e) {
endCoords = [e.target.getLatLng().lat, e.target.getLatLng().lng];