Spaces:
Paused
Paused
| <script> | |
| import { onMount, onDestroy } from 'svelte'; | |
| let map; | |
| let mapElement; | |
| export let setViewLocation = [51.505, -0.09]; | |
| export let points = []; | |
| export let onClick = (e) => {}; | |
| let markerGroupLayer = null; | |
| onMount(async () => { | |
| const [{ default: L }] = await Promise.all([ | |
| import('leaflet'), | |
| import('leaflet/dist/leaflet.css') | |
| ]); | |
| map = L.map(mapElement).setView(setViewLocation ? setViewLocation : [51.505, -0.09], 10); | |
| if (setViewLocation) { | |
| points = [ | |
| { | |
| coords: setViewLocation, | |
| content: `Lat: ${setViewLocation[0]}, Lng: ${setViewLocation[1]}` | |
| } | |
| ]; | |
| } | |
| L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { | |
| attribution: | |
| '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' | |
| }).addTo(map); | |
| const setMarkers = (points) => { | |
| if (map) { | |
| if (markerGroupLayer) { | |
| map.removeLayer(markerGroupLayer); | |
| } | |
| let markers = []; | |
| for (let point of points) { | |
| const marker = L.marker(point.coords).bindPopup(point.content); | |
| markers.push(marker); | |
| } | |
| markerGroupLayer = L.featureGroup(markers).addTo(map); | |
| try { | |
| map.fitBounds(markerGroupLayer.getBounds(), { | |
| maxZoom: Math.max(map.getZoom(), 13) | |
| }); | |
| } catch (error) {} | |
| } | |
| }; | |
| setMarkers(points); | |
| map.on('click', (e) => { | |
| console.log(e.latlng); | |
| onClick(`${e.latlng.lat}, ${e.latlng.lng}`); | |
| setMarkers([ | |
| { | |
| coords: [e.latlng.lat, e.latlng.lng], | |
| content: `Lat: ${e.latlng.lat}, Lng: ${e.latlng.lng}` | |
| } | |
| ]); | |
| }); | |
| }); | |
| onDestroy(async () => { | |
| if (map) { | |
| console.log('Unloading Leaflet map.'); | |
| map.remove(); | |
| } | |
| }); | |
| </script> | |
| <div class=" z-10 w-full"> | |
| <div bind:this={mapElement} class="h-96 z-10" /> | |
| </div> | |