Любое изменение уровня масштабирования приводит к тому, что все мои маркеры снова появляются на моей карте Google - PullRequest
1 голос
/ 08 марта 2012

Любое изменение уровня масштабирования приводит к появлению на карте всех маркеров, которые были на карте в любое время с момента последней загрузки страницы.Это верно независимо от того, происходит ли изменение уровня масштабирования из-за вызова setZoom () в моем коде или потому, что я использую ползунок масштабирования.

У меня есть виджет управления картой с кнопками для добавления маркеров, соответствующих различным категориям.Таким образом, вы нажимаете кнопку для групп, и карта заполняется маркерами, которые представляют группы.Затем вы нажимаете кнопку «Отдельные лица», и маркеры групп очищаются и удаляются, а отдельные маркеры появляются на карте.И так далее с другими категориями.Но любое изменение уровня масштабирования возвращает все маркеры, которые были на карте с момента последнего обновления страницы.

Я использую MarkerClustererPlus.Я не знаю, будет ли это ошибкой в ​​MarkerClustererPlus, в коде Google или в моем коде.Надеюсь, что последний.Я включу мою функцию 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();
}

И последнее, но не менее важное, вот библиотека MarkerClustererPlus: http://google -maps-utility-library-v3.googlecode.com / svn / tags / markerclustererplus / 2.0.9 / src /

1 Ответ

2 голосов
/ 08 марта 2012

Я мало что знаю о MarkerClusterer, но то, что, по-видимому, происходит, каждый раз, когда вы вызываете функцию addMarkers, вы создаете новый MarkerClusterer, но старый никогда не уничтожается / не удаляется, поэтому при масштабировании изменяйте все созданные вами экземпляры. перерисовать маркеры у них есть. Попробуйте метод clearMarkers или removerMarkers в MarkerClusterer, а также создайте только один экземпляр MarkerClusterer и используйте его вместо того, чтобы создавать новый каждый раз, когда вы вызываете addMarkers.

...