import { LatLng, LatLngExpression, LatLngTuple, LayerGroup, Marker, MarkerOptions, Polyline } from "leaflet"; export type TrackEventHandler = (track:Polyline)=>void; export class TrackableMarker extends Marker { private tracks:Array = new Array(); private initalTrackColor:string; private latestTrack:Polyline = null; private previousDoTrack:boolean = true; private previousColor: string; private trackLayers:LayerGroup = null; constructor(latlng:LatLngExpression,options?:MarkerOptions,trackColor?:string) { super(latlng,options) this.initalTrackColor = trackColor ?? '#3388ff'; this.previousColor = this.initalTrackColor; this.trackLayers = new LayerGroup(); this.latestTrack = new Polyline([latlng],{color:trackColor}); this.latestTrack.addTo(this.trackLayers); } set TracksLayer(g:LayerGroup) { this.trackLayers = g; } trackForward(latlng:LatLngExpression,doTrack:boolean = true,trackColor?: string) { if(!doTrack) { this.previousDoTrack = doTrack; if(trackColor) this.previousColor = trackColor return; } if(!this.latestTrack) { this.latestTrack = new Polyline([latlng],{color:trackColor || this.previousColor}); this.latestTrack.addTo(this.trackLayers); return; } else if(trackColor && this.latestTrack.options !== trackColor) { this.tracks.push(this.latestTrack) const lastLatLng: any = this.latestTrack.getLatLngs()[this.latestTrack.getLatLngs().length - 1] this.latestTrack = new Polyline([lastLatLng,latlng],{color:trackColor}); this.latestTrack.addTo(this.trackLayers); this.previousColor = trackColor return; } if(this.previousDoTrack) { this.latestTrack.addLatLng(latlng); } else { this.tracks.push(this.latestTrack); this.latestTrack = new Polyline([latlng],{color:trackColor || this.previousColor}); this.latestTrack.addTo(this.trackLayers); } this.previousDoTrack = doTrack; } trackBackward(doTrack:boolean = true) { if(!doTrack) { return; } if(!this.latestTrack) { this.latestTrack = this.tracks.pop(); } const latlngs = this.latestTrack.getLatLngs(); if(latlngs.length <= 1) { this.trackLayers.removeLayer(this.latestTrack); this.latestTrack = this.tracks.pop(); return; } this.latestTrack.setLatLngs(latlngs.slice(0,latlngs.length - 1)); } removeTracks() { if(this.latestTrack) { this.trackLayers.removeLayer(this.latestTrack); this.latestTrack = null; } this.tracks.forEach((l) => this.trackLayers.removeLayer(l)); } }