在Vue项目里使用高德地图,网上有几个比较好用的,例如

  • AMap-Vue ,文档很好,但不开源
  • vue-amap ,文档让人流泪

懒人和需求不复杂的,可以直接使用上面的。上面两开源的已经不太活跃了,用的不放心。有些地图的高级功能,用起来特麻烦。所以,抛开第三方,封装自己的地图组件。

需求

  • 组件按需引入。个人喜欢代码干干净净,只要项目需要的功能就行了
  • 简单的封装下,方便直接按官方文档使用需要的功能,方便复用
  • 基于 Vue2AMap 2.0AMapUI 1.1

知识点

  • Vue插槽 slot,方便在地图上使用各种AMapUI功能
  • Vue通知 emiton。为了传参,主要是获取地图AMap对象
  • Vue组件封装,组件间有依赖的封装,可以参考
  • Vue异步加载组件
  • 演示用的轨迹数据通过本地mock实现,参考 vue本地模拟服务器请求mock数据

实现

components – map – index.vue

地图单文件组件,主要代码如下,具体参考代码

<template><div class="amap-view"><div id="amapcontainer" :style="{ height: mapHeight }" /><slot /></div>
</template>

components – map – index.js

地图组件的业务代码,可以配置地图开放的属性props和监听事件。

例如这里,开放了amapKey(申请的高德地图key),styleId(高德地图样式id),zoom(缩放值),center(地图加载默认中心点),height(地图默认高度值),plugins(地图默认加载的插件),uis(地图默认加载的AMapUI)。

监听了地图加载完毕的事件amap-ready,地图加载完毕才能搞事。把地图对象传给AMapUI相关封装的组件,方便调用。

用的是高德地图2.0版本,项目里面加载主要参考官方文档 高德地图JSAPI 的加载

主要代码如下,具体参考代码

import AMapLoader from '@amap/amap-jsapi-loader'export default {name: 'AmapView',props: {amapKey: {type: String,default: '6411e510973dc722ce416a298588ae4e'},styleId: {type: String,default: '728e2ca5c2c75aa8b26190a9e23c4687'},zoom: {type: Number,default: 12},center: {type: [Array, String],default() {return [113.220218, 23.404165]}},height: {type: Number | String,default: 520},plugins: {type: Array,default: () => []},uis: {type: Array,default: () => ['overlay/SimpleMarker']}},computed: {mapHeight() {return isNaN(this.height) ? this.height : `${this.height}px`}},data() {return {map: ''}},beforeDestroy() {this.map && this.map.destroy()this.map = null},created() {this.initMap()},methods: {initMap() {AMapLoader.load({key: this.amapKey,version: '2.0',AMapUI: {version: '1.1',plugins: this.uis}}).then((AMap) => {this.map = new AMap.Map('amapcontainer', {zoom: this.zoom, // 级别center: this.center, // 中心点坐标mapStyle: `amap://styles/${this.styleId}`})this.$emit('amap-ready', this.map)}).catch(e => {console.log(e)})}}
}

components – map --polyLine.vue

轨迹组件,主要开放了轨迹属性linePath,方便界面调用传参。具体属性配置参考文档 pathsimplifier

主要代码如下,具体参考代码

<template><div />
</template><script>
export default {name: 'AmapPolyline',props: {linePath: {type: Array,default() {return []},required: true}},created() {this.$parent.$on('amap-ready', this.initComponents)},methods: {initComponents(amap) {AMapUI.load(['ui/misc/PathSimplifier'], (PathSimplifier) => {if (!PathSimplifier.supportCanvas) {alert('当前环境不支持 Canvas!')return}const pathSimplifierIns = new PathSimplifier({zIndex: 100,map: amap, // 所属的地图实例getPath: function(pathData, pathIndex) {return pathData.path},getHoverTitle: function(pathData, pathIndex, pointIndex) {if (pointIndex >= 0) {return pathData.name + ',点:' + pointIndex + '/' + pathData.path.length}return pathData.name + ',点数量' + pathData.path.length},renderOptions: {renderAllPointsIfNumberBelow: 100 // 绘制路线节点,如不需要可设置为-1}})// 设置数据pathSimplifierIns.setData([{name: '路线0',path: this.linePath}])// 对第一条线路(即索引 0)创建一个巡航器const navg1 = pathSimplifierIns.createPathNavigator(0, {loop: true, // 循环播放speed: 100 // 巡航速度,单位千米/小时})navg1.start()})}}
}
</script>

调用方式

具体参考polylineTest里面的代码

polylineTest – index.vue

组件的调用方式

<amap-view><amap-polyline :line-path="data" />
</amap-view>

polylineTest – index.js

这里模拟请求轨迹数据,异步加载封装的地图组件AmapView和轨迹组件AmapPolyline

import { polylineData } from '@/api/polyline'export default {name: 'polylineTestView',components: {AmapView: () => import ('@/components/map/index.vue'),AmapPolyline: () => import ('@/components/map/polyLine.vue')},data() {return {data: []}},created() {this.testData()},methods: {async testData() {const { code, result } = await polylineData()if (code !== 0) returnthis.data = result.data}}
}

纯地图组件效果

带上轨迹组件效果

注意

createPathNavigatorspeed属性,在放大地图(zoom值很大)的时候,千万别设置太大的值,不然会看不到轨迹运动的效果的,一动不动,莫名其妙的。代码没问题,但是没效果,这真的很蛋疼。估计是运动太快,眼睛跟不上。

代码总览

涉及的文件如下(具体参考代码):

|-- public|-- data|-- polyline.json    // 演示用轨迹数据
|-- src|-- api|-- polyline.js    // 模拟真实数据接口请求|-- components|-- map|-- index.vue    // 地图单文件组件,供界面调用|-- index.js    // 地图初始化、配置相关|-- polyLine.vue    // 简单封装的轨迹组件,演示用|-- views|-- polylineTest    // 演示实例所在|-- index.vue|-- index.scss|-- index.js

代码

代码总览的目录去代码里找着看就行了。

总结

以上,只是简单的封装。轨迹组件只是在 JS API UI 组件示例 上面随便找了个轨迹展示简单路径的示例代码。真正使用的时候,可以看需求拓展。像轨迹上面的每个点,可以弹窗显示具体地点的信息的,这个在人员轨迹展示的时候,很常用到。这个涉及到Vue实时渲染组件的用法,这里不多说了。

Vue对高德地图2.0的封装使用相关推荐

  1. 高德地图Amap2.0注销清除不掉内存的解决方法

    使用场景: 在单页面应用中(vue,react等),使用地图组件,在切换页面(路由)时,当前高德的地图注销方法不能够完全清除,在多次重复切换(地图与其他页面)时,会导致内存疯狂增长,最后浏览器.页面的 ...

  2. vue是否可以做行车轨迹_在vue中高德地图引入和轨迹的绘制的实现

    高德地图引入和轨迹的绘制 1.第一步 vue中使用cdn引入高德地图,并在main.js中进行全局配置.(百度上有高德地图引入与配置方法,这里就不详细介绍): 1)npm install vue-am ...

  3. vue使用高德地图-进行显示地图和查询天气

    vue使用高德地图 高德地图显示,实现了天气查询效果(Vue) 在index.html中 引入高德地图的css和js vue 插件列表 问题解决: 高德地图显示,实现了天气查询效果(Vue) 在ind ...

  4. vue使用高德地图小demo(标记点,画线,3D,叠加图片图层)

    vue使用高德地图小demo(标记点,画线,3D) 这个模式是3D的,可以看到地图是带有一定的倾角的. 注意:3D模式下,是不能够将进行画线的,不能使用PathSimplifier,改成2D可以正常使 ...

  5. vue使用高德地图aMap实现轨迹动画查询显示

    vue使用高德地图搜索地址添加标记marker,定位,拖拽选址功能https://blog.csdn.net/SmartJunTao/article/details/123955679 实现效果: 需 ...

  6. vue调用高德地图实现定位

    vue调用高德地图实现定位 第一步创建高德地图key 第二步:下载vue-amap npm install vue-amap --save 第三步:在项目main.js引入vue-amap impor ...

  7. 高德地图html js开发例子,vue.js高德地图实现热点图代码实例

    1.在index.html引入高德地图JSAPI 2.地图dom 3.js实现 export default { data() {}, methods:{ initMap(){ let map = n ...

  8. Vue使用高德地图api实现热力图动态缩放

    Vue使用高德地图api实现热力图动态缩放 前言 1.引入高德js 2.显示基本的热力图 3.显示优化 4.Vue页面完整代码 前言 项目需要,根据积水数据的多少,在页面中进行展示,选用高德热力图ap ...

  9. 使用vue和高德地图,仿58地图找房pc端,且解决marker过多卡顿

    使用vue和高德地图,仿58地图找房pc端,且解决marker过多卡顿 1.在index.html引入高德地图链接 https://webapi.amap.com/maps?v=1.4.15& ...

最新文章

  1. python列表可以混合类型_如何在Python中将混合数据类型的列表转换为数据帧
  2. 从“不务正业”到“回归本行”,“中年”雅戈尔的偶然与必然
  3. 面试被问 | 防止 Java 代码被反编译的方法有几种?
  4. 多通道_多通道光纤滑环与单通道光纤滑环的设计原理区别
  5. 某知名公司ERP数据库结构[5]
  6. DDNS For RHEL5
  7. 【重大修改】动态时间规整(Dynamic Time Warping)
  8. 动态规划算法实验报告_强化学习之动态规划算法
  9. python评语生成_电商 Python 生成补单公司需要的评论格式3
  10. 【Computer Organization笔记22】虚拟存储器:段式存储,页式存储
  11. python线程join方法_Python多线程join()用法
  12. 论文笔记_SLAM_综述十几篇_目录
  13. 第三届 Apache Flink 极客挑战赛暨 AAIG CUP 攻略发布!
  14. 【数学信号处理】基于matlab数字信号频谱分析【含Matlab源码 1544期】
  15. windows 2008下载地址及版本介绍
  16. cpu散片是什么意思?
  17. CI/CD到底是什么?看完就能很快理解
  18. Ubuntu下使用unison实现文件双向同步
  19. 使用OpenSSL生成证书
  20. 技术支持和测试的区别_软件测试与开发岗位,哪个更适合你?

热门文章

  1. linux发行版本号列举,查看Linux发行版的名称及其版本号
  2. 如何更换我的密钥对?
  3. python实现base64解码_Python实现base64编码解码
  4. 什么是java?以及java的初步简单学习
  5. 王家林人工智能AI第14课:通过K-Nearest Neighbors改进在Social Network上销售汽车推荐系统的精准性 老师微信13928463918
  6. 敲开bp神经网络之门(三,机器视觉斑点blob匹配中使用)
  7. uefi装完系统后无法引导_不重装系统修改引导方式为UEFI模式
  8. 安卓手机续航测试软件,10款手机电池续航测试对决:都是骁龙865手机,续航差距有多大?...
  9. 上海高中开设计算机课,如何提升高中计算机课的趣味性
  10. [APP资讯] 开发一个App要多少钱?有免费开发App的网站吗?