Я работаю над Map Javascript API, теперь я могу получать данные с помощью ajax и loop для отображения нескольких маркеров. Однако, когда я попытался добавить функцию setInterval для обновления данных каждые 15 секунд, маркеры продолжают дублироваться и создают бесконечные маркеры вместо обновления текущих маркеров. Я попробовал каждое решение здесь, но я не могу найти правильный способ избежать дублирования данных. Все, что мне нужно, это просто вызывать функцию ajax каждые 15 секунд и обновлять широту и длину маркера, чтобы это выглядело как обновление в реальном времени. Заранее спасибо за помощь в решении этой проблемы. Вот мой код:
function initMap() {
var InforObj = [];
// Create an array of alphabetical characters used to label the markers.
var labels = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var gmarkers = [];
window.map = new google.maps.Map(document.getElementById('map'), {
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var oms = new OverlappingMarkerSpiderfier(map, {
markersWontMove: true,
markersWontHide: true,
basicFormatEvents: true
});
var infowindow = new google.maps.InfoWindow();
var bounds = new google.maps.LatLngBounds();
function reload() {
$.ajax({
url: '@Url.Action("GetAllDeviceByAccount", "Device", new { Area = "AccountAdmin" })',
type: "GET",
data: {},
success: function (data) {
var t = data;
console.log(t);
if (t.length !== 0) {
$.each(t, function (marker, t) {
var icon = {
url: t.DevicePic, // url
scaledSize: new google.maps.Size(50, 50) // scaled size
}
var expectedPosition = new google.maps.LatLng(t.Latitude, t.Longitude);
marker = new google.maps.Marker({
position: expectedPosition,
//icon: icon, //set image icon per device
label: labels[t % labels.length],
map: map
});
var contentString = '<div id="content"><center><h3 style="color:#000;">' + t.Country +
'</h3><p>' + t.DeviceTypeName + '</p></center></div>';
const infowindow = new google.maps.InfoWindow({
content: contentString,
maxWidth: 200
});
bounds.extend(marker.position);
google.maps.event.addListener(marker, 'mouseover', (function (marker) {
return function () {
closeOtherInfo();
infowindow.open(map, marker);
InforObj[0] = infowindow;
}
})(marker, t));
oms.addMarker(marker);
map.fitBounds(bounds);
gmarkers.push(marker);
});
}
var markerCluster = new MarkerClusterer(map, gmarkers,
{
imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m',
//gridSize: 100,
zoomOnClick: true,
maxZoom: 10
});
},
error: function (error) { }
});
}
function closeOtherInfo() {
if (InforObj.length > 0) {
InforObj[0].set("marker", null);
InforObj[0].close();
InforObj.length = 0;
}
}
var listener = google.maps.event.addListener(map, "idle", function () {
map.setZoom(3);
google.maps.event.removeListener(listener);
});
setInterval(function () { reload(); }, 15000);
}