我正在尝试使用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次。我不完全确定这是一个解决方案,但也许我会离开这个,以防万一其他人有更好的解决方案或想知道我的。
答案 0 :(得分:0)
对于使用Projection方法,必须初始化它。 "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);
});
:
{{1}}