带有StoreLocator和MarkerClusterer混合问题的Google Maps API

时间:2014-02-20 12:10:41

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

http://storelocator.googlecode.com/git/examples/dynamic.html

我正在使用动态StoreLocator,完全按照演示中的说明进行一些调整:

  1. 将JSON更改为我自己的。
  2. 使用以下代码:

    将Marker Clusterer添加到地图中
    google.maps.event.addListener(_googleMap, 'idle', function() {
      if(typeof _merketClusterer == 'object') {
        _googleClusters.clearMarkers();
      }
      _googleClusters = new MarkerClusterer(_googleMap, _storeLocatorView.c);
    });
    
  3. 因为MarkerClusterer和StoreLocator都依赖于地图事件,所以群集似乎会显示,并且一秒钟之后,标记会再次出现在StoreLocator中。

    任何人都知道在StoreLocator完成地图更新后我如何触发MarkerClusterer?

    此处示例:http://jsfiddle.net/Z6WHR/

    您需要移动地图以开始聚类,并且标记会显示回来。

    我正在深入研究这一点,并认为我可以通过将StoreLocator中的标记函数包装到Clusterer来修复它,但由于它是高度匿名化而无法这样做。

2 个答案:

答案 0 :(得分:2)

我也遇到了这个问题,但我必须以不同的方式解决它。我尝试使用您的代码,但我的性能下降,因为对于商店定位器中的每个商店,MarkerCusterer正在清除标记,然后再次添加它们。

所以我改变了你的代码,现在它完美无缺!

google.maps.event.addListenerOnce(map, 'bounds_changed', function() {
        googleClusters = new MarkerClusterer(map);
        view.addStoreToMapB = view.addStoreToMap;
        var i = 0;
        view.addStoreToMap = function (a) {
            i++;
            var b = view.addStoreToMapB(a);
            if(i == view.stores.length){
                i = 0;
                var markers = [];
                googleClusters.clearMarkers();
                for(marker in view.markerCache_){
                    markers.push(view.markerCache_[marker]);
                }
                googleClusters.addMarkers(markers);
            }
        }
    });

答案 1 :(得分:0)

管理以识别StoreLocator用于将标记添加到地图并将MarkerClusterer代码环绕的关键函数。 遗憾的是,如果不稍微更改StoreLocator,则无法添加每个标记并避免清除和重置所有内容。 但是添加一个简单的返回addStoreToMap以返回可以实现的标记。

google.maps.event.addListenerOnce(_googleMap, 'bounds_changed', function() {
  _googleClusters = new MarkerClusterer(_googleMap);
  _googleView.addStoreToMapB = _googleView.addStoreToMap
  _googleView.addStoreToMap = function (a) {
    var b = _googleView.addStoreToMapB(a);
    _googleClusters.clearMarkers();
    _googleClusters.addMarkers(_googleView.c);
  }
});