@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组件,这两个组件的使用示例和方法可以查看文档。

相关推荐
风无雨1 小时前
react antd 项目报错Warning: Each child in a list should have a unique “key“prop
前端·react.js·前端框架
人无远虑必有近忧!1 小时前
video标签播放mp4格式视频只有声音没有图像的问题
前端·video
安分小尧6 小时前
React 文件上传新玩法:Aliyun OSS 加持的智能上传组件
前端·react.js·前端框架
编程社区管理员6 小时前
React安装使用教程
前端·react.js·前端框架
拉不动的猪7 小时前
vue自定义指令的几个注意点
前端·javascript·vue.js
yanyu-yaya7 小时前
react redux的学习,单个reducer
前端·javascript·react.js
skywalk81637 小时前
OpenRouter开源的AI大模型路由工具,统一API调用
服务器·前端·人工智能·openrouter
Liudef067 小时前
deepseek v3-0324 Markdown 编辑器 HTML
前端·编辑器·html·deepseek
拉不动的猪7 小时前
uniapp与React Native/vue 的简单对比
前端·vue.js·面试
z_mazin8 小时前
Chrome开发者工具实战:调试三剑客
前端·javascript·chrome·网络爬虫