点聚合 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, //聚合规则
});
});