add filters merge

This commit is contained in:
Tykayn 2025-04-27 22:24:09 +02:00 committed by tykayn
commit 756d997e06
15 changed files with 642 additions and 614 deletions

View file

@ -4,9 +4,15 @@ const lcm_config = {
overrideQuery: true,
initialZoom: 12,
hide_osmose_markers_if_close_to_existing_charging_stations: true,
hide_osmose_markers_if_close_to_existing_charging_stations_distance: 5, // meters
hide_osmose_markers_if_close_to_existing_charging_stations_distance: 10, // meters
max_possible_station_output: 400,
filter_max_output: true,
filter_max_output_min: 0,
filter_max_output_max: 499,
filter_max_output_default_value: 1,
filter_unknown_output: true,
max_possible_station_output: 499,
// Filtres pour les prises
filterCableAttached: false,
filterCCS: false,
@ -20,7 +26,7 @@ const lcm_config = {
filterConfigs: {
'filterUnknownOutput': true,
'filterCableAttached': true,
'filterCCS': true,
'filterCCS': true,
'filterType2': true,
'filterQuality': true,
'filterDomestic': true,

View file

@ -342,6 +342,12 @@ function calculerPourcentage(partie, total, reduc) {
return ((partie / total) * 100 * coef_reduction).toFixed(1)
}
// Ajouter une variable globale pour stocker le nombre d'issues Osmose
let osmoseIssuesCount = 0;
// Ajouter une variable globale pour stocker le nombre de stations affichées
let displayedStationsCount = 0;
function displayStatsFromGeoJson(resultAsGeojson, stats) {
let count = resultAsGeojson.features.length;
let count_station_output = 0;
@ -361,7 +367,7 @@ function displayStatsFromGeoJson(resultAsGeojson, stats) {
Object.keys(lcm_config.filterConfigs).forEach(filterId => {
if (!lcm_config.filterConfigs[filterId]) disabledFilters++;
});
$('#count_features_fond').html('⚡' + count + ' stations' + (disabledFilters > 0 ? ` (${disabledFilters} filtre${disabledFilters > 1 ? 's' : ''} désactivé${disabledFilters > 1 ? 's' : ''}, ${stats.count_hidden_by_filters} masqué${stats.count_hidden_by_filters > 1 ? 's' : ''})` : ''));
resultAsGeojson.features.map(feature => {
@ -464,6 +470,17 @@ function displayStatsFromGeoJson(resultAsGeojson, stats) {
$('#found_charging_stations').html(stats_content);
$('#bars_power').html(bar_powers);
// Remplacer la ligne existante par un appel à updateCounters
updateCounters();
}
// Ajouter une fonction pour mettre à jour les compteurs
function updateCounters() {
const stationsCount = geojsondata ? geojsondata.features.length : 0;
const osmoseText = osmoseIssuesCount > 0 ? ` <span class="osmose-counter">(+ ${osmoseIssuesCount} ?)</span>` : '';
$('#count_features_fond').html(`${stationsCount}${osmoseText} stations`);
}
// Modifier bindEventsOnJosmRemote pour cibler les boutons dans un contexte (la popup)
@ -472,10 +489,10 @@ function bindEventsOnJosmRemote(popupElement) {
$(popupElement).find('.edit-button.josm').each(function () {
// Utiliser .off().on() pour éviter les liaisons multiples si la popup est rouverte
$(this).off('click').on('click', (event) => {
event.preventDefault(); // Empêcher le comportement par défaut du lien
event.preventDefault();
let josm_link = $(this).attr('data-href');
console.log('Sending command to JOSM:', josm_link);
// Utiliser fetch pour la requête GET vers JOSM (plus moderne que $.get)
fetch(josm_link)
.then(response => {
if (!response.ok) {
@ -500,6 +517,10 @@ function displayPointsFromApi(points, convert_to_osm_json) {
geojsondata = osmtogeojson(points);
}
// Réinitialiser le compteur avant d'afficher les points
displayedStationsCount = 0;
displayStatsFromGeoJson(geojsondata);
let stats = {
count_hidden_by_filters: 0
};
@ -526,10 +547,11 @@ function displayPointsFromApi(points, convert_to_osm_json) {
supprimerMarqueurs();
displayPointsFromApi();
},
onEachFeature: function(feature, layer) {
eachFeature(feature, layer, stats);
},
onEachFeature: eachFeature,
});
// Mettre à jour le compteur de stations filtrées
updateFilteredStationsCount();
}
function makePopupOfFeature(feature) {
@ -575,13 +597,29 @@ function makePopupOfFeature(feature) {
* @param layer
*/
function eachFeature(feature, layer, stats) {
let outPowerGuessed = lcm_utils.guessOutputPowerFromFeature(feature);
const maxPowerFilter = parseInt($('#filter_max_output').val()) || lcm_config.filter_max_output_default_value;
// Filtrage par puissance
if (outPowerGuessed === 0 || outPowerGuessed === null) {
if (display_unknown_max_power_station === 'hide') {
return;
}
} else {
// Filtrer les stations dont la puissance dépasse le maximum défini
if (outPowerGuessed < maxPowerFilter) {
return;
}
}
// Incrémenter le compteur de stations affichées
displayedStationsCount++;
let link_josm = createJOSMEditLink(feature);
let popupContent = makePopupOfFeature(feature);
layer.bindPopup(popupContent);
let outPowerGuessed = lcm_utils.guessOutputPowerFromFeature(feature);
let color = lcm_color_utils.getColor(feature);
let displayOutPowerGuessed = '? kW';
// Vérifier les filtres activés
@ -631,7 +669,7 @@ function eachFeature(feature, layer, stats) {
if (lcm_config.filterQuality) {
// Vérifier si les informations minimales de qualité sont présentes
let hasQualityInfo = feature.properties.tags['operator'] ||
let hasQualityInfo = feature.properties.tags['operator'] ||
feature.properties.tags['authentication:none'] ||
feature.properties.tags['payment:none'] ||
feature.properties.tags['opening_hours'];
@ -670,7 +708,7 @@ function eachFeature(feature, layer, stats) {
<a class="edit-button josm" data-href="${link_josm}" href="#">JOSM</a>
<a href="${panoramaxLink}" target="_blank" class="panoramax-link" title="Voir sur Panoramax">
<img src="styles/images/panoramax.ico" alt="icone"></a>
<span class="color-indication" style="background-color: ${color};">${displayOutPowerGuessed}</span>
<span class="color-indication" style="background-color: ${lcm_color_utils.getColor(feature)};">${displayOutPowerGuessed}</span>
<button class="edit-button" id="fullDetails" >détails</button>
<span class="popup-content">${popupContent}</span>`;
@ -758,8 +796,8 @@ function eachFeature(feature, layer, stats) {
* affichage des marqueurs de stations de recharge
*/
let circle = L.circle(layer._latlng, {
color: color,
fillColor: color,
color: lcm_color_utils.getColor(feature),
fillColor: lcm_color_utils.getColor(feature),
fillOpacity: opacity,
colorOpacity: opacity,
radius: radius
@ -768,7 +806,7 @@ function eachFeature(feature, layer, stats) {
if (zoom > 15) {
let circle_center = L.circle(layer._latlng, {
color: 'black',
fillColor: color,
fillColor: lcm_color_utils.getColor(feature),
fillOpacity: 1,
radius: 0.1
}).addTo(all_stations_markers);
@ -820,49 +858,6 @@ function bindFullDetails(feature) {
${content}`
})
}
function makeCssClassFromTags(tags) {
let tagKeys = Object.keys(tags)
if (!tags) {
return ''
}
let listOfClasses = []
tagKeys.forEach((element) => {
listOfClasses.push('tag-' + element + '_' + tags[element].replace(':', '--').replace(' ', '-'))
})
return listOfClasses.join(' ')
}
function getIconFromTags(tags) {
let iconFileName = ''
// let iconFileName = 'icon_restaurant.png';
if (tags['man_made']) {
iconFileName = 'fountain.png'
}
return iconFileName
}
function toggleMinPower(showHighPower) {
showHighPower = !showHighPower;
addFilteredMarkers(showHighPower);
this.textContent = showHighPower ? 'Montrer puissance haute' : 'Montrer puissance normale';
}
function addFilteredMarkers(showHighPower) {
allMarkers.clearLayers();
let counter = 0;
geojsondata.features.forEach(function (feature) {
if (feature.properties.puissance_haute === showHighPower) {
counter++;
let marker = L.marker(feature.geometry.coordinates).bindPopup(feature.properties.puissance_haute ? 'Puissance haute' : 'Puissance normale');
allMarkers.addLayer(marker);
}
});
}
let isLoading = false
function loadOverpassQuery() {
@ -885,7 +880,12 @@ function loadOverpassQuery() {
function refreshDisplay(convert_points_to_osm = false) {
supprimerMarqueurs();
count_hidden_by_filters = 0; // Réinitialiser le compteur
displayPointsFromApi(geojsondata, convert_points_to_osm);
if (geojsondata) {
displayPointsFromApi(geojsondata, convert_points_to_osm);
updateCounters();
updateFilteredStationsCount();
}
// Mettre à jour le compteur dans la popup
let count = geojsondata.features.length;
let disabledFilters = 0;
@ -935,7 +935,7 @@ function onMapMoveEnd() {
console.log("Zoom actuel:", map.getZoom());
if (map.getZoom() >= 12) {
console.log("Recherche des issues Osmose...");
// console.log("Recherche des issues Osmose...");
searchOsmoseIssues(map);
} else {
console.log("Zoom trop faible pour les issues Osmose");
@ -1010,6 +1010,7 @@ $('#toggle-stats').on('click', function () {
}
});
// Ajouter ces variables avec les autres déclarations globales
let food_places_markers = L.layerGroup();
const foodIcon = L.divIcon({
@ -1088,7 +1089,6 @@ function searchOsmoseIssues(map) {
const bbox = `${bounds.getWest()}%2C${bounds.getSouth()}%2C${bounds.getEast()}%2C${bounds.getNorth()}`;
const url = `https://osmose.openstreetmap.fr/api/0.3/issues?zoom=${zoom}&item=8410%2C8411&level=1%2C2%2C3&limit=500&bbox=${bbox}`;
console.log("Recherche des issues Osmose (liste) avec l'URL :", url);
osmose_markers.clearLayers();
// Modifier la vérification des stations existantes
@ -1117,10 +1117,13 @@ function searchOsmoseIssues(map) {
.then(data => {
if (!data || !Array.isArray(data.issues)) {
console.warn("Réponse Osmose (liste) inattendue ou pas d'issues:", data);
osmoseIssuesCount = 0;
updateCounters();
return;
}
const issuesList = data.issues;
console.log(`Nombre d'issues Osmose (liste) trouvées: ${issuesList.length}`);
osmoseIssuesCount = issuesList.length;
console.log(`Nombre d'issues Osmose (liste) trouvées: ${osmoseIssuesCount}`);
issuesList.forEach(issueInfo => {
if (issueInfo.lat == null || issueInfo.lon == null || !issueInfo.id) {
@ -1138,7 +1141,7 @@ function searchOsmoseIssues(map) {
});
if (tooClose) {
// console.log(`Marqueur Osmose ignoré car trop proche d'une station existante: ${lat},${lon}`);
// console.log(`Marqueur Osmose ignoré car trop proche d'une station existante: ${lat},${lon}`);
return;
}
}
@ -1216,9 +1219,13 @@ function searchOsmoseIssues(map) {
osmose_markers.addLayer(osmoseMarker);
});
updateCounters(); // Mettre à jour l'affichage après le traitement
})
.catch(error => {
console.error('Erreur détaillée lors de la recherche de la liste des issues Osmose:', error);
osmoseIssuesCount = 0;
updateCounters();
});
}
@ -1255,133 +1262,130 @@ function handleMarkerClick(marker, map) {
// Ajouter un écouteur d'événements pour le changement de visibilité des calques
function init() {
bindEventsOnJosmRemote();
onMapMoveEnd();
map.on('moveend', onMapMoveEnd);
$('#spinning_icon').hide();
$(document).ready(function () {
bindEventsOnJosmRemote();
onMapMoveEnd();
map.on('moveend', onMapMoveEnd);
$('#spinning_icon').hide();
/**
* boutons de changement de filtres et de rechargement des bornes à l'affichage
*/
$('#removeMarkers').on('click', function () {
supprimerMarqueurs();
});
$('#load').on('click', function () {
loadOverpassQuery();
});
$('#toggleSidePanel').on('click', function () {
$('body').toggleClass('side-panel-open');
});
$('#chercherButton').on('click', function () {
supprimerMarqueurs();
loadOverpassQuery();
});
$('#setRandomView').on('click', function () {
setRandomView();
loadOverpassQuery();
});
$('#filterUnkown').on('click', function () {
display_unknown_max_power_station = cycleVariableState(display_unknown_max_power_station, '#filterUnkown');
showActiveFilter(display_unknown_max_power_station, '#filterUnkown');
refreshDisplay();
});
/**
* toggle des alertes de tags décrivant la présence de cable
*/
$('#cableMissing').on('click', function () {
display_alert_cable_missing = !display_alert_cable_missing;
showActiveFilter(display_alert_cable_missing, '#cableMissing');
refreshDisplay();
});
showActiveFilter(display_unknown_max_power_station, '#filterUnkown');
$('#shareUrl').on('click', copyCurrentUrl);
// Initialisation des états des checkboxes des filtres selon les valeurs de configuration
Object.keys(lcm_config.filterConfigs).forEach(filterId => {
console.log("checbox ", $(`#${filterId}`) , lcm_config.filterConfigs[filterId] , lcm_config)
$(`#${filterId}`).prop('checked', lcm_config.filterConfigs[filterId]);
});
// Écouteurs pour les filtres
Object.keys(lcm_config.filterConfigs).forEach(filterId => {
$(`#${filterId}`).on('change', function() {
lcm_config[lcm_config.filterConfigs[filterId]] = this.checked;
/**
* boutons de changement de filtres et de rechargement des bornes à l'affichage
*/
$('#removeMarkers').on('click', function () {
supprimerMarqueurs();
});
$('#load').on('click', function () {
loadOverpassQuery();
});
$('#toggleSidePanel').on('click', function () {
$('body').toggleClass('side-panel-open');
});
$('#chercherButton').on('click', function () {
supprimerMarqueurs();
loadOverpassQuery();
});
$('#setRandomView').on('click', function () {
setRandomView();
loadOverpassQuery();
});
$('#filterUnkown').on('click', function () {
display_unknown_max_power_station = cycleVariableState(display_unknown_max_power_station, '#filterUnkown');
showActiveFilter(display_unknown_max_power_station, '#filterUnkown');
refreshDisplay();
});
});
food_places_markers.addTo(map);
$('#found_charging_stations').hide();
/**
* toggle des alertes de tags décrivant la présence de cable
*/
$('#cableMissing').on('click', function () {
display_alert_cable_missing = !display_alert_cable_missing;
showActiveFilter(display_alert_cable_missing, '#cableMissing');
refreshDisplay();
});
showActiveFilter(display_unknown_max_power_station, '#filterUnkown');
// Mettre à jour le contrôle des calques
const overlayMaps = {
"Stations de recharge": all_stations_markers,
"Restaurants et cafés": food_places_markers,
"Bornes potentielles (Osmose)": osmose_markers
};
$('#shareUrl').on('click', copyCurrentUrl);
// Créer deux contrôles de couches séparés
// const baseLayerControl = L.control.layers(baseLayers, null, {
// collapsed: true,
// className: 'leaflet-control-layers base-layers',
// id: 'base-layers-control'
// }).addTo(map);
const overlayControl = L.control.layers(null, overlayMaps, {
collapsed: true,
className: 'leaflet-control-layers overlay-layers',
id: 'overlay-layers-control'
}).addTo(map);
$('#sendToJOSM').on('click', () => {
sendToJOSM(map, geojsondata)
.then(() => {
console.log('Données envoyées à JOSM avec succès !');
})
.catch(() => {
alert('Erreur : JOSM doit être ouvert avec l\'option "Contrôle à distance" activée');
// Initialisation des états des checkboxes des filtres selon les valeurs de configuration
Object.keys(lcm_config.filterConfigs).forEach(filterId => {
console.log("checbox ", $(`#${filterId}`) , lcm_config.filterConfigs[filterId] , lcm_config)
$(`#${filterId}`).prop('checked', lcm_config.filterConfigs[filterId]);
});
// Écouteurs pour les filtres
Object.keys(lcm_config.filterConfigs).forEach(filterId => {
$(`#${filterId}`).on('change', function() {
lcm_config[lcm_config.filterConfigs[filterId]] = this.checked;
refreshDisplay();
});
});
$('#josmLink').on('click', () => {
sendToJOSM(map, geojsondata)
.then(() => {
console.log('Données envoyées à JOSM avec succès !');
})
.catch(() => {
alert('Erreur : JOSM doit être ouvert avec l\'option de télécommande "Contrôle à distance" activée dans ses paramètres (accédez-y avec F12)');
});
});
$('#searchButton').on('click', searchLocation);
$('#shareUrl').on('click', copyCurrentUrl);
});
$('#searchResults').on('change', function () {
const selectedIndex = $(this).val();
if (selectedIndex !== null) {
const selectedPlace = $(this).find('option:selected').data('place');
moveToLocation(selectedPlace);
}
});
food_places_markers.addTo(map);
$('#found_charging_stations').hide();
osmose_markers.addTo(map);
// Mettre à jour le contrôle des calques
const overlayMaps = {
"Stations de recharge": all_stations_markers,
"Restaurants et cafés": food_places_markers,
"Bornes potentielles (Osmose)": osmose_markers
};
// Ajouter le contrôle de source de recherche
const searchControl = `
<div class="search-source-control">
<label>
<input type="checkbox" id="useAddok" checked>
Utiliser Addok (France)
</label>
</div>
`;
$('#searchLocation').after(searchControl);
// const baseLayersControl = L.control.layers(baseLayers, null, {
// collapsed: true,
// className: 'leaflet-control-layers base-layers',
// id: 'base-layers-control'
// }).addTo(map);
// Mettre à jour les marqueurs Osmose quand la visibilité des stations change
map.on('overlayremove overlayadd', function (e) {
if (e.name === "Stations de recharge" && map.getZoom() > 12) {
searchOsmoseIssues(map);
}
const overlayControl = L.control.layers(null, overlayMaps, {
collapsed: true,
className: 'leaflet-control-layers overlay-layers',
id: 'overlay-layers-control'
}).addTo(map);
$('#sendToJOSM').on('click', () => {
sendToJOSM(map, geojsondata)
.then(() => {
console.log('Données envoyées à JOSM avec succès !');
})
.catch(() => {
alert('Erreur : JOSM doit être ouvert avec l\'option "Contrôle à distance" activée');
});
});
$('#josmLink').on('click', () => {
sendToJOSM(map, geojsondata)
.then(() => {
console.log('Données envoyées à JOSM avec succès !');
})
.catch(() => {
alert('Erreur : JOSM doit être ouvert avec l\'option de télécommande "Contrôle à distance" activée dans ses paramètres (accédez-y avec F12)');
});
});
$('#searchButton').on('click', searchLocation);
$('#shareUrl').on('click', copyCurrentUrl);
$('#filter_max_output').on('input', function () {
const value = $(this).val();
console.log('filter_max_output', value, $(this));
$('#filter_max_output_display').text(value + ' kW');
refreshDisplay();
});
$('#filter_max_output_slider').on('input', function () {
const value = $(this).val();
lcm_config.filter_max_output_default_value = value;
$('#filter_max_output_display').text(value + ' kW');
refreshDisplay();
});
$('#searchResults').on('change', function () {
const selectedIndex = $(this).eq(0).val();
if (selectedIndex !== null) {
const selectedPlace = $(this).find('option:selected').data('place');
moveToLocation(selectedPlace);
}
});
osmose_markers.addTo(map);
});
}
@ -1404,4 +1408,18 @@ init()
// Créer un nouveau pane pour les marqueurs Osmose avec un zIndex plus élevé
map.createPane('osmosePane');
map.getPane('osmosePane').style.zIndex = 1000;
map.getPane('osmosePane').style.zIndex = 1000;
// Ajouter une nouvelle fonction pour mettre à jour le compteur de stations filtrées
function updateFilteredStationsCount() {
const totalStations = geojsondata ? geojsondata.features.length : 0;
const filterStats = `<div class="filter-stats">${displayedStationsCount} stations sur ${totalStations} trouvées</div>`;
// Mettre à jour ou créer l'élément après le slider
let existingStats = $('.filter-stats');
if (existingStats.length) {
existingStats.replaceWith(filterStats);
} else {
$('#filter_max_output_display').after(filterStats);
}
}