高德JS API的MarkerCluster(点聚合)

2,620 阅读2分钟

通过MarkerCluster在不同缩放级别下会显示不同标记,以适应细节程度和比例尺

在最近一个项目用到地图,采用了高德的接口,绘制地图。通过MarkerCluster在不同缩放级别下会显示不同标记,以适应细节程度和比例尺。放大地图时,它会以更详细的方式显示标记,以便查看每个标记的具体信息。缩小地图时,标记会以更聚合的方式显示,方便用户快速查找。同时,可以通过自定义聚合范围和标记样式进一步优化显示效果。

本文采用vue3+vite

1. 按 NPM 方式安装使用 Loader

npm i @amap/amap-jsapi-loader --save

import {getGeoJson} from '../API/api'

2.创建地图容器

<template>
  <div id="container">  </div>
</template>

<style scoped>
#container {
  width: 800px;
  height: 800px;
}
</style>

3.定义变量

//创建地图
let map;
//接收后端传来的坐标以及value
let points = [];

4.配置接口信息,地图初始化

//钩子函数
onMounted(async()  => {
getGeoJson我自定义的请求获取数据,数据格式如下

/*
{lnglat: ["108.939621", "34.343147"],value:1 },
{lnglat: ["113.370643", "22.938827"] ,value:4},
{lnglat: ["112.985037", "23.15046"],value:4 }, 
{lnglat: ["110.361899", "20.026695"],value:4 }, 
{lnglat: ["121.434529", "31.215641"] ,value:9},
*/

 await  getGeoJson(2012).then(res=>{
     points = res.data
   })
   //进行配置接口信息
  AMapLoader.load({
    key: '',//申请好的Web端开发者Key,首次调用 load 时必填
    version: '2.0',//指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
  })
    .then((AMap) => {
    //创建地图
   map = new AMap.Map('container',{
   
    pitch: 55,// 倾斜角度
    zoom:17,  //初始化地图缩放级别
    zooms:[5,30], //规定地图可以缩放的级别范围
    viewMode: '3D',  //设置地图模式2D/3D 
    center:[108.953939,34.266611 ], //初始地图中心,缺省时默认为使用者所在地
}
);
//引入插件
map.plugin(["AMap.MarkerClusterer"],function() {
//添加图层MarkerClusterer
    cluster = new AMap.MarkerClusterer(
        map,     // 地图实例
        points, // 海量点数据,数据中需包含经纬度信息字段 lnglat
        {
        //聚合点样式
          renderClusterMarker:_renderClusterMarker,
          //非聚合点样式
          renderMarker: _renderMarker,
        }
    )
});
 })
  .catch(e => {
      console.log(e);
    });
})

5.设置聚合点样式,聚合点显示数据为聚合点所包含数据的平均值

//_renderClusterMarker被调用时会传入一个参数(对象)
const _renderClusterMarker=(context)=>{
       
       
      var numbers =[]
      //将所有id放入numbers
      context.clusterData.forEach(item=>{
        numbers.push(item.id)
      })
      //求和,也就是被聚合部分的和
   const g=   numbers.reduce((a,b)=>{
        return a+b
      })
    //创建标点
      const div = document.createElement('div');
      div.innerHTML = `<div class="cluster-marker" style="background-color: green;width: 50px;height: 50px;border-radius: 50%;text-align: center;line-height: 50px">${g}</div>`;
 
    设置标点
      context.marker.setContent(div)
}

6.卸载,销毁组件

//
// 卸载组件钩子
onUnmounted(()=>{
  map.destroy( );
})

7.效果如下

屏幕截图 2023-09-28 015230.png

屏幕截图 2023-09-28 015242.png

屏幕截图 2023-09-28 015248.png

8.创作不易,给后人排坑