Skip to content

vue3高德API点聚合

html部分

ts
<div id="container" class="row"></div>

ts内容

ts:
// 高德地图的加载
const creatEarth = async () => {
  // eslint-disable-next-line no-underscore-dangle
  (window as any)._AMapSecurityConfig = {
    securityJsCode: '0ba741bffc403a7fbe0d717d1db39f54',
  };
  await AMapLoader.load({
    key: '041427ecf5d0a2f6c6318f3067ebfa7d',
    version: '2.0',
    plugins: ['AMap.DistrictSearch', 'AMap.ImageLayer'],
  })
    .then(async (AMap) => {
      AMapVal.value = AMap;
      mapValue.value = new AMap.Map('container', {
        viewMode: '2D',
        // zoom: 9,
        zoom: 5,
        center: [105.041063, 35.977702], // 地图中心点
        mapStyle: 'amap://styles/darkblue',
      });

      // eslint-disable-next-line
      // var _renderMarker = function (context: any) {
      //   context.marker.setContent('<div style=""></div>');
      // };
      mapValue.value.plugin(['AMap.MarkerCluster'], () => {
        cluster = new AMapVal.value.MarkerCluster(mapValue.value, mapDeviceData.value);
      });
      cluster.on('click', MarkerClusterTo);
    })
    .catch((e) => {
      console.log(e);
    });
};

// marker点击事件
const MarkerClusterTo = async (e: any) => {
  // console.log('e: ', e);
  if (infoWindow.value) {
    infoWindow.value.close();
  }
  if (e.clusterData && e.clusterData?.length > 1) {
    let alng = 0;
    let alat = 0;
    for (const m of e.clusterData) {
      alng += m.lnglat.lng;
      alat += m.lnglat.lat;
    }
    const lng = alng / e.clusterData.length;
    const lat = alat / e.clusterData.length;
    mapValue.value.setZoom(mapValue.value.getZoom() + 3);
    mapValue.value.setCenter([lng, lat]);
  } else {
    mapValue.value.setZoomAndCenter(16, [e.clusterData[0].lnglat.lng, e.clusterData[0].lnglat.lat]);
    const content = `<div class="infowindows">
          <div class="infowindows-header">${e.clusterData[0].deviceName}</div>
          <div class="infowindows-item">
            <span class="infowindows-title">设备状态:</span>
            <span class="infowindows-value-blue">${e.clusterData[0].onlineStatus === 1 ? '在线' : '离线'}</span>
          </div>
          <div class="infowindows-item">
            <span class="infowindows-title">所属组织:</span>
            <span class="infowindows-value">${e.clusterData[0].organizeName}</span>
          </div>
          <div class="infowindows-item">
            <span class="infowindows-title">关联产品:</span>
            <span class="infowindows-value">${e.clusterData[0].productName}</span>
          </div>
          <div class="infowindows-item">
            <span class="infowindows-title">设备DN:</span>
            <span class="infowindows-value">${e.clusterData[0].deviceId}</span>
          </div>
          <div id="custom-btn" class="infowindows-btn">查看详情</div>
        </div>`;
    infoWindow.value = new AMapVal.value.InfoWindow({
      content,
      anchor: 'bottom-left',
    });
    infoWindow.value.open(mapValue.value, [e.clusterData[0].lnglat.lng, e.clusterData[0].lnglat.lat]);
    setTimeout(() => {
      const button = document.getElementById('custom-btn');
      if (button) {
        button.addEventListener('click', () => {
          // console.log('按钮被点击了!');
          btnInfo(e.clusterData[0].deviceId);
        });
      }
    }, 100); // 延迟以确保 DOM 渲染完成
  }
};