点聚合 MarkerCluster 最后更新时间: 2024年02月21日
本文介绍两种点聚合插件(AMap.MarkerCluster和AMap.IndexCluster),它们分别以距离和索引的维度对数据进行聚合展示,在点数10万以内能够保持较好的性能。下文将分别介绍两种聚合插件。
1、按距离聚合
提示
点聚合支持用户自定义点标记。
1.1 准备
成为开发者并创建 key
为了正常调用 API ,请先注册成为高德开放平台开发者,并申请 web 平台(JS API)的 key 和安全密钥,点击 具体操作。
提示
你在2021年12月02日以后申请的 key 需要配合你的安全密钥一起使用。
1.2 创建地图
const map = new AMap.Map("container", { zoom: 8, //地图级别 center: [116.405285, 39.904989], //地图中心点 mapStyle: "amap://styles/whitesmoke", //设置地图的显示样式 viewMode: "2D", //设置地图模式 });1.3 创建聚合点数据
var points = [ { weight: 8, lnglat: ["116.506647", "39.795337"] }, { weight: 1, lnglat: ["116.843352", "40.377362"] }, { weight: 1, lnglat: ["116.637122", "40.324272"] }, { weight: 1, lnglat: ["116.105381", "39.937183"] }, { weight: 1, lnglat: ["116.653525", "40.128936"] }, { weight: 1, lnglat: ["116.486409", "39.921489"] }, { weight: 1, lnglat: ["116.658603", "39.902486"] }, { weight: 1, lnglat: ["116.338033", "39.728908"] }, { weight: 1, lnglat: ["116.235906", "40.218085"] }, { weight: 1, lnglat: ["116.366794", "39.915309"] }, { weight: 1, lnglat: ["116.418757", "39.917544"] }, { weight: 1, lnglat: ["116.139157", "39.735535"] }, { weight: 1, lnglat: ["116.195445", "39.914601"] }, { weight: 1, lnglat: ["116.310316", "39.956074"] }, { weight: 1, lnglat: ["116.286968", "39.863642"] }, ];提示
聚合点数据应该是一组包含经纬度信息的数组。
lnglat为经纬度信息字段。
weight字段为可选参数,表示权重值,以权重高的点为中心进行聚合。
1.4 自定义图标样式
提示
若不配置图标样式,JS API 能为你展示默认样式。下面介绍完全自定义图标和自定义图标两种方式。
- 完全自定义图标
//聚合点样式 var _renderClusterMarker = function (context) { //context 为回调参数, //包含如下属性 marker:当前聚合点,count:当前聚合点内的点数量 var clusterCount = context.count; //聚合点内点数量 context.marker.setContent( '<div style="background-color:#00ff00">' + clusterCount + "</div>" ); }; //非聚合点样式 var _renderMarker = function (context) { //context 为回调参数, //包含如下属性 marker:当前非聚合点 context.marker.setContent('<div style="background-color:#ff0000">1</div>'); };提示
您可自由定制样式,此处仅提供基础样式作为参考,更多参考前往 示例中心。
- 自定义图标
var styles = [ { //聚合量在1-10时,聚合点的样式 url: "//a.amap.com/jsapi_demos/static/images/blue.png", //图标显示图片的地址 size: new AMap.Size(32, 32), //图标显示图片的大小 offset: new AMap.Pixel(-16, -16), //图标定位在地图上的位置相对于图标左上角的偏移值 textColor: "#fff", //文字的颜色 }, { //聚合量在11-100时,聚合点的样式 url: "//a.amap.com/jsapi_demos/static/images/green.png", size: new AMap.Size(32, 32), offset: new AMap.Pixel(-16, -16), textColor: "#fff", }, { //聚合量在101-1000时,聚合点的样式 url: "//a.amap.com/jsapi_demos/static/images/orange.png", size: new AMap.Size(36, 36), offset: new AMap.Pixel(-18, -18), }, ];提示
数组元素分别对应聚合量在1-10,11-100,101-1000…的聚合点的样式,当开发者设置聚合样式少于实际叠加的点数,未设置部分按照系统默认样式显示。
1.5 添加聚合组件
- 使用完全自定义图标方式
map.plugin(["AMap.MarkerCluster"], function () { cluster = new AMap.MarkerCluster( map, //地图实例 points, //海量点数据,数据中需包含经纬度信息字段 lnglat { gridSize: 60, //数据聚合计算时网格的像素大小 renderClusterMarker: _renderClusterMarker, //上述步骤的自定义聚合点样式 renderMarker: _renderMarker, //上述步骤的自定义非聚合点样式 } ); });- 使用自定义图标方式
map.plugin(["AMap.MarkerCluster"], function () { cluster = new AMap.MarkerCluster( map, //地图实例 points, //海量点数据,数据中需包含经纬度信息字段 lnglat { styles: styles, } ); });2、按索引聚合
2.1 创建地图
const map = new AMap.Map("container", { zoom: 8, //地图级别 center: [116.405285, 39.904989], //地图中心点 mapStyle: "amap://styles/whitesmoke", //设置地图的显示样式 viewMode: "2D", //设置地图模式 });2.2 创建点聚合数据
var points = [ { lnglat: ["116.506621867519", "39.925077049391"], building: "晨光家园", district: "朝阳区", city: "北京", }, { lnglat: ["116.464047215754", "39.871715123709"], building: "松榆西里", district: "朝阳区", city: "北京", }, { lnglat: ["116.557773237391", "39.903674644798"], building: "北花园街6号院", district: "朝阳区", city: "北京", }, { lnglat: ["116.40499876945", "39.958000356032"], building: "安定门外大街80号院", district: "东城区", city: "北京", }, { lnglat: ["116.412789588355", "39.957363077042"], building: "地坛北门", district: "东城区", city: "北京", }, ];2.3 定义点聚合规则
var clusterIndexSet = { //定义点聚合规则 city: { minZoom: 2, maxZoom: 10, }, district: { minZoom: 10, maxZoom: 12, }, building: { minZoom: 12, maxZoom: 22, }, };提示
聚合规则:通过定义的配置对数据内属性值相同的数据聚合到一起,比如:当地图级别为2到10的时候,将使用 city 属性聚合,数据中 city 值相同的将被聚合在一起。
2.4 自定义图标样式
提示
若不配置图标样式,JS API 能为你展示默认样式,这里介绍完全自定义的图标样式。
//聚合点样式 var _renderClusterMarker = function (context) { //context 为回调参数, //包含如下属性 marker:当前聚合点,count:当前聚合点内的点数量 var clusterCount = context.count; //聚合点内点数量 context.marker.setContent( '<div style="background-color:#00ff00">' + clusterCount + "</div>" ); };提示
您可自由定制样式,此处仅提供基础样式作为参考,更多参考前往 示例中心。
2.5 添加聚合组件
map.plugin(["AMap.IndexCluster"], function () { indexCluster = new AMap.IndexCluster(map, points, { renderClusterMarker: _renderClusterMarker, //自定义聚合点样式 clusterIndexSet: clusterIndexSet, //聚合规则 }); });
