проверка дубликатов маркеров листовка геоман

Я пытаюсь проверить каждую функцию geojson, если это маркер. Если это так, я хочу удалить размещенный слой, затем снова инициализируйте маркер рисования.

Если это не та позиция, я просто добавлю ее в векторный слой.

Проблема в том, что eachLayer всегда возвращает true, потому что он проходит по всем слоям, и всегда возвращает true, потому что маркер добавлен к функции. Так всегда повторяется.

features.eachLayer(layer => {
  if(layer.pm._shape === 'Marker') {
    if(e.layer._latlng !== layer._latlng) { //This is never true, should be true if the placed marker is not placed over an existing features marker
      features.addLayer(e.layer);

    } else if(e.layer._latlng === layer._latlng) { //this elseif is always true for some reason and will loop
      map.removeLayer(e.layer)
      DrawUtil.addMarker(map, isSnapping); //Alias for pm.enableDraw.marker
      features.addLayer(e.layer);
    }
  }
})

Вот скрипка, я плохо забыл добавить жизненно важный код. https://jsfiddle.net/2ftmy0bu/2/


person Henrik Maaland    schedule 12.10.2020    source источник
comment
Я думаю, вы вызываете это в событии pm:create, пожалуйста, добавьте полный код. Также проверьте, является ли слой маркером с layer instanceof L.Marker и совпадает ли он по широте с e.layer.getLatLng().equals(layer.getLatLng()). Пожалуйста, создайте jsfiddle, это облегчит помощь   -  person Falke Design    schedule 12.10.2020
comment
Виноват. Добавлен jsfiddle. и да, предоставленный код был вызван в pm: create   -  person Henrik Maaland    schedule 12.10.2020


Ответы (1)


Измените свой код на:

// listen to when a new layer is created
map.on('pm:create', function(e) {
    //should only place one marker each time

    // check if the layer with the same latlng exists
    var eq = features.getLayers().find(function(layer){
      if(layer instanceof L.Marker) {
                return layer.getLatLng().equals(e.layer.getLatLng())
      }else{
        return false;
      }
  }) !== undefined;

  if(!eq) {
    console.log('not equal')
    features.addLayer(e.layer);
    map.pm.disableDraw('Marker')
    //if marker is placed on the map and it is not placed on same place as another marker
  } else if(eq) {
    console.log('equal')
    //if marker is placed on the map over another marker, remove marker, then init draw marker again.
    map.removeLayer(e.layer);
    map.pm.enableDraw('Marker', {
      snappable: true,
      snapDistance: 20,
      finishOn: 'click' || 'mousedown',
    });
    // TODO: I think you don't want this
    //   features.addLayer(e.layer);
  }   
});

https://jsfiddle.net/falkedesign/c6Lf758j/

person Falke Design    schedule 12.10.2020