说明
本示例使用的Turf.js里的clustersDbscan类,他根据相邻点之间的距离聚合,在距离小于制定距离时将会聚合,一般引入前端地图渲染组件不需要自己计算,该方法结合echarts渲染效果更佳。
优点:简单,直接通过距离聚合。
缺点:数量集上千后就会导致卡顿。优化方案,可分批聚合,每次聚合300条,最后将每次的聚合结果二次聚合,这样能承受几万个点。但是误差会比较大。
turf.js下载
npm install @turf/turf
代码块
import * as turf from '@turf/turf'
var points={
type: "FeatureCollection",
features:[
{type: "Feature",geometry:{ type: "Point",coordinates:[123.4,33.9] } },
{type: "Feature",geometry:{ type: "Point",coordinates:[123.5,33.9] } },
{type: "Feature",geometry:{ type: "Point",coordinates:[96.4,20.9] } },
{type: "Feature",geometry:{ type: "Point",coordinates:[120.4,38.9] } },
{type: "Feature",geometry:{ type: "Point",coordinates:[123.4,33.9] } },
{type: "Feature",geometry:{ type: "Point",coordinates:[123.4,33.9] } },
]
}
var clustered= turf.clustersDbscan(points, 100);//单位默认公里
var arr = clustered.features; //返回的数据带有特点标识。
var ary={};
/*去重并统计数量*/
for(let i=0;i<arr.length;i++){
var x=arr[i].properties.centroid[0];
var y=arr[i].properties.centroid[1];
if(arr[i].properties.cluster!=undefined){
if(arr[i].properties.cluster in ary){
ary[arr[i].properties.cluster]=[x,y,ary[arr[i].properties.cluster][2]+1];//有重复的数量+1
}else{
ary[arr[i].properties.cluster]=[x,y,1];//没有重复的直接默认数量一
}
}else{
ary[arr[i].properties.centroid]=[x,y,1];//没有重复的直接默认数量一
}
}
//最后结果pointResult
var pointResult=[]
for( var key in ary){
pointResult.push({
name:ary[key][2],
value:ary[key]
})
}
console.log(pointResult)