// Configuration des critères d'emojis pour les marqueurs de carte window.EMOJI_CRITERIA = { // Emoji mammouth pour les événements contenant "mammouth" mammoth: { emoji: '🦣', criteria: (name, description, what) => { const text = (name + ' ' + description).toLowerCase(); return text.includes('mammouth'); } }, // Emoji notes de musique pour orchestres, concerts, fanfares ou types musicaux music: { emoji: '🎵', criteria: (name, description, what) => { const text = (name + ' ' + description + ' ' + what).toLowerCase(); return text.includes('orchestr') || text.includes('concert') || text.includes('fanfare') || text.includes('music'); } }, // Emoji éclair pour les types contenant "power" power: { emoji: '⚡', criteria: (name, description, what) => { return (what || '').toLowerCase().includes('power'); } }, // Emoji vélo pour les types contenant "bike" bike: { emoji: '🚴', criteria: (name, description, what) => { return (what || '').toLowerCase().includes('bike'); } }, // Emoji casque de chantier pour les travaux construction: { emoji: '🏗️️', criteria: (name, description, what) => { const text = (name + ' ' + description + ' ' + what).toLowerCase(); return text.includes('travaux'); } }, // Emoji soleil pour les types contenant "daylight" daylight: { emoji: '☀️', criteria: (name, description, what) => { return (what || '').toLowerCase().includes('daylight'); } }, // Emoji carte pour les types contenant "community.osm" osm_community: { emoji: '🗺️', criteria: (name, description, what) => { return (what || '').toLowerCase().includes('community.osm'); } } }; // Fonction pour déterminer l'emoji approprié pour un événement function getEventEmoji(properties) { const name = properties.name || properties.label || ''; const description = properties.description || ''; const what = properties.what || ''; if (what.includes('accident')) return 'PAF!'; if (what.includes('incident')) return '⚠️'; if (what.includes('traffic')) return '🚗'; // Parcourir les critères dans l'ordre de priorité for (const [key, config] of Object.entries(window.EMOJI_CRITERIA)) { if (config.criteria(name, description, what)) { return config.emoji; } } // Emoji par défaut selon le type d'événement if (what.includes('weather')) return '🌤️'; if (what.includes('gathering')) return '👥'; return ' '; // Emoji par défaut } // Variables globales let map; let eventMarkers = []; let eventTypeCounts = {}; let allEvents = []; // Initialisation de la carte document.addEventListener('DOMContentLoaded', function() { initMap(); loadEvents(); }); function initMap() { // Initialiser la carte MapLibre map = new maplibregl.Map({ container: 'map', style: 'https://tiles.openfreemap.org/styles/liberty', center: [2.3522, 48.8566], // Paris par défaut zoom: 4 }); // Ajouter les contrôles de navigation map.addControl(new maplibregl.NavigationControl()); // Ajouter le contrôle de géolocalisation map.addControl(new maplibregl.GeolocateControl({ positionOptions: { enableHighAccuracy: true }, trackUserLocation: true, showUserHeading: true })); } function loadEvents() { fetch('https://api.openeventdatabase.org/event?') .then(response => response.json()) .then(data => { if (data.features && data.features.length > 0) { allEvents = data.features; processEvents(); createEventTypeFilters(); addEventsToMap(); updateEventInfo(); } else { document.getElementById('event-info').innerHTML = '
No events found
'; } }) .catch(error => { console.error('Error loading events:', error); document.getElementById('event-info').innerHTML = 'Error loading events
'; }); } function processEvents() { eventTypeCounts = {}; allEvents.forEach(event => { const eventType = event.properties.what || 'unknown'; eventTypeCounts[eventType] = (eventTypeCounts[eventType] || 0) + 1; }); } function createEventTypeFilters() { const filterList = document.getElementById('filter-list'); filterList.innerHTML = ''; const sortedTypes = Object.keys(eventTypeCounts).sort(); sortedTypes.forEach(eventType => { const count = eventTypeCounts[eventType]; const li = document.createElement('li'); const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.id = `filter-${eventType}`; checkbox.checked = true; checkbox.addEventListener('change', filterEvents); const label = document.createElement('label'); label.htmlFor = `filter-${eventType}`; label.textContent = `${eventType} (${count})`; li.appendChild(checkbox); li.appendChild(label); filterList.appendChild(li); }); // Boutons de sélection document.getElementById('select-all').addEventListener('click', () => { document.querySelectorAll('#filter-list input[type="checkbox"]').forEach(cb => { cb.checked = true; }); filterEvents(); }); document.getElementById('deselect-all').addEventListener('click', () => { document.querySelectorAll('#filter-list input[type="checkbox"]').forEach(cb => { cb.checked = false; }); filterEvents(); }); } function addEventsToMap() { // Supprimer les marqueurs existants eventMarkers.forEach(marker => marker.remove()); eventMarkers = []; // Ajouter les nouveaux marqueurs avec emojis allEvents.forEach(event => { const coordinates = event.geometry.coordinates; const properties = event.properties; // Créer l'élément marqueur avec emoji et forme de goutte const el = document.createElement('div'); el.className = 'custom-marker'; // Créer la forme de goutte en arrière-plan avec emoji el.innerHTML = `Type: ${what}
Description: ${description}
${eventId ? `` : `ID non disponible
` }Showing ${visibleCount} of ${totalCount} events
Event types: ${checkedTypes.length} selected
`; }