Очистка от наложений при перезагрузке нового набора маркеров в gmaps - PullRequest
1 голос
/ 11 марта 2012

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

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

И это вообще не будет загружать маркеры. Я также попробовал:

function loadMapFromCurrentBounds(map) {
    clearOverlays();

И это также не будет загружать маркеры. Ниже приведен код, который будет загружать все маркеры и функции так, как я хочу, за исключением очистки старых маркеров при изменении границ.

function load() {
  var map = new google.maps.Map(document.getElementById("map"), {
    center: new google.maps.LatLng(40, -100),
    zoom: 4,
    mapTypeId: 'roadmap'
  });

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

function clearOverlays() {
  if (markers) {
    for (i in markers) {
      markers[i].setMap(null);
    }
  }
}

function loadMapFromCurrentBounds(map) {
    clearOverlays();

var infoWindow = new google.maps.InfoWindow;

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

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

     // Change this depending on the name of your PHP file
var searchUrl = 'Viewport_Search.php?west=' + swPoint.lat() + '&east=' + nePoint.lat() + '&south=' + swPoint.lng() + '&north=' + nePoint.lng();
  downloadUrl(searchUrl, function(data) {
    var xml = data.responseXML;
    var markers = xml.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < markers.length; i++) {
      var name = markers[i].getAttribute("name");
      var address = markers[i].getAttribute("address");
      var point = new google.maps.LatLng(
          parseFloat(markers[i].getAttribute("lat")),
          parseFloat(markers[i].getAttribute("lng")));
      var html = "<b>" + name + "</b> <br/>" + address;
      var marker = new google.maps.Marker({
        map: map,
        position: point,
      });
      bindInfoWindow(marker, map, infoWindow, html);
    }
  });

}

function bindInfoWindow(marker, map, infoWindow, html) {
  google.maps.event.addListener(marker, 'click', function() {
    infoWindow.setContent(html);
    infoWindow.open(map, marker);
  });
}

function downloadUrl(url, callback) {
  var request = window.ActiveXObject ?
      new ActiveXObject('Microsoft.XMLHTTP') :
      new XMLHttpRequest;

  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      request.onreadystatechange = doNothing;
      callback(request, request.status);
    }
  };

  request.open('GET', url, true);
  request.send(null);
}

function doNothing() {}

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

Ответы [ 2 ]

0 голосов
/ 12 марта 2012

Ниже приведен полный код решения проблемы. Спасибо за помощь.

var map;    //elrado's code 
var markersArray = [];   //elrados's code   create array for markers       

function load() {
  map = new google.maps.Map(document.getElementById("map"), {
    center: new google.maps.LatLng(33.553029,-112.054017),
    zoom: 13,
    mapTypeId: 'roadmap'
  });

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


function clearOverlays() {  //clear overlays function
  if (markersArray) {
for (i in markersArray) {
  markersArray[i].setMap(null);
 }
}
}


function loadMapFromCurrentBounds(map) {    
var infoWindow = new google.maps.InfoWindow;

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

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

     // Change this depending on the name of your PHP file
var searchUrl = 'Viewport_Search.php?west=' + swPoint.lat() + '&east=' + nePoint.lat() + '&south=' + swPoint.lng() + '&north=' + nePoint.lng();
  downloadUrl(searchUrl, function(data) {
    var xml = data.responseXML;
    var markers = xml.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < markers.length; i++) {
      var name = markers[i].getAttribute("name");
      var address = markers[i].getAttribute("address");
      var point = new google.maps.LatLng(
          parseFloat(markers[i].getAttribute("lat")),
          parseFloat(markers[i].getAttribute("lng")));
      var html = "<b>" + name + "</b> <br/>" + address;
      var marker = new google.maps.Marker({
        map: map,
        position: point,
      });
      markersArray.push(marker);          //eldorado's code Define the array to put markers in

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

  });

}

function bindInfoWindow(marker, map, infoWindow, html) {
  google.maps.event.addListener(marker, 'click', function() {
    infoWindow.setContent(html);
    infoWindow.open(map, marker);
  });
}

function downloadUrl(url, callback) {
  var request = window.ActiveXObject ?
      new ActiveXObject('Microsoft.XMLHTTP') :
      new XMLHttpRequest;

  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      request.onreadystatechange = doNothing;
      callback(request, request.status);
    }
  };

  request.open('GET', url, true);
  request.send(null);
}

function doNothing() {}
0 голосов
/ 11 марта 2012

Вы не можете удалить все маркеры, но можно установить значение null на каждом видимом маркере.Я делаю это так:

  1. добавление массива маркеров к объекту карты
  2. добавление функции clearAllMarkers к объекту карты
  3. каждый маркер добавляется на карту, такжемассив маркеров
  4. Функция clearAllMarkers выглядит примерно так:
   for (var idx=0;idx<=map.markers.length;idx++){
               map.markers[idx].setMap(null);
   }

Я полагаю, вы добавляете отдельный объект маркеров в массив маркеров.Ваш массив маркеров должен быть полон ссылок на маркеры !!!

var map = []; //elrado's code

function load() {
  var map = new google.maps.Map(document.getElementById("map"), {
    center: new google.maps.LatLng(40, -100),
    zoom: 4,
    mapTypeId: 'roadmap'
  });

  map.markers = [];//elrado's code (add narkers.array to map object)

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

function clearOverlays() {
  if (map.markers) {
    for (i in map.markers) { //Might be you'll need to use map.markers.length
      markers[i].setMap(null);
    }
    map.markers = [];//reinit map.markers.array
  }
}

function loadMapFromCurrentBounds(map) {
    clearOverlays();

var infoWindow = new google.maps.InfoWindow;

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

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

     // Change this depending on the name of your PHP file
var searchUrl = 'Viewport_Search.php?west=' + swPoint.lat() + '&east=' + nePoint.lat() + '&south=' + swPoint.lng() + '&north=' + nePoint.lng();
  downloadUrl(searchUrl, function(data) {
    var xml = data.responseXML;
    var markers = xml.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < markers.length; i++) {
      var name = markers[i].getAttribute("name");
      var address = markers[i].getAttribute("address");
      var point = new google.maps.LatLng(
          parseFloat(markers[i].getAttribute("lat")),
          parseFloat(markers[i].getAttribute("lng")));
      var html = "<b>" + name + "</b> <br/>" + address;
      var marker = new google.maps.Marker({
        map: map,
        position: point,
      });
      map.markers.push(marker);//elrado's code
      bindInfoWindow(marker, map, infoWindow, html);
    }
  });

}

function bindInfoWindow(marker, map, infoWindow, html) {
  google.maps.event.addListener(marker, 'click', function() {
    infoWindow.setContent(html);
    infoWindow.open(map, marker);
  });
}

function downloadUrl(url, callback) {
  var request = window.ActiveXObject ?
      new ActiveXObject('Microsoft.XMLHTTP') :
      new XMLHttpRequest;

  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      request.onreadystatechange = doNothing;
      callback(request, request.status);
    }
  };

  request.open('GET', url, true);
  request.send(null);
}

function doNothing() {}

Я должен предупредить вас, что это было написано с головы (без теста), но что-то подобное должно работать.Обычно вы устанавливаете setMap (null) для отдельных маркеров, а не для объектов, отображаемых на карте.

...