@vuemap/vue-amap高德vue组件库常用技巧(二)

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

在使用地图做可视化效果展示时,最常见的就是标号功能。日常开发中可能会使用到几十个、几百个、甚至几万个标号的展示,今天主要介绍在使用@vuemap/vue-amap时怎么对不同数量级、不同需求的标号进行展示。

1、300数量内标号

对于日常开发中只需要少量展示标号的需求时,我们可以直接使用el-amap-marker组件进行标号展示,该组件基于AMap.Marker实现,本质上是创建一个dom,通过position:absolute;悬浮在地图上方,由于基于dom实现,因此可以使用常用的html和css编写marker。 示例如下

html 复制代码
<template>
  <div class="map-page-container">
    <el-amap
      :show-label="false"
      :center="center"
      :zoom="zoom"
      @click="clickMap"
      @init="initMap"
    >
      <el-amap-marker
        :position="componentMarker.position"
        :visible="componentMarker.visible"
        :draggable="componentMarker.draggable"
        :move-options="moveOptions"
        @init="markerInit"
        @click="clickMarker"
      >
        <div style="padding: 5px 10px;white-space: nowrap;background: blue;color: #fff;">
          测试content
        </div>
      </el-amap-marker>
    </el-amap>
  </div>
</template>

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

const zoom = ref(16);
const center = ref([121.5273285, 31.21515044]);

const componentMarker = ref({
  position: [121.5273285, 31.21315058],
  visible: true,
  draggable: false
});

const moveOptions = ref({
  duration: 200,
  autoRotation: false
})

const clickMap = (e: any) => {
  console.log('click map: ', e);
}
const initMap = (map: any) => {
  console.log('init map: ', map);
}

const clickMarker = () => {
  alert('点击了标号');
}

const markerInit = (e: any) => {
  console.log('marker init: ', e);
}

</script>

<style scoped>
</style>

效果图:

上述示例中可以看出对于el-amap-marker组件,我们并没有使用属性去添加标号的内容,而是直接使用slot,相比使用content添加内容,使用slot可以更加方便直观的编写代码,也更符合vue组件规范。同时组件的slot支持响应式,会在内容更新时同步修改marker展示内容,比较适合根据条件展示不同的图标,以及一些复杂的标号内容显示。

2、千级数量

当marker数据量超过300以上时已经不适合使用dom格式的marker,这时候需要使用el-amap-label-marker组件,该组件支持添加图片和文本,同时支持标号之间的避让,甚至可以与底图默认标号进行避让,比较适合做一些poi等点位的显示。 示例如下

html 复制代码
<template>
  <div class="map-page-container">
    <el-amap
      :show-label="false"
      :center="center"
      :zoom="zoom"
      @click="clickMap"
      @init="initMap"
    >
      <el-amap-layer-labels>
        <el-amap-label-marker
          :visible="labelOptions.visible"
          :position="labelOptions.position"
          :text="labelOptions.text"
          :icon="labelOptions.icon"
          @click="clickMarker"
        />
      </el-amap-layer-labels>
    </el-amap>
  </div>
  <div class="toolbar">
    <button @click="changeVisible">
      {{ labelOptions.visible? '隐藏' : '显示' }}
    </button>
  </div>
</template>

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

const zoom = ref(16);
const center = ref([121.5495395, 31.21515044]);

const labelOptions = ref({
  visible: true,
  position: [121.5495395, 31.21515044],
  text: {
    content: '测试content',
    direction: 'right',
    style: {
      fontSize: 15,
      fillColor: '#fff',
      strokeColor: 'rgba(255,0,0,0.5)',
      strokeWidth: 2,
      padding: [3, 10],
      backgroundColor: 'yellow',
      borderColor: '#ccc',
      borderWidth: 3,
    }
  },
  icon: {
    image: 'https://a.amap.com/jsapi_demos/static/images/poi-marker.png',
    anchor: 'bottom-center',
    size: [25, 34],
    clipOrigin: [459, 92],
    clipSize: [50, 68]
  }
});
const changeVisible = () => {
  labelOptions.value.visible = !labelOptions.value.visible;
}

const clickMap = (e: any) => {
  console.log('click map: ', e);
}
const initMap = (map: any) => {
  console.log('init map: ', map);
}

const clickMarker = () => {
  alert('点击了标号');
}

</script>

<style scoped>
</style>

效果图: 从效果图中可以看出el-amap-label-marker支持图标与文本同时配置对于文本仅限于基础的CSS样式效果,所以该组件比较适合简单的图片加文字的展示方式。

3、万级数量

对于已经达到万级数量的数据,这时候如果需要展示marker只适合展示基础的图标样式,如果需要展示全部的marker点的话推荐使用el-amap-mass-marks或者Loca组件中的el-amap-loca-icon组件,这两个组件的使用示例和方法可以查看文档。

相关推荐
子春一25 分钟前
Flutter 2025 可访问性(Accessibility)工程体系:从合规达标到包容设计,打造人人可用的数字产品
前端·javascript·flutter
白兰地空瓶11 分钟前
别再只会调 API 了!LangChain.js 才是前端 AI 工程化的真正起点
前端·langchain
jlspcsdn1 小时前
20251222项目练习
前端·javascript·html
行走的陀螺仪1 小时前
Sass 详细指南
前端·css·rust·sass
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
React 怎么区分导入的是组件还是函数,或者是对象
前端·react.js·前端框架
LYFlied2 小时前
【每日算法】LeetCode 136. 只出现一次的数字
前端·算法·leetcode·面试·职场和发展
子春一22 小时前
Flutter 2025 国际化与本地化工程体系:从多语言支持到文化适配,打造真正全球化的应用
前端·flutter
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之file命令(实操篇)
linux·运维·前端·网络·chrome·笔记
羽沢313 小时前
ECharts 学习
前端·学习·echarts