@vuemap/vue-amap高德vue组件库常用技巧(六)- 点聚合

本文介绍了如何使用Vue-Amap组件库中的ElAmapMarkerCluster和ElAmapLayerDistrictCluster组件进行点聚合,以及如何使用ElAmapLayerHeatMap组件创建热力图,展示了在地图上展示数据聚合的步骤和示例代码。

@vuemap/vue-amap是基于高德JSAPI2.0、Loca2.0封装的vue组件库,支持vue2、vue3版本。首页地址:https://vue-amap.guyixi.cn/

在上一个分享中,主要讲解了如何在地图上展示动态的标记。这一次主要讲解怎么基于地图组件实现数据的聚合效果展示。

对于数据的聚合展示,日常使用中常用的展示方式就是点聚合以及热力图方式。下面详细介绍各自对应的组件的应用。

聚合点

聚合点可以详细的展示当前点的数量以及大致的分布情况,我们可以使用el-amap-marker-cluster组件来实现聚合点。
示例代码如下:

<template>
  <div class="map-page-container">
    <el-amap
      :show-label="false"
      :center="center"
      :zoom="zoom"
      @click="clickMap"
      @init="initMap"
    >
      <el-amap-marker-cluster
        v-if="visible"
        :points="markerPoints"
        @init="markerInit"
        @click="clickMarker"
      />
    </el-amap>
  </div>
  <div class="toolbar">
    <button @click="changeVisible">
      显隐
    </button>
  </div>
</template>

<script lang="ts" setup>
import {ref} from "vue";
import {ElAmap, ElAmapMarkerCluster} from "@vuemap/vue-amap";

const center = ref([104.937478, 35.439575]);
const zoom = ref(5);
const markerPoints = ref([]);
const visible = ref(true);

const clickMap = (e) => {
  console.log('click map: ', e);
}
const initMap = (map) => {
  console.log('init map: ', map);
  fetch('//a.amap.com/jsapi_demos/static/china.js').then(res => res.text()).then(text => {
    const array = text.split('=');
    if(array.length === 2){
      const result = JSON.parse(array[1].trim())
      result.forEach((item,index) => {
        item.extraData = {
          index
        }
      })
      markerPoints.value = result
    }
  })
}
const changeVisible = () => {
  visible.value = !visible.value;
}
const markerInit = (e) => {
  console.log('marker init: ', e);
}
const clickMarker = (e) => {
  console.log('marker click: ', e);
}
</script>

<style scoped>
</style>

效果图:
聚合点

通过传入经纬度数组我们就可以实现简单的聚合图层,但这时候出现另外一个问题,怎么给数据加上自己的业务数据,这时候我们可以在传递数据时直接添加我们需要的数据即可在点击事件中获取到我们的业务数据,具体的数据结构如下:

[
  {
    lnglat: [120, 31],
    weight: 0,
    extraData: {
      index: 1
    }
  }
]

这里的extraData可以是任何结构的数据,也就是整个数组的每一项其实都会原封不动的缓存在高德聚合插件数据中。通过这样调整,在点击事件中我们就可以拿到自己需要的业务数据,结果如下:
业务数据结果

区划聚合

除了上一个基础的聚合图层外,组件库额外实现了一个区划聚合插件,该插件基于AMapUI的区划聚合插件改造而成,适配JSAPI2.0,插件地址:https://github.com/yangyanggu/amap-district-cluster
示例如下:

<template>
  <div class="map-page-container">
    <el-amap
      :show-label="false"
      :center="center"
      :zoom="zoom"
      view-mode="3D"
      :pitch="20"
      @click="clickMap"
      @init="initMap"
    >
      <el-amap-layer-district-cluster
        :get-position="getPosition"
        :data="clusterData"
        :visible="visible"
        @featureClick="clickFeature"
        @init="initLayer"
      />
    </el-amap>
  </div>
  <div class="toolbar">
    <button @click="changeVisible">
      {{ visible ? '隐藏' : '显示' }}
    </button>
  </div>
</template>

<script lang="ts" setup>
import {ref, onMounted} from "vue";
import {ElAmap, ElAmapLayerDistrictCluster} from "@vuemap/vue-amap";

const zoom = ref(15);
const center = ref([116.33719, 39.942384]);
const visible = ref(true);
const changeVisible = () => {
  visible.value = !visible.value;
}

const clusterData = ref<any[]>([]);
const getPosition = (item: any) => {
  if (!item) {
    return null;
  }
  const parts = item.split(',');
  //返回经纬度
  return [parseFloat(parts[0]), parseFloat(parts[1])];
}
onMounted(() => {
  fetch('https://a.amap.com/amap-ui/static/data/10w.txt').then(res => {
    return res.text()
  }).then(csv => {
    clusterData.value = csv.split('\n');
  })
})

const clickMap = (e: any) => {
  console.log('click map: ', e);
}
const initMap = (map: any) => {
  console.log('init map: ', map);
}
const initLayer = (layer: any) => {
  console.log('聚合图层: ', layer);
}
const clickFeature = (e: any, feature: any) => {
  console.log('点击区划面: ', e, feature)
}
</script>



效果图
区划聚合

热力图

热力图常用于直观的展示某个区域某件事发生次数等等,通过颜色深浅变化,显示发生的次数最多的地方。

示例如下:

<template>
  <div class="map-page-container">
    <el-amap
      :center="center"
      :zoom="zoom"
      @init="initMap"
    >
      <el-amap-layer-heat-map
        v-if="dataSet"
        :visible="visible"
        :data-set="dataSet"
      />
    </el-amap>
  </div>
  <div class="toolbar">
    <button @click="switchVisible()">
      {{ visible? '隐藏' : '显示' }}
    </button>
  </div>
</template>

<script lang="ts" setup>
import {ref} from "vue";
import {ElAmap, ElAmapLayerHeatMap} from "@vuemap/vue-amap";

const zoom = ref(11);
const center = ref([116.418261, 39.921984]);

const dataSet = ref(null)

const visible = ref(true)
const switchVisible = () => {
  visible.value = !visible.value;
}

const initMap = () => {
  fetch('//a.amap.com/jsapi_demos/static/resource/heatmapData.js').then(res => res.text()).then(text => {
    const array = text.split('=');
    if(array.length === 2){
      let str = array[1].trim();
      str = str.replace(';','')
      dataSet.value = {
        data: JSON.parse(str),
        max: 100
      }
    }
  })
}

</script>

<style>
</style>



效果图
热力图

Vue 3项目中实现高德地图聚合功能,可按以下步骤操作: ### 1. 安装依赖 首先,在项目中安装 `@amap/amap-jsapi-loader`,它能帮助加载高德地图的JavaScript API。使用以下命令进行安装: ```bash npm install @amap/amap-jsapi-loader ``` ### 2. 引入和初始化高德地图 在Vue 3组件中引入 `@amap/amap-jsapi-loader` 并初始化地图。以下是一个示例代码: ```vue <template> <div id="container" style="width: 100%; height: 500px;"></div> </template> <script setup> import AMapLoader from '@amap/amap-jsapi-loader'; const loadMap = async () => { try { const AMap = await AMapLoader.load({ key: 'your-amap-key', // 替换为你的高德地图API密钥 version: '2.0', plugins: ['AMap.MarkerClusterer'] // 加载聚合插件 }); const map = new AMap.Map('container', { resizeEnable: true, center: [105, 34], zoom: 4 }); const markers = []; // 模拟添加一些标记 for (let i = 0; i < 10; i++) { const marker = new AMap.Marker({ position: [105 + i * 0.1, 34 + i * 0.1] }); markers.push(marker); } map.add(markers); const styles = [ { url: "http://isdapp.shandong.gov.cn/ceshicomp/resources/lnzbslc/dbx5x.png", size: new AMap.Size(32, 32), offset: new AMap.Pixel(-16, -16), textColor: "#fff" } ]; new AMap.MarkerClusterer(map, markers, { styles: styles, gridSize: 60 }); } catch (error) { console.error('地图加载失败:', error); } }; loadMap(); </script> ``` ### 代码解释 - **AMapLoader.load**:使用 `AMapLoader.load` 方法加载高德地图API,并传入必要的参数,如API密钥、版本和需要加载的插件(这里加载了 `AMap.MarkerClusterer` 用于聚合)。 - **创建地图**:使用 `new AMap.Map` 创建地图实例,并设置地图的容器、是否监控尺寸变化、初始中心和缩放级别。 - **创建标记**:通过循环创建多个标记,并将它们添加到 `markers` 数组中,然后使用 `map.add` 方法将标记添加到地图上。 - **聚合**:使用 `new AMap.MarkerClusterer` 创建聚合实例,传入地图实例、标记数组、聚合样式和网格大小等参数。 ### 注意事项 - 要将 `your-amap-key` 替换为你自己的高德地图API密钥。 - 确保网络连接正常,以便能成功加载高德地图API。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值