mirror of
https://forge.chapril.org/tykayn/osm-commerces
synced 2025-10-09 17:02:46 +02:00
up infos vélo
This commit is contained in:
parent
c0a1780fce
commit
0b760c20bc
7 changed files with 246 additions and 50 deletions
|
@ -43,6 +43,8 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||
let car_parking_capacity = 0;
|
||||
let car_parking_surface = 0;
|
||||
let bike_parking_surface = 0;
|
||||
let cyclewayLaneKm = 0;
|
||||
let cyclewayTrackKm = 0;
|
||||
if (data.elements) {
|
||||
// Indexer les nœuds pour calculs de longueur
|
||||
data.elements.forEach(e => {
|
||||
|
@ -107,59 +109,80 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
// Fonction pour calculer la longueur d'une way en km
|
||||
function wayLengthKm(way) {
|
||||
let len = 0;
|
||||
for (let i = 1; i < way.nodes.length; i++) {
|
||||
const n1 = nodes[way.nodes[i-1]];
|
||||
const n2 = nodes[way.nodes[i]];
|
||||
if (n1 && n2) {
|
||||
// Haversine
|
||||
const R = 6371;
|
||||
const dLat = (n2.lat-n1.lat)*Math.PI/180;
|
||||
const dLon = (n2.lon-n1.lon)*Math.PI/180;
|
||||
const a = Math.sin(dLat/2)*Math.sin(dLat/2) + Math.cos(n1.lat*Math.PI/180)*Math.cos(n2.lat*Math.PI/180)*Math.sin(dLon/2)*Math.sin(dLon/2);
|
||||
const c = 2*Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
|
||||
len += R*c;
|
||||
// Calculs longueurs (Haversine)
|
||||
function wayLengthKm(way) {
|
||||
let len = 0;
|
||||
for (let i = 1; i < way.nodes.length; i++) {
|
||||
const n1 = nodes[way.nodes[i-1]];
|
||||
const n2 = nodes[way.nodes[i]];
|
||||
if (n1 && n2) {
|
||||
// Haversine
|
||||
const R = 6371;
|
||||
const dLat = (n2.lat-n1.lat)*Math.PI/180;
|
||||
const dLon = (n2.lon-n1.lon)*Math.PI/180;
|
||||
const a = Math.sin(dLat/2)*Math.sin(dLat/2) + Math.cos(n1.lat*Math.PI/180)*Math.cos(n2.lat*Math.PI/180)*Math.sin(dLon/2)*Math.sin(dLon/2);
|
||||
const c = 2*Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
|
||||
len += R*c;
|
||||
}
|
||||
}
|
||||
return len;
|
||||
}
|
||||
return len;
|
||||
let len_separees = 0;
|
||||
let len_melangees = 0;
|
||||
let len_routes = 0;
|
||||
cycleways_separees.forEach(w => { let l = wayLengthKm(w); len_separees += l; cyclewayTrackKm += l; });
|
||||
cycleways_melangees.forEach(w => { let l = wayLengthKm(w); len_melangees += l; cyclewayLaneKm += l; });
|
||||
roads.forEach(w => { len_routes += wayLengthKm(w); });
|
||||
|
||||
// Calculs des coûts vélo
|
||||
let coutParking = capacitySum * 500;
|
||||
let coutLane = cyclewayLaneKm * 10000;
|
||||
let coutTrack = cyclewayTrackKm * 400000;
|
||||
let totalCoutVelo = coutParking + coutLane + coutTrack;
|
||||
|
||||
// Affichage synthétique
|
||||
let html = '';
|
||||
html += `<div class='mb-3 p-2 border rounded bg-light'>
|
||||
<h5><i class='bi bi-bicycle'></i> Mobilité et stationnement : synthèse</h5>
|
||||
<table class='table table-sm align-middle mb-0' style='max-width:700px;'>
|
||||
<tbody>
|
||||
<tr><th><i class='bi bi-bicycle'></i> Parkings vélo</th><td class='text-end'><b>${total}</b></td></tr>`;
|
||||
if (population > 0) {
|
||||
const ratio = (capacitySum / population).toFixed(4);
|
||||
html += `<tr><th class='text-muted'>Parkings vélo par habitant</th><td class='text-end'>${ratio}</td></tr>`;
|
||||
}
|
||||
if (withCapacity > 0) {
|
||||
html += `<tr><th><i class='bi bi-people'></i> Capacité totale vélo</th><td class='text-end'>${capacitySum}</td></tr>`;
|
||||
} else {
|
||||
html += `<tr><th colspan='2' class='text-danger'>Aucune capacité renseignée sur les parkings vélo</th></tr>`;
|
||||
}
|
||||
html += `<tr><th><i class='bi bi-aspect-ratio'></i> Surface estimée parkings vélo (m²)</th><td class='text-end'>${bike_parking_surface.toLocaleString()}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-signpost'></i> Voies cyclables séparées (km)</th><td class='text-end'>${len_separees.toFixed(2)}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-signpost'></i> Voies cyclables sur route (km)</th><td class='text-end'>${len_melangees.toFixed(2)}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-car-front'></i> Parkings voiture</th><td class='text-end'>${car_parkings}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-people'></i> Capacité totale voiture</th><td class='text-end'>${car_parking_capacity}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-aspect-ratio'></i> Surface estimée parkings voiture (m²)</th><td class='text-end'>${car_parking_surface.toLocaleString()}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-road'></i> Longueur totale de routes (km)</th><td class='text-end'>${len_routes.toFixed(2)}</td></tr>`;
|
||||
// Bloc coûts vélo
|
||||
html += `<tr><th><i class='bi bi-cash-coin'></i> Coût estimé parkings vélo</th><td class='text-end'>${coutParking.toLocaleString()} € <span title="Hypothèse : 500 € par place de parking vélo. Source : villes-cyclables.org, asphalte-evolution.fr, routes.fandom.com, https://www.idrrim.com/ressources/documents/source/2/11468-IDRRIM_Rapport_ONR_2024.pdf" style="cursor: help;">❓</span></td></tr>`;
|
||||
// Coût estimé parkings voiture
|
||||
let coutParkingVoiture = car_parking_capacity * 5000;
|
||||
html += `<tr><th><i class='bi bi-cash-coin'></i> Coût estimé parkings voiture</th><td class='text-end'>${coutParkingVoiture.toLocaleString()} € <span title="Hypothèse : 5 000 € par place de parking voiture (hors foncier, VRD, abri). Source : IDRRIM 2024, asphalte-evolution.fr, routes.fandom.com, https://www.idrrim.com/ressources/documents/source/2/11468-IDRRIM_Rapport_ONR_2024.pdf" style='cursor: help;'>❓</span></td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-cash-coin'></i> Coût pistes cyclables sur chaussée</th><td class='text-end'>${coutLane.toLocaleString()} € <span title="Hypothèse : 10 000 € par km de piste cyclable sur chaussée. Source : villes-cyclables.org, asphalte-evolution.fr, routes.fandom.com" style="cursor: help;">❓</span></td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-cash-coin'></i> Coût pistes cyclables séparées</th><td class='text-end'>${coutTrack.toLocaleString()} € <span title="Hypothèse : 400 000 € par km de piste cyclable séparée. Source : villes-cyclables.org, asphalte-evolution.fr, routes.fandom.com" style="cursor: help;">❓</span></td></tr>`;
|
||||
html += `<tr><th><b>Total cumulé estimé vélo</b></th><td class='text-end'><b>${totalCoutVelo.toLocaleString()} €</b></td></tr>`;
|
||||
// Coût d'entretien annuel routes auto
|
||||
let coutEntretienKm = 13000; // 13 000 €/km/an
|
||||
let coutEntretienTotal = len_routes * coutEntretienKm;
|
||||
html += `<tr><th><i class='bi bi-tools'></i> Coût d'entretien annuel routes auto</th><td class='text-end'>${coutEntretienTotal.toLocaleString()} € <span title="Hypothèse : 13 milliards d'euros par an pour 1 million de km de routes en France, soit 13 000 €/km/an. Source : calcul national, IDRRIM 2024, asphalte-evolution.fr, https://www.idrrim.com/ressources/documents/source/2/11468-IDRRIM_Rapport_ONR_2024.pdf" style='cursor: help;'>❓</span></td></tr>`;
|
||||
html += `</tbody></table></div>`;
|
||||
document.getElementById('bicycle-parking-extra-info').innerHTML = html;
|
||||
}
|
||||
let len_separees = 0;
|
||||
let len_melangees = 0;
|
||||
let len_routes = 0;
|
||||
cycleways_separees.forEach(w => { len_separees += wayLengthKm(w); });
|
||||
cycleways_melangees.forEach(w => { len_melangees += wayLengthKm(w); });
|
||||
roads.forEach(w => { len_routes += wayLengthKm(w); });
|
||||
let html = '';
|
||||
html += `<div class='mb-3 p-2 border rounded bg-light'>
|
||||
<h5><i class='bi bi-bicycle'></i> Mobilité et stationnement : synthèse</h5>
|
||||
<table class='table table-sm align-middle mb-0' style='max-width:600px;'>
|
||||
<tbody>
|
||||
<tr><th><i class='bi bi-bicycle'></i> Parkings vélo</th><td class='text-end'><b>${total}</b></td></tr>`;
|
||||
if (population > 0) {
|
||||
const ratio = (total / population).toFixed(4);
|
||||
html += `<tr><th class='text-muted'>Parkings vélo par habitant</th><td class='text-end'>${ratio}</td></tr>`;
|
||||
}
|
||||
if (withCapacity > 0) {
|
||||
html += `<tr><th><i class='bi bi-people'></i> Capacité totale vélo</th><td class='text-end'>${capacitySum}</td></tr>`;
|
||||
} else {
|
||||
html += `<tr><th colspan='2' class='text-danger'>Aucune capacité renseignée sur les parkings vélo</th></tr>`;
|
||||
}
|
||||
html += `<tr><th><i class='bi bi-aspect-ratio'></i> Surface estimée parkings vélo (m²)</th><td class='text-end'>${bike_parking_surface.toLocaleString()}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-signpost'></i> Voies cyclables séparées (km)</th><td class='text-end'>${len_separees.toFixed(2)}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-signpost'></i> Voies cyclables sur route (km)</th><td class='text-end'>${len_melangees.toFixed(2)}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-car-front'></i> Parkings voiture</th><td class='text-end'>${car_parkings}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-people'></i> Capacité totale voiture</th><td class='text-end'>${car_parking_capacity}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-aspect-ratio'></i> Surface estimée parkings voiture (m²)</th><td class='text-end'>${car_parking_surface.toLocaleString()}</td></tr>`;
|
||||
html += `<tr><th><i class='bi bi-road'></i> Longueur totale de routes (km)</th><td class='text-end'>${len_routes.toFixed(2)}</td></tr>`;
|
||||
html += `</tbody></table></div>`;
|
||||
document.getElementById('bicycle-parking-extra-info').innerHTML = html;
|
||||
})
|
||||
.catch(() => {
|
||||
document.getElementById('bicycle-parking-extra-info').innerHTML = '<span class="text-danger">Erreur lors du chargement des données vélo.</span>';
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue