diff --git a/mapper/src/App.js b/mapper/src/App.js index a80fe7b..b2d18f7 100644 --- a/mapper/src/App.js +++ b/mapper/src/App.js @@ -1,6 +1,7 @@ import React, { useState, useEffect, useRef, useMemo } from 'react'; import * as leaflet from 'leaflet'; -import { MapContainer, Polyline, TileLayer, useMap, useMapEvents } from 'react-leaflet'; +import 'leaflet-polylinedecorator'; +import { MapContainer, TileLayer, useMap, useMapEvents } from 'react-leaflet'; import Datetime from 'react-datetime'; import 'react-datetime/css/react-datetime.css'; import axios from 'axios'; @@ -129,6 +130,58 @@ function MapViewManager({ coords, mapState, setMapState, loading, setSubmenu }) return null; } +function PolylineWithArrows({ coords }) { + const map = useMap(); + const polylineRef = useRef(null); + const decoratorRef = useRef(null); + + useEffect(() => { + if (polylineRef.current) { + map.removeLayer(polylineRef.current); + } + if (decoratorRef.current) { + map.removeLayer(decoratorRef.current); + } + + if (coords && coords.length > 1) { + const polyline = leaflet.polyline(coords, { color: 'blue' }); + polylineRef.current = polyline; + map.addLayer(polyline); + + const decorator = leaflet.polylineDecorator(polyline, { + patterns: [ + { + offset: 25, + repeat: 100, + symbol: leaflet.Symbol.arrowHead({ + pixelSize: 15, + polygon: false, + pathOptions: { + stroke: true, + color: 'blue', + weight: 3 + } + }) + } + ] + }); + decoratorRef.current = decorator; + map.addLayer(decorator); + } + + return () => { + if (polylineRef.current) { + map.removeLayer(polylineRef.current); + } + if (decoratorRef.current) { + map.removeLayer(decoratorRef.current); + } + }; + }, [coords, map]); + + return null; +} + function Map({end, duration, slider, mapState, setMapState, setSubmenu}) { const [data, loading] = useSensor('owntracks', 'OwnTracks', end, duration); @@ -189,7 +242,7 @@ function Map({end, duration, slider, mapState, setMapState, setSubmenu}) { attribution='© OpenStreetMap contributors' url='https://maptiles.p.rapidapi.com/en/map/v1/{z}/{x}/{y}.png?rapidapi-key=4375b0b1d8msh0c9e7fa3efb9adfp1769dfjsnd603a0387fea' /> - + ) :