在gmaps中重新加载一组新标记时,无法清除叠加层

时间:2012-03-11 09:19:12

标签: google-maps google-maps-api-3 google-maps-markers

我有一个gmap,我只想在可视区域中显示标记。我添加了一个侦听器来获取地图的边界并调用收集边界内的标记。问题是,当我想要更改时,我想清除地图并使用更新的标记重新加载。目前地图将继续重新加载标记在彼此之上,这使得地图非常慢。我试过了:

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 :(得分:0)

您无法删除所有标记,但可以在每个可见标记上将map设置为null。 我这样做是

  1. 将标记数组添加到地图对象
  2. 将clearAllMarkers函数添加到地图对象
  3. 每个标记都添加到地图中,也会添加到markers数组
  4. clearAllMarkers函数是这样的:
  5.    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)设置在单独的标记上,而不是在地图上显示的对象上。

答案 1 :(得分:0)

以下是问题的完整代码解决方案..感谢您的帮助。

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() {}