#javascript #google-maps #google-maps-api-3 #maps #google-maps-markers
#javascript #google-карты #google-maps-api-3 #Карты #google-карты-маркеры
Вопрос:
Ребята, нужна небольшая помощь с картами Google, я создаю веб-приложение для отслеживания, используя координаты базы данных MySQL, отслеживание пока работает хорошо, за исключением того, что маркеры карты Google продолжают повторяться при обновлении, я установил обновление маркера карты с помощью функции setInterval каждые 5 секунд (для тестирования). Я пробовал методы clearoverlays () и метод удаления маркеров карты (из примера Google), но не работает. Ценю вашу помощь, спасибо
<script defer
src="https://maps.googleapis.com/maps/api/js?key="KEY"8amp;callback=initMap">
</script>
<script type="text/javascript">
setInterval(function () {
BindMarker();
}, 5000);
var customIcons = {
blue: { icon: 'blue48.png'},
};
var marker;
var map = null;
var infoWindow = null;
function load() {
map = new google.maps.Map(document.getElementById("map"), {
center: new google.maps.LatLng(1.4370993, 110.3387572),
zoom:15,
});
infoWindow = new google.maps.InfoWindow;
}
function BindMarker() {
downloadUrl('maps1.php', function (data) {
var xml = data.responseXML;
var markers = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i ) {
var point = new google.maps.LatLng(
parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
var icon = customIcons["blue"] || {};
marker = new google.maps.Marker({
map: map,
animation: google.maps.Animation.BOUNCE,
position: point,
icon: icon.icon,
shadow: icon.shadow
});
}
});
}
function bindInfoWindow(marker, map, infoWindow) {
google.maps.event.addListener(marker, 'click', function () {
map.setCenter(marker.getPosition());
});
}
function downloadUrl(url, callback) {
var request = window.ActiveXObject ?
new ActiveXObject('Microsoft.XMLHTTP') :
new XMLHttpRequest;
request.onreadystatechange = function () {
if (request.readyState == 4) {
request.önreadystatechange = doNothing;
callback(request, request.status); }
};
request.open('GET', url, true);
request.send(null);
}
function doNothing() { }
</script>
Функции, которые я пробовал, приведены ниже (я вызвал функцию удаления наложений, удаления маркеров, а также функцию удаления маркеров перед BindMarker() внутри функции setInterval, чтобы она удаляла маркеры перед привязкой новых маркеров
function setMapOnAll(map) {
for (let i = 0; i < markers.length; i ) { markers[i].setMap(map); }
}
function clearMarkers() {setMapOnAll(null); }
function deleteMarkers() {clearMarkers(); markers = [];}
function clearOverlays() {
while(markers.length) { markers.pop().setMap(null); }
markers.length = 0;
}
Комментарии:
1. Это: » Я пробовал … и … но не работает. » — требуется разъяснение. Покажите нам, что вы пробовали, продемонстрируйте, что не работает.
2. @RandyCasburn отредактировал сообщение, спасибо
Ответ №1:
Я полагаю, что вы перепутали примеры, которые ваш попытавшийся код показывает дословно, и что на самом деле делает ваш код.
В примере кода, из которого вы рисуете, переменная markers
представляет собой массив объектов маркеров Google Map. Так что этот код имеет смысл в этом отношении:
function deleteMarkers() {clearMarkers(); markers = [];}
Но ваш код не создает массив этих объектов. В вашем коде нет переменной с именем markers
, доступной вне downloadUrl()
функции. Переменная markers
действительно отображается внутри этой функции, но она содержит элемент HTMLCollection, а не массив маркеров.
Чтобы исправить это, вам нужно создать массив с именем markers
сразу после создания имени переменной marker
.
Затем, в for
цикле, сразу после создания marker
, вставьте этот маркер в markers
массив. Вам также придется переименовать существующую markers
переменную во что-то более подходящее, например markerElements
.
Теперь deleteMarkers()
функция будет работать так, как ожидалось.
Комментарии:
1. большое вам спасибо за помощь, я исправил код, как вы предложили, и использовал функцию clearOverlays () внутри моего setInterval, теперь работает отлично