Google Maps V3: Только покажите маркеры в области просмотра - Ясная проблема маркеров

Мне нравится создавать карту с Google Maps, которая может обработать большой объем маркеров (более чем 10 000). Для не замедления карты, я создал XML-файл, который только производит маркеры, которые являются в текущей области просмотра.

Во-первых, я использую, инициализируют () для установки опций карты:

function initialize() {
    var myLatlng = new google.maps.LatLng(51.25503952021694,3.27392578125);
    var myOptions = {
        zoom: 8,
        center: myLatlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

    google.maps.event.addListener(map, 'tilesloaded', function () {
    loadMapFromCurrentBounds(map);
    }); 
}

То, когда событие 'tilesloaded' закончено, я использую loadMapFromCurrentBounds (), это функционирует, получит текущие границы и отправляет запрос к XML-файлу для показа маркеров, которые являются в текущей области просмотра:

function loadMapFromCurrentBounds(map) {

    // First, determine the map bounds
    var bounds = map.getBounds();

    // Then the points
    var swPoint = bounds.getSouthWest();
    var nePoint = bounds.getNorthEast();

    // Now, each individual coordinate
    var swLat = swPoint.lat();
    var swLng = swPoint.lng();
    var neLat = nePoint.lat();
    var neLng = nePoint.lng();

    downloadUrl("mapsxml.php?swLat="+swLat+"&swLng="+swLng+"&neLat="+neLat+"&neLng="+neLng+"", function(data) {
        var xml = parseXml(data);
        var markers = xml.documentElement.getElementsByTagName("marker");
        var infoWindow = new google.maps.InfoWindow; 

        for (var i = 0; i < markers.length; i++) {
            var address = markers[i].getAttribute("address");
            var type = markers[i].getAttribute("type");
            var name = markers[i].getAttribute("name");

            var point = new google.maps.LatLng( 
            parseFloat(markers[i].getAttribute("lat")),
            parseFloat(markers[i].getAttribute("lng"))
            );

            var html = "<b>" + name + "</b> <br/>" + address;
            var icon = customIcons[type] || {};

            var marker = new google.maps.Marker({
            map: map,
            position: point,
            icon: icon.icon,
            shadow: icon.shadow});

            bindInfoWindow(marker, map, infoWindow, html);
        }
    })
}

Это работает отлично, однако, текущий код не разгружает маркеры, которые больше не находятся в de области просмотра. Помимо этого, это загружает маркеры снова, кто уже загружается, который замедляет карту действительно быстро при перемещении карты представление времена в той же области.

Таким образом, когда область просмотра изменяется, мне нравится очищать целую карту сначала прежде, чем загрузить новые маркеры. Что лучший способ состоит в том, чтобы сделать это?

29
задан jmort253 7 August 2012 в 03:02
поделиться

2 ответа

Вам нужно добавить еще один Слушатель событий для карты:

google.maps.event.addListener(map,'bounds_changed', removeMarkers);

См. здесь для получения дополнительной информации об удалении всех маркеров с карты Google - к сожалению, я не думаю, что это можно сделать с помощью одного вызова. Таким образом, вам придется написать removeMarkers или что-то подобное, что придется перебирать все маркеры на карте, удаляя их по отдельности, вот так:

 markersArray[i].setMap(null);

Я не знаю, быстрее ли проверить, находится ли маркер в окне просмотра раньше удаление с помощью:

 map.getBounds();

Подробнее о событиях Google Map API v3

15
ответ дан 28 November 2019 в 02:00
поделиться

Вы можете проверить эту ветку. Дэниел ответил на это очень хорошо.

Какой самый эффективный способ создания маршрутов на картах Google из файлов gps?

Кроме того, bounds_changed - это первая возможность вызвать вашу функцию. плитки загружены, будут вызываться постоянно. Область просмотра может содержать более одной плитки для заполнения области просмотра.

В качестве альтернативы вы также можете использовать setVisible (false).

Чтобы удалить маркер, вам может потребоваться удалить слушателей.

google.maps.event.clearInstanceListeners(marker);
marker.setMap(null);
markers.remove(marker);
delete marker;
6
ответ дан 28 November 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: