Desc:
Using leaflet and made an class called Map to use all features easily whenever I need, All set but there is simple problem that I can't handle it. map on init create a marker on center, but I want to let user create new marker on click but remove prev one, already if you click on map it create many marker, but I want only one marker.
All I need is this code:
if (marker) this.map.removeLayer(marker);
But of course it give me such error:
ReferenceError: marker is not defined"
Problem:
Because prev marker created in marker() but new marker create in newMarker() function, so I have no idea how can I remove old marker, I did this before when my code wasn't class easily access let marker, but now I confused how to access marker variable in marker() function.
Goal: (in short)
I just want one marker after click on map, already it create many markers on map!
You can initialize an empty layerGrooup and store the marker there every time and when you add a new one you can clear the layers of the markerGroup.
Moreover you should not instantiate your map two times so you have only one map reference.
class Map {
constructor(map, lat_long) {
this.map = map;
this.lat_long = lat_long;
this.markerLayer = L.layerGroup().addTo(this.map)
},
...
newMarker(latLng) {
this.markerLayer.clearLayers();
L.marker(latLng, {
draggable: true
}).addTo(this.markerLayer);
}
}
class Map {
constructor(map, lat_long) {
this.map = map;
this.lat_long = lat_long;
this.markerLayer = L.layerGroup().addTo(this.map)
}
get init() {
return this.display();
}
display() {
this.map.setView(this.lat_long, 14);
this.tile();
this.marker();
}
tile() {
L.tileLayer('https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.png', {
maxZoom: 20,
}).addTo(this.map);
}
marker() {
let marker = L.marker(this.lat_long, {
draggable: true
}).addTo(this.markerLayer);
}
newMarker(latLng) {
this.markerLayer.clearLayers();
L.marker(latLng, {
draggable: true
}).addTo(this.markerLayer);
}
}
let lat_long = [40.741895, -73.989308];
let leaflet = new L.map('map');
const map = new Map(leaflet, lat_long);
map.init;
leaflet.on('click', function(e) {
map.newMarker([e.latlng.lat, e.latlng.lng]);
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.8.0/dist/leaflet.css" integrity="sha512-hoalWLoI8r4UszCkZ5kL8vayOGVae1oxXe/2A4AO6J9+580uKHDO3JdHb7NzwwzK5xr/Fs0W40kiNHxM9vyTtQ==" crossorigin="" />
<script src="https://unpkg.com/leaflet@1.8.0/dist/leaflet.js" integrity="sha512-BB3hKbKWOc9Ez/TAwyWxNXeoV9c1v6FIeYiBieIWkpLjauysF18NzgR1MBNBXf8/KABdlkX68nAhlwcDFLGPCQ==" crossorigin=""></script>
<div id="map" style="height:400px"></div>