点聚合

示例

查看代码
<template>
  <div class="mapDiv">
    <tdt-map :center="state.center" :zoom="state.zoom">
      <tdt-marker-clusterer
        :markers="state.markers"
        :styles="state.styles"
        @click="onClick"
        @clusterclick="onClusterClick"
      ></tdt-marker-clusterer>
      <tdt-infowindow v-model:target="state.target" :content="state.content"></tdt-infowindow>
    </tdt-map>
  </div>
</template>

<script lang="ts" setup>
import { reactive } from "vue-demi";
import { withBase } from "vitepress";

const state = reactive({
  center: [116.40969, 37.43997],
  zoom: 3,
  markers: Array.from({ length: 500 }, (e, i) => {
    return {
      icon: {
        iconUrl: withBase("/marker_blue.png"),
        iconAnchor: [10, 41]
      },
      position: [Math.random() * 40 + 85, Math.random() * 30 + 21],
      extData: "cluster-" + i
    };
  }),
  styles: [
    {
      url: withBase("/cluster0.png"),
      size: [30, 30], //图片大小
      offset: [0, 0], //显示图片的偏移量
      textColor: "#000000", //显示数字的颜色
      textSize: 8, //显示文字的大小
      range: [0, 50] //显示该图标的范围
    },
    {
      url: withBase("/cluster1.png"),
      size: [40, 40],
      offset: [0, 0],
      textColor: "#000000",
      textSize: 10,
      range: [50, 400]
    },
    {
      url: withBase("/cluster2.png"),
      size: [50, 50],
      offset: [0, 0],
      textColor: "#000000",
      textSize: 12,
      range: [400, 500]
    }
  ],
  target: null,
  content: ""
});

function onClick(e: any) {
  console.log("onClick", e);
  state.target = e.layer;
  state.content = `${e.layer.extData}<br>[${e.lnglat.lng}, ${e.lnglat.lat}]`;
}
function onClusterClick(e: any) {
  console.log("onClusterClick", e);
}
</script>

<script lang="ts">
export default { name: "demo-marker-clusterer" };
</script>

<style scoped>
.mapDiv {
  width: 100%;
  height: 600px;
}
</style>

属性

属性类型默认值说明
markersarray[]要聚合的标注点数组,详细配置见下方
stylesarray自定义聚合后的图标风格,详细配置见下方
girdSizenumber60聚合计算时网格的像素大小,默认 60
maxZoomnumber无穷大最大的聚合级别,大于该级别就不进行聚合

Markers

属性类型默认值说明
iconObject/String标注的图标。可以是网络地址或本地图片地址,也可以是对象{iconUrl:String //地址, iconSize:Array //大小, iconAnchor:Array //偏移}
draggingBooleanfalse决定标注是否可被鼠标或触摸拖动。
titleString""默认情况下,标注图片的叠置顺序由纬度自动设置。
zIndexOffsetNumber0设置 z-index。
opacityNumber1.0设置透明度。
positionArray标点的坐标
extData自定义属性,需要通过事件的layer.options.extData获取

Styles

属性类型说明
urlString图片地址
sizeArray图片大小
offsetArray显示图片的偏移量
textColorString显示数字的颜色
textSizeNumber显示文字的大小
rangeArray显示范围
  • styles 配置示例
[
  {
    url: "http://api.tianditu.gov.cn/img/map/cluster/heart30.png",
    size: [30, 26], //图片大小
    offset: [-15, -13], //显示图片的偏移量
    textColor: "#000000", //显示数字的颜色
    textSize: 8, //显示文字的大小
    range: [0, 50] //显示该图标的范围
  },
  {
    url: "http://api.tianditu.gov.cn/img/map/cluster/heart40.png",
    size: [42, 36],
    offset: [-20, -17],
    textColor: "#ff0000",
    textSize: 10,
    range: [50, 400]
  },
  {
    url: "http://api.tianditu.gov.cn/img/map/cluster/heart50.png",
    size: [52, 46],
    soffset: [-10, -22],
    textColor: "white",
    textSize: 12,
    range: [400, 500]
  }
];

事件

提示

在点聚合组件的事件中,target 为点聚合对象,layer 才是点标注对象

事件参数描述
click({type,target,layer,lnglat,containerPoint})点击标注图标后会触发此事件。
dblclick({type,target,layer,lnglat,containerPoint})双击标注图标后会触发此事件。
mousedown({type,target,layer,lnglat,containerPoint})鼠标在标注图标上按下触发此事件。
mouseup({type,target,layer,lnglat,containerPoint})鼠标在标注图标释放触发此事件。
mouseout({type,target,layer,lnglat,containerPoint})鼠标离开标注图标时触发此事件。
mouseover({type,target,layer,lnglat,containerPoint})当鼠标进入标注图标区域时会触发此事件。
dragstart({type,target,layer})当用户拖动标注图标时触发。
drag({type,target,layer,lnglat})当用户拖动标注图标时不断触发。
dragend({type,target,layer,lnglat})当用户停止拖动标注图标时触发。
remove({type,target,layer})移除标注图标时触发。
clusterclick(v2.7.5)({type,target,layer,lnglat,containerPoint})点击聚合点图标后会触发此事件。