-1

Я пытаюсь добавить только последний маркер, если местоположение имеет многократную точную долготу и широту.Как показать только последний маркер в нескольких точном месте на картах Google с помощью angularjs

Это мой контроллер:

.controller('MapsController', ['$scope', '$http', function ($scope, $http) { 

var map; 

//Marker clusterer 
var mc; 
var mcOptions = { gridSize: 20, maxZoom: 17, imagePath: "images/m" }; 

//Global infoWindow 
var infowindow = new google.maps.InfoWindow(); 

//Geocoder 
var geocoder = new google.maps.Geocoder(); 

$scope.loadData = function() { 
    var url = 'data/LatLng.json'; 
    return $http.get(url).then(function (response) { 
     return response.data; 
    }); 
}; 

function createMarker(latlng, info, data) { 
    var marker = new google.maps.Marker({ 
     position: latlng, 
     map: map 
    }); 

    //Get array of markers currently in cluster 
    var allMarkers = mc.getMarkers(); 

    //Check to see if any of the existing markers match the latlng of the new marker 
    if (allMarkers.length != 0) { 

     var count = 1; 
     var morethanone = false; 

     for (var i = 0; i < allMarkers.length; i++) { 

      var existingMarker = allMarkers[i]; 
      var pos = existingMarker.getPosition(); 

      if (latlng.equals(pos)) { 

       info = info + info; 

       count = count + 1; 
       morethanone = true; 
      } 
     } 
    } 

    google.maps.event.addListener(marker, 'click', function() { 
     infowindow.close(); 
     infowindow.setContent(info); 
     infowindow.open(map, marker); 
    }); 

    if (morethanone) { 
     for (var a = 1; a < count; a++) { 
      if (a === (count - 1)) { 
       marker.setLabel(String(count)); 
       mc.addMarker(marker); 
      } 
     } 
    } 
    else { 
     marker.setLabel(String(count)); 
     mc.addMarker(marker); 
    } 
    console.log(count); 
    return marker; 
} 

$scope.initMap = function (data) { 
    var mapOptions = { 
     zoom: 7, 
     center: new google.maps.LatLng(3.9443, 101.6954), 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 

    var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); 

    var gmarkers = []; 
    mc = new MarkerClusterer(map, [], mcOptions); 

    data.forEach(function (item) { 

     var latlng = new google.maps.LatLng(item.LAT, item.LON); 
     var info = item.Cat + "," + item.Type; 
     gmarkers.push(createMarker(latlng, info, data)); 
    }); 
}; 

$scope.loadData() 
    .then($scope.initMap); 

}]) 

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

enter image description here

То, что я хочу только показать один маркер (который является последним маркером) с меткой «5» на нем.

Любые идеи, как это сделать?

Thank you.

+0

Я думаю, что ваш код делает именно то, что вы говорите ему. Когда имеется более одного маркера, вы все равно добавляете его кластер маркеров. Кроме того, поскольку, когда вы создаете маркер, который вы передаете в «карте» в конфигурации, этот маркер будет прикреплен к этой карте. Перед созданием нового маркера вам нужно сделать чек, или не назначать маркер карте, пока вы не проверите. –

ответ

0

Непрошеный, но попробуйте это.

.controller('MapsController', ['$scope', '$http', function ($scope, $http) { 

var map;  
//Marker clusterer 
var mc; 
var mcOptions = { gridSize: 20, maxZoom: 17, imagePath: "images/m" }; 

//Global infoWindow 
var infowindow = new google.maps.InfoWindow(); 

//Geocoder 
var geocoder = new google.maps.Geocoder(); 

$scope.loadData = function() { 
    var url = 'data/LatLng.json'; 
    return $http.get(url).then(function (response) { 
     return response.data; 
    }); 
}; 

    $scope.initMap = function (data) { 
    var mapOptions = { 
     zoom: 7, 
     center: new google.maps.LatLng(3.9443, 101.6954), 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 

    var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); 

    var gmarkers = []; 
    mc = new MarkerClusterer(map, [], mcOptions); 

    data.forEach(function (item) {  
     var latlng = new google.maps.LatLng(item.LAT, item.LON); 
     var info = item.Cat + "," + item.Type; 
     gmarkers.push(createMarker(latlng, info, data)); 
    }); 
}; 


function createMarker(latlng, info, data) { 
    //Get array of markers currently in cluster 
    var allMarkers = mc.getMarkers(); 

    // Filter to duplicate markers 
    var dupeMarkers = allMarkers.filter(function (existingMarker) { 
     var pos = existingMarker.getPostion(); 
     return latlng.equals(pos) 
    }); 

    // Remove duplicate markers 
    dupeMarkers.forEach(function(dupeMarker) { 
     mc.removeMarker(dupeMarker); // remove from cluster 
     dupeMarker.setMap(null); // remove from map 
    }); 

    // Add marker to the map 
    var newMarker = new google.maps.Marker({ 
     position: latlng, 
     map: map 
    });    

    // Add marker to the cluster 
    mc.addMarker(newMarker); 

    // If you want to set the label to count of markers that are/were at this location 
    marker.setLabel(dupeMarkers.length + 1); 

    google.maps.event.addListener(newMarker, 'click', function() { 
     infowindow.close(); 
     infowindow.setContent(info); 
     infowindow.open(map, newMarker); 
    }); 

    return newMarker; 
} 


$scope.loadData() 
    .then($scope.initMap);  
}]); 
+0

Недостатком этого является то, что, поскольку код удаляет маркеры обмана, он не будет знать, что маркеры были там раньше. Вы можете изменить код, чтобы отслеживать счет и увеличивать его. –

+0

Привет @Ray, не могли бы вы показать мне, где я должен поставить счетчик? – CoolTips2u

+0

Привет @Ray, я пробовал ваш код, он не работает. Он по-прежнему добавляет несколько ярлыков на нем, как мой предыдущий код. – CoolTips2u

Смежные вопросы