2025-04-28 16:17:13 +02:00
/ * *
* utilitaires pour la qualité des données et deviner les puissances de stations de recharge
* /
2025-04-28 16:58:18 +02:00
export const valid _qa _message = '<span class="quality-ok">✔ Aucun problème de qualité</span>' // message affiché lorsque tout est bon
2025-04-28 16:17:13 +02:00
2025-04-28 16:50:25 +02:00
2025-04-28 16:58:18 +02:00
export const show _all _alerts = true // afficher ou non toutes les alertes, ou seulement les alertes critiques
2025-04-28 16:17:13 +02:00
2024-12-31 22:56:45 +01:00
const lcm _utils = {
2025-04-28 15:49:55 +02:00
2024-12-22 18:57:06 +01:00
/ * *
* fouiller dans les tags les valeurs explicites de puissance déclarée .
* Deviner aussi les puissances non déclarées :
* - type 2 présent , max 43 kW
* - type Chademo présent , max 63 kW
* https : //forum.openstreetmap.fr/t/bornes-de-recharges-et-puissance-chargeurs-quel-est-votre-avis/27828
*
* @ param feature
* @ returns { number }
* /
guessOutputPowerFromFeature : ( feature ) => {
let outputPower = 0
let power = 0
if ( feature . properties && feature . properties . tags ) {
2024-12-17 11:53:02 +01:00
2024-12-22 18:57:06 +01:00
let found _type _2 = false
let found _type _chademo = false
// deviner les puissances max selon les capacités de prises
for ( var tag in feature . properties . tags ) {
if ( tag . indexOf ( 'type2' ) !== - 1 ) {
2024-12-18 13:40:58 +01:00
2024-12-22 18:57:06 +01:00
found _type _2 = true
power = 43
}
if ( tag . indexOf ( 'chademo' ) !== - 1 ) {
found _type _chademo = true
power = 63
}
let value = feature . properties . tags [ tag ]
if ( value && tag . toLowerCase ( ) . indexOf ( 'output' ) !== - 1 ) {
value = '' + value
if ( value . indexOf ( ';' ) !== - 1 ) {
2025-04-18 16:50:26 +02:00
// console.log('value output multiple', value)
2024-12-22 18:57:06 +01:00
let explode = value . split ( ';' )
explode . forEach ( elem => {
if ( value . replace ) {
value = value . replace ( ' ' )
value = value . replace ( 'kW' , '' )
}
let power = parseInt ( value )
if ( power > outputPower ) {
outputPower = power
}
} )
} else {
if ( value . replace ) {
value = value . replace ( ' ' )
value = value . replace ( 'kW' , '' )
}
let power = parseInt ( value )
if ( power > outputPower ) {
outputPower = power
}
}
}
}
}
2025-04-18 16:50:26 +02:00
2024-12-22 18:57:06 +01:00
feature . properties . outputPower = outputPower
return outputPower
} ,
2024-12-17 11:53:02 +01:00
2025-04-28 13:23:12 +02:00
displayBadTagsFromFeature : ( feature ) => {
let content = ''
2025-04-28 16:17:13 +02:00
let content _combo _output = ''
let content _truefalse = ''
let content _puissance _station = ''
2025-04-28 13:23:12 +02:00
// tag de prise sans output
if ( feature . properties . tags [ 'socket: type2_combo' ] && ! feature . properties . tags [ 'socket: type2_combo:output' ] ) {
2025-04-28 16:17:13 +02:00
content _combo _output += '<span class="quality-alert"> <img src="img/type2_combo.svg" alt="Prise type 2 combo"> Prise type 2 combo sans puissance déclarée</span>'
2025-04-28 13:23:12 +02:00
}
// tag de prise sans output
if ( ! feature . properties . tags [ 'charging_station:output' ] ) {
2025-04-28 16:17:13 +02:00
content _puissance _station += '<span class="quality-alert">⚡ Pas de puissance déclarée pour la station</span>'
2025-04-28 13:23:12 +02:00
}
// Vérifier les tags de puissance qui ne devraient pas contenir de point-virgule
for ( let tag in feature . properties . tags ) {
if ( tag . includes ( ':output' ) ) {
let value = feature . properties . tags [ tag ] ;
if ( value && value . includes ( ';' ) ) {
2025-04-28 16:17:13 +02:00
content += ` <div class="quality-alert"> <img src="img/fountain.png" alt="output"> Le tag " ${ tag } " ne devrait pas contenir de point-virgule dans sa valeur</div> ` ;
2025-04-28 13:23:12 +02:00
}
2025-04-28 13:34:48 +02:00
// Vérifier si la valeur est zéro
if ( value === '0' || value === 0 || value === '0 kW' ) {
2025-04-28 16:17:13 +02:00
content += ` <div class="quality-alert"> <img src="img/prise_inconnue.svg" alt="output"> Le tag " ${ tag } " ne devrait pas avoir une valeur de zéro</div> ` ;
2025-04-28 13:34:48 +02:00
}
2025-04-28 13:23:12 +02:00
}
}
2025-04-28 15:49:55 +02:00
// Vérifier si aucun tag ne contient "socket"
let hasSocketTag = false ;
for ( let tag in feature . properties . tags ) {
if ( tag . includes ( 'socket' ) ) {
hasSocketTag = true ;
break ;
}
}
if ( ! hasSocketTag ) {
content += '<div class="quality-alert">Aucune tag détaillant le <b class="quality-emphasis">socket:*</b></div>' ;
}
2025-04-28 13:23:12 +02:00
if ( ! feature . properties . tags [ 'ref:EU:EVSE' ] ) {
2025-04-28 15:49:55 +02:00
content += '<div class="quality-alert">Pas de référence <b class="quality-emphasis">ref:EU:EVSE</b></div>'
2025-04-28 13:23:12 +02:00
}
if ( ! feature . properties . tags [ 'capacity' ] ) {
2025-04-28 15:49:55 +02:00
content += '<div class="quality-alert">Pas de nombre de places donné avec <b class="quality-emphasis">capacity</b></div>'
2025-04-28 13:23:12 +02:00
}
if ( ! feature . properties . tags [ 'network' ] ) {
2025-04-28 15:49:55 +02:00
content += '<div class="quality-alert">Pas de réseau de recharge déclaré</div>'
2025-04-28 13:23:12 +02:00
}
// Vérifier les valeurs true/false dans les tags
for ( let tag in feature . properties . tags ) {
let value = feature . properties . tags [ tag ] ;
if ( value === 'true' || value === 'false' ) {
2025-04-28 16:17:13 +02:00
content _truefalse = ` <div class="quality-alert">Le tag <b class="quality-emphasis"> ${ tag } </b> utilise <b class="quality-emphasis">true/false</b> au lieu de <b class="quality-emphasis">yes/no</b></div> ` ;
2025-04-28 13:23:12 +02:00
}
}
2025-04-28 16:17:13 +02:00
if ( ! show _all _alerts ) {
return content = `
$ { content _truefalse }
$ { content _combo _output }
`
// ${content_puissance_station}
} else {
content = content _truefalse + content _combo _output + content _puissance _station + content
}
2025-04-28 13:23:12 +02:00
if ( ! content ) {
2025-04-28 15:49:55 +02:00
content = '' + valid _qa _message
2025-04-28 13:23:12 +02:00
}
return content ;
} ,
2024-12-22 18:57:06 +01:00
/ * *
* villes les plus peuplées de France
* /
cities : [
2025-04-18 16:50:26 +02:00
{ name : 'Paris' , coords : [ 48.8566 , 2.3522 ] } ,
{ name : 'Marseille' , coords : [ 43.2965 , 5.3698 ] } ,
{ name : 'Lyon' , coords : [ 45.7640 , 4.8357 ] } ,
{ name : 'Toulouse' , coords : [ 43.6042 , 1.4437 ] } ,
{ name : 'Nice' , coords : [ 43.7101 , 7.2620 ] } ,
{ name : 'Nantes' , coords : [ 47.2184 , - 1.5536 ] } ,
{ name : 'Strasbourg' , coords : [ 48.5831 , 7.7521 ] } ,
{ name : 'Montpellier' , coords : [ 43.6167 , 3.8742 ] } ,
{ name : 'Bordeaux' , coords : [ 44.8378 , - 0.5792 ] } ,
{ name : 'Lille' , coords : [ 50.6293 , 3.1466 ] } ,
{ name : 'Rennes' , coords : [ 48.1120 , - 1.6823 ] } ,
{ name : 'Toulon' , coords : [ 43.1230 , 5.9291 ] } ,
{ name : 'Le Havre' , coords : [ 49.4943 , 0.1079 ] } ,
{ name : 'Saint-Etienne' , coords : [ 45.4380 , 4.3841 ] } ,
{ name : 'Grenoble' , coords : [ 45.1667 , 5.7295 ] } ,
{ name : 'Rouen' , coords : [ 49.4431 , 1.0820 ] } ,
{ name : 'Dijon' , coords : [ 47.3221 , 5.0446 ] } ,
{ name : 'Angers' , coords : [ 47.4786 , - 0.5551 ] } ,
{ name : 'Nîmes' , coords : [ 43.8366 , 4.3623 ] } ,
{ name : 'Reims' , coords : [ 49.2500 , 4.0333 ] }
2024-12-22 18:57:06 +01:00
]
2024-12-17 11:53:02 +01:00
}
2024-12-31 22:56:45 +01:00
export default lcm _utils