Google maps api 3 缩放级别的任何更改都会导致我的所有标记重新出现在我的谷歌地图上

Google maps api 3 缩放级别的任何更改都会导致我的所有标记重新出现在我的谷歌地图上,google-maps-api-3,zooming,google-maps-markers,markers,markerclusterer,Google Maps Api 3,Zooming,Google Maps Markers,Markers,Markerclusterer,缩放级别的任何更改都会导致地图上自上次页面加载以来一直在地图上的所有标记出现在地图上。无论缩放级别的更改是由于代码中的setZoom()调用还是因为我操作了缩放滑块,都是如此 我有一个带有按钮的地图控件小部件,可以添加对应于不同类别的标记。因此,单击组按钮,地图将填充表示组的标记。然后单击“个人”按钮,清除并删除组标记,并在地图上显示个人标记。等等与其他类别。但缩放级别的任何更改都会带回自上次刷新页面以来地图上的所有标记 我用的是MarkerClustererPlus。我不知道这是MarkerC

缩放级别的任何更改都会导致地图上自上次页面加载以来一直在地图上的所有标记出现在地图上。无论缩放级别的更改是由于代码中的setZoom()调用还是因为我操作了缩放滑块,都是如此

我有一个带有按钮的地图控件小部件,可以添加对应于不同类别的标记。因此,单击组按钮,地图将填充表示组的标记。然后单击“个人”按钮,清除并删除组标记,并在地图上显示个人标记。等等与其他类别。但缩放级别的任何更改都会带回自上次刷新页面以来地图上的所有标记

我用的是MarkerClustererPlus。我不知道这是MarkerClustererPlus、Google代码还是我的代码中的一个bug。希望是后者。我将在下面包含我的addMarkers函数。由于我在添加新标记之前清除并删除了标记,因此我不知道以前的标记如何恢复,无论缩放更改为何会触发其返回:

function addMarkers(map,flag) { 

  clearOverlays();
  deleteOverlays();

  if ('event' == flag) {
    data = himaps_event_data;
  } else if ('story' == flag) {
    data = himaps_story_data;
  } else if ('group' == flag) {
    data = himaps_group_data;
  } else {
    data = himaps_user_data;
  }

  for (var k in data) {
    var item = data[k];
    var latLng = new google.maps.LatLng(item.lat, item.lng);
    var marker = new google.maps.Marker({'position': latLng});
    markersArray.push(marker); 
  } 

  var markerCluster = new MarkerClusterer(map, markersArray);  
}
此外,如果我更改缩放,则标记将不再清除。如果我单击按钮更改类别,它们会继续在地图上累积。如果我不改变缩放级别,那绝对不会发生

根据要求,以下是更多代码:

function clearOverlays() {
  if (markersArray) { 
    for (var i = 0; i < markersArray.length; i++ ) {
      markersArray[i].setMap(null);
    }
  }
}

function deleteOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(null);
    }
    markersArray.length = 0;
  }
}

/* map controls */
(function($) {
  Drupal.behaviors.himaps = {
  attach: function(context, settings) {
    $('.map-controls button').click(function() {
      flag = this.id.replace('map-',''); 
      addMarkers(map,flag);
    });
  }
  }
})(jQuery);


/* homepage map */
function newMap(clat,clng) {
  if (!clat) {
    clat = 37.65;  
  }
  if (!clng) {
    clng = -97.43;  
  }
  var myOptions = {
    scrollwheel: false,
    mapTypeControl: false,
    mapTypeControlOptions: {
        style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
        position: google.maps.ControlPosition.LEFT_CENTER
    },
    panControl: false,
    panControlOptions: {
        position: google.maps.ControlPosition.LEFT_CENTER
    },
    zoomControlOptions: {
        style: google.maps.ZoomControlStyle.LARGE,
        position: google.maps.ControlPosition.LEFT_CENTER
    },
    draggable: true,
    center: new google.maps.LatLng(clat, clng),
    zoom: 4,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };

  return new google.maps.Map(document.getElementById("map-canvas"), myOptions);

}

var map;
var markersArray = [];
var geocoder; 
var marker;
var listener;

google.maps.event.addDomListener(window, 'load', initmapping);

function initmapping() { //aka initialize()
  map = newMap();
  addMarkers(map,'group');
  geocoder = new google.maps.Geocoder();
}
函数clearOverlays(){ if(markersArray){ 对于(var i=0;i
最后但并非最不重要的一点是,这里是MarkerClusterPlus库:

我对MarkerClusterer不太了解,但似乎每次调用addMarkers函数时都会创建一个新的MarkerClusterer,但旧的MarkerClusterer从未被销毁/删除,因此,在缩放时,更改您创建的所有实例,并重新绘制它们所具有的标记。尝试MarkerClusterer的clearMarkers或RemoveMarkers方法,也只创建MarkerClusterer的一个实例并重用它,而不是每次调用addMarkers时创建一个新实例。

您能提供一个链接或至少更多代码吗?至少是clearOverlays()和deleteOverlays()函数?我想知道markersArray是在哪里创建和清除的。如果在清除标记时没有清除markersArray,那就可以解释了。puckhead,我已经用更多代码更新了原始帖子。谢谢你。我认为你走对了方向。如果我不使用MarkerClusterer,问题就会消失。看来我需要更好地管理集群。实际上,我不确定调用clearMarkers或removeMarkers的语法是否正确,也没有找到显示如何调用这些函数的代码示例。OO语法和prototype对象的使用可能会让我有点不舒服。我对语法的猜测毫无意义。实际上,我有时可能会获得正确的语法,但这些方法没有按预期工作。请将标记集群变量markerCluster的声明移动到创建其他变量的位置。在initmapping中,创建MarkerClusterer,但仅将映射传递给它。然后在addMarkers中,首先调用markerCluster.clearMarkers(),然后调用markerCluster.addMarkers(markersArray)。我想你可以删除clearOverlays和deleteOverlays函数,这两个函数的作用基本相同。就是这样!我仍然需要clearOverlays和deleteOverlays调用,但除此之外,它的工作原理与您描述的一样。