1

我正在尝试使用来自http://cm.qfox.nl/的 Google Maps V3 API ClusterManager将地图上的标记聚集在一起,但我在代码中遇到了与原始网站相同的错误 - 一个错误当页面第一次加载或重新加载时:

Uncaught TypeError: Cannot call method 'fromLatLngToPoint' of undefined ClusterManager_v3.js:586
ClusterManager.latlngToPoint ClusterManager_v3.js:586
ClusterManager._getMarkerBounds ClusterManager_v3.js:645
ClusterManager._cacheMarkerIcon ClusterManager_v3.js:580
ClusterManager.update ClusterManager_v3.js:345
(anonymous function) ClusterManager_v3.js:91

它在初始加载后工作正常,所以我很确定这是因为时间问题 - 例如,地图或标记在使用之前没有初始化。不幸的是,我无法找到等待一切初始化的方法,因为 Javascript 不是我的第一语言。任何帮助或指示都将受到欢迎。该网站的来源是我几乎完全使用的代码。

更新:

如果发现换行:

cm._requestUpdate(50);

cm._requestUpdate(250);

防止了错误。将其更改为 150 会导致错误发生 3/10 次。我不完全确定这是一个修复,但它可能所以我留下这个帖子以防万一其他人有更好的解决方案或想知道我的。

4

1 回答 1

0

为了使用投影方法,它必须被初始化。地图会触发"projection_changed"事件,什么时候Projection会被创建。只有在那之后你才能使用map.getProjection()。所以我的建议是,添加"projection_changed"事件的监听器,并ClusterManager在它被调用时进行初始化:

google.maps.event.addListenerOnce(map, 'projection_changed', function(){
     var cm = window.cm = new ClusterManager(
        map,
        {
            objClusterIcon: new google.maps.MarkerImage('markers/cluster.png', false, false, false, new google.maps.Size(20,20)),
            objClusterImageSize: new google.maps.Size(20,20)
        }
    );

    // now json contains a list of marker positions. lets add them.
    for (var i = 0; i < json.length; ++i) {

       .....
    }
    cm._requestUpdate(50);
});
于 2012-04-09T19:58:51.833 回答