// Initialize map for index.html function initializeMap(reports = []) { // Define bounds to lock the map to one world instance const bounds = L.latLngBounds( L.latLng(-85, -180), // Southwest corner L.latLng(85, 180) // Northeast corner ); // Initialize map with USA centered (~39°N, -100°W) const map = L.map('map', { maxBounds: bounds, maxBoundsViscosity: 1.0, // Prevents panning outside bounds worldCopyJump: false // Disables jumping to world copies }).setView([39, -100], 2); // Center on USA, zoom level 4 // Add tile layer with noWrap to prevent tiling beyond -180/180 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap', maxZoom: 18, minZoom: 2, // Prevent zooming out too far noWrap: true // Disable horizontal wrapping }).addTo(map); // Custom arrow icon const ArrowIcon = L.divIcon({ className: 'arrow-icon', html: '
', iconSize: [20, 20], iconAnchor: [10, 10] }); // Add markers from reports reports.forEach(report => { const icon = L.divIcon({ className: 'arrow-icon', html: `
`, iconSize: [20, 20], iconAnchor: [10, 10] }); L.marker([report.latitude, report.longitude], { icon }) .addTo(map) .bindPopup(` Anomaly Report
Observer: ${report.observer_name || 'Anonymous'}
Description: ${report.description || 'No description'}
Timestamp: ${report.timestamp || 'N/A'} `); }); } // Initialize map for add_report.html function initializeAddReportMap() { // Define bounds to lock the map const bounds = L.latLngBounds( L.latLng(-85, -180), L.latLng(85, 180) ); // Initialize map with USA centered const map = L.map('map', { maxBounds: bounds, maxBoundsViscosity: 1.0, worldCopyJump: false }).setView([39, -100], 2); // Add tile layer with noWrap L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap', maxZoom: 18, minZoom: 2, noWrap: true }).addTo(map); let marker = null; let direction = 0; // Handle map click to place marker map.on('click', function(e) { if (marker) { map.removeLayer(marker); } const icon = L.divIcon({ className: 'arrow-icon', html: `
`, iconSize: [20, 20], iconAnchor: [10, 10] }); marker = L.marker(e.latlng, { icon }).addTo(map); document.getElementById('latitude').value = e.latlng.lat.toFixed(6); document.getElementById('longitude').value = e.latlng.lng.toFixed(6); document.getElementById('direction').value = direction; }); // Handle direction input document.getElementById('direction').addEventListener('input', function(e) { direction = parseFloat(e.target.value) || 0; if (marker) { const icon = L.divIcon({ className: 'arrow-icon', html: `
`, iconSize: [20, 20], iconAnchor: [10, 10] }); map.removeLayer(marker); marker = L.marker([parseFloat(document.getElementById('latitude').value), parseFloat(document.getElementById('longitude').value)], { icon }).addTo(map); document.getElementById('direction').value = direction; } }); // Handle form submission document.getElementById('report-form').addEventListener('submit', function(e) { e.preventDefault(); const formData = new FormData(this); fetch('/add_report', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { alert(data.message); if (data.status === 'success') { window.location.href = '/'; } }) .catch(error => { alert('Error: ' + error.message); }); }); }