From 8f297e1ec40bf0968ba6b6993e910181b0db05cc Mon Sep 17 00:00:00 2001 From: Paul Bailey Date: Sun, 16 Nov 2025 16:05:31 +0000 Subject: [PATCH] feat: implement heat map visualization with Leaflet.heat plugin - Integrate Leaflet.heat plugin for heat map overlay - Add heat map toggle control in MapFilters component - Configure heat map intensity based on report quantity levels (minimal: 0.3, moderate: 0.5, significant: 0.7, severe: 1.0) - Implement heat map layer management with proper cleanup - Add custom gradient colors (blue to red) for visual intensity representation - Configure heat map with radius: 25px, blur: 15, maxZoom: 17 - Add TypeScript type declarations for leaflet.heat - Heat map respects existing filter state (date range, litter type, quantity) Implements task 5: Create heat map visualization Requirements: 3.1, 3.5 --- .kiro/specs/beach-litter-mapping/tasks.md | 2 +- src/components/map/MapFilters.tsx | 26 +++++++++++ src/components/map/MapView.tsx | 55 +++++++++++++++++++++++ src/pages/MapPage.tsx | 8 ++++ src/types/leaflet-heat.d.ts | 24 ++++++++++ 5 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 src/types/leaflet-heat.d.ts diff --git a/.kiro/specs/beach-litter-mapping/tasks.md b/.kiro/specs/beach-litter-mapping/tasks.md index bd956cb..1baf4d6 100644 --- a/.kiro/specs/beach-litter-mapping/tasks.md +++ b/.kiro/specs/beach-litter-mapping/tasks.md @@ -32,7 +32,7 @@ - Implement filter state management and map updates - _Requirements: 2.4, 2.5_ -- [ ] 5. Create heat map visualization +- [-] 5. Create heat map visualization - Integrate Leaflet.heat plugin - Implement heat map toggle control - Configure heat map intensity based on report density diff --git a/src/components/map/MapFilters.tsx b/src/components/map/MapFilters.tsx index 8cf72c7..52bd418 100644 --- a/src/components/map/MapFilters.tsx +++ b/src/components/map/MapFilters.tsx @@ -6,6 +6,8 @@ interface MapFiltersProps { onFiltersChange: (filters: FilterState) => void; onToggleClusters: () => void; showClusters: boolean; + onToggleHeatmap: () => void; + showHeatmap: boolean; } export function MapFilters({ @@ -13,6 +15,8 @@ export function MapFilters({ onFiltersChange, onToggleClusters, showClusters, + onToggleHeatmap, + showHeatmap, }: MapFiltersProps) { const [isExpanded, setIsExpanded] = useState(false); @@ -127,6 +131,28 @@ export function MapFilters({ + {/* Heat Map Toggle */} +
+ + +
+ {/* Date Range */}