Мне нравится создавать карту с помощью Google Maps, которая может обрабатывать большое количество маркеров (более 10.000). Чтобы не замедлять работу карты, я создал XML-файл, который выводит только маркеры, которые находятся внутри текущего видового экрана.
Сначала я использую initialize () для настройки параметров карты:
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);
});
}
Когда событие 'tileloaded' закончено, я использую 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);
}
})
}
Это прекрасно работает, однако, текущий код не выгружает маркеры, которые больше не находятся в области просмотра. Кроме того, он снова загружает уже загруженные маркеры, что очень быстро замедляет карту при перемещении карты раз в ту же область.
Так что, когда видовой экран изменяется, мне нравится сначала очистить всю карту перед загрузкой новых маркеров. Каков наилучший способ сделать это?