петли листовки, чтобы проверить, существует ли маркер уже в кластере (чтобы не дублировать его)

#javascript #jquery #leaflet #leaflet.markercluster

Вопрос:

У меня есть карта-листовка, которая содержит маркеры для 10 самых густонаселенных городов в стране. Когда пользователь нажимает на маркер города, выполняется вызов AJAX. Я передаю код города lat, lng и страны в API, который возвращает 5 близлежащих аэропортов (название, lat, lng). Затем я просматриваю полученные данные JSON, чтобы разместить маркеры для каждого аэропорта на карте.

Моя проблема в том, что некоторые города находятся рядом друг с другом, и поэтому на карте иногда размещается дубликат маркера аэропорта.

Я хочу предотвратить дублирование маркеров на карте. Я попытался создать новый массив, а затем отфильтровать его, но я не могу заставить это работать.

Мне также интересно, есть ли более простое решение этой проблемы. Любая помощь была бы очень признательна. Соответствующий код ниже:

 if (map.hasLayer(capCityCluster)) {
  map.removeLayer(capCityCluster);
}
capCityCluster = new L.markerClusterGroup();
map.addLayer(capCityCluster);

var largeCityMarker = L.marker(new L.LatLng(cityLat, cityLng), ({
  icon: cityIcon
})).bindPopup(`<div class="markerContainer"><h3>${cityName}</h3><img class="markerThumbnail" src='${cityThumbnailImg}' onerror="this.style.display='none'"><p class="markerTxtDescription">${cityInfo}</p><div id="city-link"><a href="//${cityUrl}" target="_blank">${cityText}</a></div></div>`, cityOptions).once('click', function(e) {
  map.flyTo(e.latlng, 10);
  $.ajax({
    url: "assets/php/airports.php",
    type: 'GET',
    dataType: 'json',
    data: {
      lat: this.getLatLng().lat,
      lng: this.getLatLng().lng,
      countryCodeA2: borderCountryCode,
    },
    success: function(result) {
      //airport markers
      result.data.capCityAirports.items.forEach(airport => {
        var airportIcon = L.icon({
          iconUrl: 'assets/img/icons/airport.png',
          iconSize: [50, 50],
          popupAnchor: [0, -15]
        });
        airportName = airport.title;
        airportLat = airport.position.lat;
        airportLng = airport.position.lng;
        var airportMarker = L.marker(new L.LatLng(airportLat, airportLng), ({
          icon: airportIcon
        })).bindPopup(airportName);
        capCityCluster.addLayer(airportMarker);
      });
 

Ответ №1:

Вы можете просмотреть все слои в группе и проверить, существует ли маркер с одинаковыми значениями:

 var alreadyExists = false;

var latlng = new L.LatLng(airportLat, airportLng);
capCityCluster.getLayers().forEach((layer)=>{
    if(!alreadyExists amp;amp; layer instanceof L.Marker amp;amp; layer.getLatLng().equals(latlng)){
       alreadyExists = true;
    }
});

// if alreadyExists is true, it is a duplicate
if(!alreadyExists){
    var airportMarker = L.marker(latlng, {
      icon: airportIcon
    }).bindPopup(airportName);

    capCityCluster.addLayer(airportMarker);
}
 

Также у вас есть ошибка в создании маркера. удалите параметры () вокруг:

 var airportMarker = L.marker(new L.LatLng(airportLat, airportLng), >>>(<<<{
          icon: airportIcon
        }>>>)<<<).bindPopup(airportName);
 

Комментарии:

1. Большое вам спасибо! Это работает, но мне пришлось изменить getLatLngs() на getLatLng() без буквы «s». Кажется, это работает таким образом, но мне интересно, может ли это в какой-то момент вызвать проблему?

2. Это была моя ошибка, опечатка! Слой маркера не имеет getLatLngs() , getLatLng() правильно