因为公司的业务 录入很多像xx县xx镇xx村xx组这样的人员数据,所以就会有很多的重复的marker点 但却是表示不同的人员数据。上线后才发现很多这样的聚合点根本点都点不开。百度了一下,发现聚合点下面的数据根本无法拿到。当时就只是简单快速的处理了下,将相同的点乘以一个不大不小的随机数,让点的经纬度不再重合。但是这样处理了就导致很多位置都偏移了,运营虽然提过这个问题,但是后面搁置了。
直到最近又做了一个类似的项目,遇到了同样的问题。这次的处理方式是:点击聚合点的时候画一个圆,然后判断点是否在聚合点里面。分享一下:
1. 准备工作:将代码敲到实现聚合点,像下图
2. 给聚合点绑定点击事件 在markerClusterer.js里面,并在点击的时候画一个圆。
MarkerClusterer.prototype._redraw = function () {
this._clearLastClusters();
this._createClusters();
var map=this._map;
for(var i=0,cluster;cluster=this._clusters[i];i++){//遍历所有的聚合点对象
cluster._clusterMarker.onclick=function(e){//在每个聚合点对象的视图对象上绑定事件
var point = new BMap.Point(e.point.lng, e.point.lat);
var circle = new BMap.Circle(point,50,{
strokeColor: "transparent",
strokeWeight: 1,
fillColor: "green",
fillOpacity: 0.1
});
map.addOverlay(circle);
//判断坐标是否在圆形内
mapObj.isCircle(circle);
}
}
};
3.拿到所有点数据里面重复的数据,组成一个新数组:newArry:[{obj1},{obj2},…]
4.判断点是否在圆形区域内,并且拿到点里面的数据,拿到之后显示在页面上
~需要引入<script type="text/javascript" src="http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>
~点击的时候循环newArry数组,使用百度API判断点是否在圆形区域if(BMapLib.GeoUtils.isPointInCircle(point,circle))
//拿到相同的聚合点里面的数据
clustereEeffect.prototype.isCircle=function(circle){
//1.先拿到所有点数据里面重复的数据
var repeat=this.sortArr(testPoint, 'lat');//返回一个新的数组,将相同对象添加到同一个数组
//console.log(repeat);
//拿到重复的对象
var newArry=[];
for (var i in repeat){
if(repeat[i].length>1){
newArry.push(repeat[i][0]);
}
}
console.log(newArry)
//2.判断点是否在圆形区域内
for (var k in newArry){
var point = new BMap.Point(newArry[k].lng,newArry[k].lat);// 创建点坐标
if(BMapLib.GeoUtils.isPointInCircle(point,circle)){
console.log("该point 在 circle内");
var getArray=this.getPointData(point.lng,point.lat,testPoint);
console.log(getArray);
var liHtml="<a href='javascript:;' οnclick='mapObj.hideSameBox()'>关闭</a>";
for (var i in getArray) {
liHtml+="<li>"+getArray[i].name+"</li>"
}
$("#same_data").html(liHtml);
$("#same_data").show();
}else
{
console.log("该point不在circle内");
}
}
};
5.效果如图