/** * rechercher les bornes de recharge, * afficher des cercles colorés selon la puissance max de la station * lister les bornes trouvées dans la page * @type {boolean} */ import {lcm_i18n} from './lcm_i18n.js'; // Détecter la langue du navigateur const currentLanguage = lcm_i18n.detectLanguage(); console.log('Langue détectée:', currentLanguage); import lcm_config from './lcm_config.js' import lcm_utils, { valid_qa_message } from './lcm_utils.js' import lcm_color_utils from './lcm_color_utils.js' import { sendToJOSM, createJOSMEditLink } from './lcm_editor.js' import Routing from './lcm_routing.js' let geojsondata; let lastLatLng; let searchLocationMarker = null; let count_hidden_by_filters = 0; let averageChargeKwh = 26; let routePolyline = null; let routeMarkers = []; let startMarker = null; let endMarker = null; let startCoords = null; let endCoords = null; // Déclarer les variables d'itinéraire au début let startItinerary = [0, 0]; let endItinerary = [0, 0]; // serveurs de tuiles: https://wiki.openstreetmap.org/wiki/Tile_servers // https://stamen-tiles.a.ssl.fastly.net/toner/{z}/{x}/{y}.png // https://a.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png // https://tile.openstreetmap.org/{z}/{x}/{y}.png // 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png' // Créer la carte centrée sur Rouen // Liste des 20 villes les plus peuplées de France avec leurs coordonnées géographiques // Initialisation de la carte avec la vue centrée sur la ville choisie let map = L.map('map') L.control.scale().addTo(map) // Initialiser le routing window.routing = new Routing(map); setCoordinatesOfLeafletMapFromQueryParameters() /** * filtres à toggle par des boutons dans la page * à appliquer à chaque rafraîchissement des points geojson * TODO: make buttons and filter in refresh circles */ let filterStatesAvailable = ['hide', 'show', 'showOnly'] let display_unknown_max_power_station = 'show'; let display_alert_cable_missing = 'show'; const start = map.getCenter(); const startLat = start.lat; const startLon = start.lng; // Ajouter cette fonction avant searchLocation function moveToLocation(place) { const lat = parseFloat(place.lat); const lon = parseFloat(place.lon); if (isNaN(lat) || isNaN(lon)) { console.error('Coordonnées invalides:', place); return; } // Supprimer l'ancien marqueur s'il existe if (searchLocationMarker) { map.removeLayer(searchLocationMarker); } // Créer un nouveau marqueur avec une icône personnalisée searchLocationMarker = L.marker([lat, lon], { icon: L.divIcon({ className: 'search-location-marker', html: '📍', iconSize: [30, 30], iconAnchor: [15, 30] }) }); // Ajouter un popup avec le nom du lieu const popupContent = ` ${place.display_name} ${place.type ? `
Type: ${place.type}` : ''} ${place.context ? `
${place.context}` : ''} `; searchLocationMarker.bindPopup(popupContent); // Ajouter le marqueur à la carte searchLocationMarker.addTo(map); // Désactiver temporairement l'événement moveend map.off('moveend', onMapMoveEnd); // Centrer la carte sur le lieu map.setView([lat, lon], map.getZoom()); // Réactiver l'événement moveend après un court délai setTimeout(() => { map.on('moveend', onMapMoveEnd); }, 500); // Ouvrir le popup automatiquement searchLocationMarker.openPopup(); } // Déplacer searchLocationWithAddok avant searchLocation function searchLocationWithAddok(searchText, mapCenter) { const baseUrl = 'https://demo.addok.xyz/search'; const params = new URLSearchParams({ q: searchText, limit: 10, lat: mapCenter.lat, lon: mapCenter.lng }); const url = `${baseUrl}?${params.toString()}`; return fetch(url) .then(response => { if (!response.ok) { throw new Error('Erreur réseau lors de la recherche'); } return response.json(); }) .then(data => { if (!data.features || data.features.length === 0) { throw new Error('Aucun résultat trouvé'); } return data.features.map(feature => ({ lat: feature.geometry.coordinates[1], lon: feature.geometry.coordinates[0], display_name: feature.properties.label, importance: feature.properties.score, context: feature.properties.context, type: feature.properties.type, city: feature.properties.city, distance: feature.properties.distance })); }); } // Modifier la fonction searchLocation function searchLocation() { const location = $('#searchLocation').val(); if (!location) { alert('Veuillez entrer un lieu à rechercher.'); return; } const useAddok = $('#useAddok').is(':checked'); const searchPromise = useAddok ? searchLocationWithAddok(location, map.getCenter()) : fetch(`https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(location)}`) .then(response => response.json()); searchPromise .then(data => { const resultsDropdown = $('#searchResults'); resultsDropdown.empty(); if (!data || data.length === 0) { alert('Lieu non trouvé. Veuillez essayer un autre terme de recherche.'); resultsDropdown.hide(); return; } // Toujours sélectionner le premier résultat moveToLocation(data[0]); displayPointsFromApi(); // Si il y a plus d'un résultat, les afficher quand même dans la liste if (data.length > 1) { // Vérifier si le bouton de fermeture existe déjà if ($('.close-results-button').length === 0) { const closeButton = $('
`) .openOn(map); }); } function copyCurrentUrl() { const url = window.location.href; var dummy = document.createElement('input'), text = window.location.href; document.body.appendChild(dummy); dummy.value = text; dummy.select(); document.execCommand('copy'); document.body.removeChild(dummy); } init() // Créer un nouveau pane pour les marqueurs Osmose avec un zIndex plus élevé map.createPane('osmosePane'); 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 = `
${displayedStationsCount} stations sur ${totalStations} trouvées
`; // 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); } }