Map Layers

Toggle overlays to compare coverage.

Interactive Emergency Alert Map
Loading...
Last updated --
Waiting
Next refresh in --
Loading Interactive Map...
Initializing Leaflet map for Putnam County, OH
Map Legend

Alert Severity

Extreme
Severe
Moderate
Minor

Alert Status

Active Alerts
Historical Alerts

Boundaries & Layers

Layers will appear when data is loaded.

Active Alert Breakdown

Alert types will appear after the next data refresh.

Platform Capabilities
SAME Audio
SDR Verify
Spatial GIS
Auto RWT
LED Signs
MDC1200 Selective Calling

MDC1200 selective calling lets EAS alerts break squelch only on authorised LMR radios — with full PTT-ID identification and dispatch console logging.

Learn about all features
`); showToast(`Comprehensive boundary inspection complete: ${data.features.length} boundaries across ${sortedTypes.length} types`, 'success'); } else { showToast('No boundaries found in system', 'warning'); } } catch (error) { console.error('❌ Error inspecting boundaries:', error); showToast('Failed to inspect boundaries: ' + error.message, 'error'); } } // Error handling function showMapError(message) { const mapContainer = document.getElementById('map'); if (mapContainer) { mapContainer.innerHTML = `

Map Loading Error

${message}

`; } } // Initialize everything when page loads document.addEventListener('DOMContentLoaded', async function() { console.log('📄 Interactive map page loaded'); try { await initMap(); if (isMapReady) { scheduleAutoRefresh(); } // Keyboard shortcuts document.addEventListener('keydown', function(e) { if (e.key === 'r' || e.key === 'R') { if (!e.ctrlKey && !e.metaKey) { e.preventDefault(); refreshData({ includeBoundaries: true, reason: 'Keyboard shortcut' }); } } }); } catch (error) { console.error('❌ Error initializing page:', error); showMapError('Failed to initialize map interface: ' + error.message); } }); console.log('📜 Interactive map script loaded'); // Make diagnostic functions available globally for debugging window.mapDebug = { testAPIs: async function() { console.log('🔍 Testing all API endpoints...'); const endpoints = [ '/api/alerts', '/api/boundaries' ]; for (const endpoint of endpoints) { try { const response = await fetch(endpoint); const data = await response.json(); console.log(`✅ ${endpoint}: ${response.status}`, data); } catch (error) { console.error(`❌ ${endpoint}: ${error.message}`); } } }, refreshAll: function() { console.log('🔄 Refreshing all map data...'); refreshData({ includeBoundaries: true, reason: 'Debug refresh' }); }, inspectMap: function() { console.log('🗺️ Map inspection:'); console.log('Map object:', map); console.log('Alert layer:', alertLayer); console.log('Boundary layers:', boundaryLayers); console.log('Alert data:', alertData); }, analyzeBoundaries: async function() { console.log('📊 Analyzing boundary data...'); try { const response = await fetch('/api/boundaries'); const data = await response.json(); if (data.features) { const analysis = {}; data.features.forEach(boundary => { const props = boundary.properties || {}; const typeKey = resolveCanonicalBoundaryType(props.canonical_type || props.type || props.raw_type || 'unknown'); if (!analysis[typeKey]) { analysis[typeKey] = { count: 0, examples: [], label: formatBoundaryLabel(typeKey) }; } analysis[typeKey].count++; if (analysis[typeKey].examples.length < 3) { analysis[typeKey].examples.push({ name: props.name, id: props.id }); } }); console.log('📋 Boundary Analysis:'); const tableData = Object.entries(analysis).map(([key, info]) => ({ type: info.label || formatBoundaryLabel(key), count: info.count, examples: info.examples.map(example => example.name).join(', ') })); console.table(tableData); return analysis; } } catch (error) { console.error('❌ Analysis failed:', error); } } }; console.log('💡 Debug functions available:'); console.log(' • window.mapDebug.testAPIs() - Test all API endpoints'); console.log(' • window.mapDebug.refreshAll() - Refresh all map data'); console.log(' • window.mapDebug.inspectMap() - Inspect map objects'); console.log(' • window.mapDebug.analyzeBoundaries() - Analyze boundary types');