Javascript getClusters()始终返回空数组(使用MarkerClustererPlus for Google Maps V3)
我有以下代码加载地图并对标记进行聚类:Javascript getClusters()始终返回空数组(使用MarkerClustererPlus for Google Maps V3),javascript,google-maps,google-maps-api-3,markerclusterer,Javascript,Google Maps,Google Maps Api 3,Markerclusterer,我有以下代码加载地图并对标记进行聚类: $scope.getMapHistory = function(locations){ var map = new google.maps.Map(document.getElementById('map-canvas-history'), { zoom: 17, center: google.maps.LatLng(0, 0) }); var markers = []; locations.fo
$scope.getMapHistory = function(locations){
var map = new google.maps.Map(document.getElementById('map-canvas-history'), {
zoom: 17,
center: google.maps.LatLng(0, 0)
});
var markers = [];
locations.forEach(function(deviceLocation){
//var dataPhoto = data.photos[i];
var devLat = deviceLocation._source.data.location[1];
var devLng = deviceLocation._source.data.location[0];
var latLng = new google.maps.LatLng(devLat, devLng);
var marker = new google.maps.Marker({position: latLng });
markers.push(marker);
});
var markerCluster = new MarkerClusterer(map, markers);
//Test to get the clusters
console.log(markerCluster);
console.log(markerCluster.getClusters());
console.log(markerCluster.getTotalClusters());
markerCluster.fitMapToMarkers();
$scope.hideLoading('loadingMap'); //Hides the loading gif
}
直到一切都好起来。问题是我想访问集群数组,当我尝试记录markerCluster.getClusters()
的返回时,它返回一个空数组。另外,.getTotalClusters()
返回0
但是,当我记录整个markerCluster
并在控制台上打开它时,我可以看到集群阵列:
markers集群工作正常,但我无法访问集群数组或集群数量。有人知道会发生什么吗?
(如果我的解释不够的话,我可以提供更多的细节)在MarkerClusterer实例完成标记的分区之前,您似乎在询问集群和总集群数,这非常快,但并不是即时的 一个简单的测试是在查询属性之前留出几秒钟:
var markerCluster = new MarkerClusterer(map, markers);
window.SetTimeout(function() {
//Test to get the clusters
console.log(markerCluster);
console.log(markerCluster.getClusters());
console.log(markerCluster.getTotalClusters());
},2000);
顺便说一句,您将实例视为包含标记,因为控制台中的对象是对原始对象的引用,这意味着在您检查它时,它确实包含标记,但在您记录它时不一定包含标记。您将获得0个簇,因为
MarkerCluster
在加载映射之前不会完全初始化。以下示例显示了加载贴图后如何确定簇的数量:
google.maps.event.addListener($scope.map, 'idle', function(){
$scope.numOfClusters = markerCluster.getTotalClusters();
});
以下是一个工作示例:
角度模块('mapApp',[])
.controller('mapCtrl',函数($scope){
$scope.locations=[
{Id:1,姓名:'Oslo',拉丁美洲:59.923043,液化天然气:10.752839},
{Id:2,名称:'斯德哥尔摩',纬度:59.339025,液化天然气:18.065818},
{Id:3,名称:'Copenhagen',纬度:55.675507,液化天然气:12.574227},
{Id:4,名称:'Berlin',lat:52.521248,lng:13.399038},
{Id:5,名称:'Paris',lat:48.856127,lng:2.346525}
];
$scope.initMap=函数(){
$scope.map=new google.maps.map(document.getElementById('map'){
中心:{lat:59.339025,lng:18.065818},
缩放:3
});
//初始标记簇
var标记=[];
对于(变量i=0;i<$scope.locations.length;i++){
var marker=new google.maps.marker({
位置:新建google.maps.LatLng($scope.locations[i].lat,$scope.locations[i].lng),
});
标记器。推(标记器);
}
var mcOptions={imagePath:'https://cdn.rawgit.com/googlemaps/js-marker-clusterer/gh-pages/images/m' };
markerCluster=新的MarkerClusterer($scope.map,markers,mcOptions);
google.maps.event.addListener($scope.map,'idle',function()){
$scope.$apply(函数(){
$scope.numOfClusters=markerCluster.getTotalClusters();
});
});
};
$scope.initMap();
});代码>
html,正文{
高度:400px;
保证金:0;
填充:0;
}
#地图{
高度:400px;
}
群集数:{{numOfClusters}}
是的,我在这里测试过,可以得到阵列。现在开始工作了!谢谢@amenadielI还记得Markerclusterer在完成集群后触发clusteringend
事件吗。优雅的解决方案是实例化一个空的MarkerClusterer,为clusteringend
声明一个侦听器,然后使用addMarkers方法。在监听器中,你可以对完全加载的实例进行操作。是的,我使用监听器进行了操作,速度甚至更快。唐斯克很多。(:我将把你的答案作为解决方案,因为它在使用侦听器时有更好的实现。正如你在另一个答案的评论中所看到的,我是按照你在这里解释的方式来做的。谢谢你。(: