vue 借助vue-amap插件对高德地图的简单使用

需求:实现点击获取经纬度、定位、对特殊位置标点及自定义信息窗体功能。

高德地图的官网API:概述-地图 JS API 1.4 | 高德地图API

vue-amap的中文文档:组件 | vue-amap

实现: 

1、安装vue-amap插件

npm install vue-amap --save

2、项目引入

在main.js中引入

需要提前申请高德key,步骤附在最后了

// 高德地图配置
import VueAMap from 'vue-amap' // 引入插件
Vue.use(VueAMap) // 使用插件
VueAMap.initAMapApiLoader({ // 初始化插件key: '高德申请的key', // 高德keyplugin: ['AMap.Geocoder', 'AMap.PlaceSearch', 'AMap.Geolocation', 'AMap.CitySearch'], // 插件集合,根据自己的需求添加uiVersion: '1.0.11', // 不加会报错,加上吧v: '1.4.15' // 默认高德 sdk 版本为 1.4.4
})
// 申请的Web端(JS API)的需要写上下面这段话
window._AMapSecurityConfig = {securityJsCode: '高德申请的kedy对应的安全密钥' // 高德Web端安全密钥
}

3、新建一个Map.vue文件

这里直接放我封装的组件

<template><div class="Map"><!-- 地图组件 --><el-amapvid="amapContainer"class="amapClass":zoom="zoom":plugin="plugin":center="center":events="events"><!-- 这里用于点击时的标点 --><el-amap-markerv-for="(marker, index) in markers":key="index + '1'":position="marker"/><!-- 这里用于特殊位置的标点 --><el-amap-markerv-for="(marker, index) in markerList":key="index + '2'":position="marker.lnglats":icon="getIcon(marker)":events="marker.events":offset="[-24, -24]"/><!-- 信息窗体 --><el-amap-info-windowv-if="currentWindow.visible":position="currentWindow.position":visible.sync="currentWindow.visible":content="currentWindow.content":close-when-click-map="false":events="currentWindow.events":offset="[0, -24]"/></el-amap></div>
</template><script>import LED0 from '@/assets/imgs/LED-0.png'
import LED1 from '@/assets/imgs/LED-1.png'
import lamppost0 from '@/assets/imgs/lamppost-0.png'
import lamppost1 from '@/assets/imgs/lamppost-1.png'
import tourGuide0 from '@/assets/imgs/tourGuide-0.png'
import tourGuide1 from '@/assets/imgs/tourGuide-1.png'
export default {name: 'Map',props: {zoom: { // 地图缩放比例。zoom值越小,越宏观、越大,越微观。type: Number,default: 14},center: {type: Array,default: () => [120.147076, 30.245426] // 西湖风景区的经纬度},markers: {type: Array,default: () => []},markerList: {type: Array,default: () => []},currentWindow: {type: Object,default: () => ({position: [],visible: false,content: '测试'})}},data() {const self = thisreturn {LED0,LED1,lamppost0,lamppost1,tourGuide0,tourGuide1,address: null,loaded: false,events: {init(o) {console.log('地图初始化', o)// ... 初始地图的一些操作},complete(){// ... 地图渲染完成后的一些操作}// 点击地图click: self.click},// 一些工具插件plugin: [{pName: 'Geocoder',events: {init(o) {console.log('Geocoder', o.getAddress())}}},{// 定位pName: 'Geolocation',events: {init(o) {// o是高德地图定位插件实例o.getCurrentPosition((status, result) => {// 会存在失败的时候,官网回答:https://lbs.amap.com/faq/js-api/map-js-api/position-related/43361/console.log('查询成功定位信息', status, result)if (result && result.position) {// 根据经纬度设置坐标 --不想替换掉默认的center的可以先注释self.$emit('update:center', [result.position.lng, result.position.lat])// self.$emit('update:markers', [[result.position.lng, result.position.lat]])// loadself.loaded = true// 页面渲染好后self.$nextTick()}})}}},{// 搜索 --我这里没用到pName: 'PlaceSearch',events: {init(instance) {console.log('搜索', instance)}}},{// 定位城市pName: 'CitySearch',events: {init(o) {// o是高德地图定位插件实例o.getLocalCity(function(status, result) {if (status === 'complete' && result.info === 'OK') {// 查询成功,result即为当前所在城市信息console.log('查询成功,当前所在城市信息', result)}})}}}]}},methods: {// 点击地图获取经纬度和具体位置click(e) {const { lng, lat } = e.lnglatthis.$emit('update:center', [lng, lat])this.$emit('update:markers', [[lng, lat]])console.log('[lng, lat]', [lng, lat])// 这里通过高德 SDK 完成。获取具体地址的const geocoder = new AMap.Geocoder({radius: 1000,extensions: 'all'})const that = thisgeocoder.getAddress([lng, lat], function(status, result) {if (status === 'complete' && result.info === 'OK') {if (result && result.regeocode) {that.address = result.regeocode.formattedAddressconsole.log('具体位置:', result.regeocode.formattedAddress)that.$nextTick()}}that.$emit('getLocation', { lng, lat, address: that.address })})},getIcon(item) {if (item.mediaTypeName === '灯杆屏') {return item.status ? this.lamppost0 : this.lamppost1} else if (item.mediaTypeName === '导览屏') {return item.status ? this.tourGuide0 : this.tourGuide1} else return item.status ? this.LED0 : this.LED1}}
}
</script>
<style lang="scss" scoped>
/* 指定地图的宽高 */
.amapClass, .Map {width: 100%;height: 100%;
}
</style>
 关于el-amap-marker的属性:

1、position:为marker点的坐标(经纬度),接收数组

2、icon:自定义图标地址

3、events:事件集合对象,click、dblclick、rightclick、mouseover、mouseout等

events: {click: (e) => {// ...点击操作},dblclick: (e) => {// ...双击操作},...
}

4、offset:偏移量

其他我没用到的还有:

5、clickable:true允许用户可点击marker点(默认也是true)

6、animation:marker点的动画效果

      marker点弹跳效果:设置值为 AMAP_ANIMATION_BOUNCE

7、label:点显示的简略信息

8、content可以是文字字符串也可以是html

关于el-amap-info-window信息窗体的属性

静态属性

名称类型说明
vidString组件的ID。
isCustomBoolean是否自定义窗体。设为true时,信息窗体外框及内容完全按照content所设的值添加(默认为false,即在系统默认的信息窗体外框中显示content内容)
autoMoveBoolean是否自动调整窗体到视野内(当信息窗体超出视野范围时,通过该属性设置是否自动平移地图,使信息窗体完全显示)
closeWhenClickMapBoolean控制是否在鼠标点击地图后关闭信息窗体,默认false,鼠标点击地图后不关闭信息窗体
showShadowBooleanBoolean 控制是否显示信息窗体阴影,取值false时不显示窗体阴影,取值true时显示窗体阴影默认值:false
offsetArray相对于基点的偏移量。默认情况是信息窗体的底部中心点(BOTTOM_CENTER) 和基点之间的偏移量

动态属性

名称类型说明
contentString/HTML显示内容。支持字符串和HTML。
templateString支持传入 Vue 模板。v0.4.0 开始支持。
vnodeVNode 或 Funtion: (Instance) => VNode支持 VNode 渲染。v0.4.2 开始支持
contentRenderFunction: (createElement: () => VNode, instance) => VNode支持 VNode render 渲染。v0.4.3 开始支持
sizeSize信息窗体尺寸(isCustom为true时,该属性无效)
positionArray信息窗体显示基点位置(自v1.2 新增)
visibleBoolean信息窗体是否显示。这里需要注意的是,高德地图只支持同时一个信息窗体的显示。所以一旦有窗体显示切换的场景,visible数组的状态需要自行维护。

 ref 可用方法

提供无副作用的同步帮助方法

函数返回说明
$$getInstance()AMap.InfoWindow获取infoWindow实例

事件(也是events里的)

事件参数说明
initObject高德组件实例
change属性发生变化时
open信息窗体打开之后触发事件
close信息窗体关闭之后触发事件

 4、使用地图组件

我把使用的页面也全贴上了,但其实search-box里面的东西大家可以忽略,只是针对markerList的查询过滤

<template><div class="box"><div class="search-box"><el-form ref="queryForm" label-width="auto" class="searchForm" :model="searchForm" style="padding: 16px 0 0;"><el-form-item label="类型" prop="mediaType"><el-select v-model="searchForm.mediaType"><el-option v-for="item in digitalTypeOptions" :key="item.value" :label="item.label" :value="item.value" /></el-select></el-form-item><el-form-item label="区域" prop="region"><el-select v-model="searchForm.region" clearable><el-option v-for="item in regionOptions" :key="item.value" :label="item.label" :value="item.value" /></el-select></el-form-item><el-form-item label-width="20px"><el-button v-permission="['ResourceDistribution:query']" class="search-btn" icon="el-icon-search" type="primary" @click="getDetail">查询</el-button><el-button class="reset-btn" icon="el-icon-refresh-left" @click="resetForm('queryForm')">重置</el-button></el-form-item><el-form-item label="设备名称" prop=""><el-select v-model="searchKey" filterable clearable placeholder="请输入关键字" @change="quickOrientation"><el-option v-for="item in markerList" :key="item.mediaCode" :label="item.mediaName" :value="item.mediaCode" /></el-select><!-- <el-input id="search" v-model="searchKey" placeholder="请输入设备名称" /> --></el-form-item><el-form-item label-width="20px" style="width: 100px;"><el-button v-permission="['ResourceDistribution:query']" class="search-btn" type="primary" @click="quickOrientation">快速定位</el-button></el-form-item></el-form><div class="rightType"><div v-for="item in digitalTypeOptions" :key="item.value" class="iconItem"><svg-icon v-if="item.label === '灯杆屏'" icon-class="lamppost" /><svg-icon v-else-if="item.label === '导览屏'" icon-class="tourGuide" /><svg-icon v-else icon-class="LED" /><span>{{ item.label }}</span></div></div></div><div class="rightBottom"><span class="successStatus">已启用</span><span class="errorStatus">已禁用</span></div><!-- 地图组件 --><Map:center.sync="center":markers.sync="markers":zoom.sync="zoom":marker-list="markerList":current-window="currentWindow"@getLocation="getLocation"/></div>
</template><script>
import Map from '@/components/Map'
import { dictList, deviceFilter } from '@/api/resource'
export default {name: 'GaodeDituAmap',components: { Map },data() {return {searchForm: {mediaType: '',region: ''},searchKey: '',digitalTypeOptions: [],regionOptions: [],currentWindow: {position: [],visible: false,content: '',events: {}},markerList: [],markers: [],center: [121.133858, 30.606042],zoom: 14 // 地图缩放比例。zoom值越小,越宏观、越大,越微观。}},mounted() {this.getDict()this.getDetail()},methods: {// 获取标点信息async getDetail() {this.currentWindow.visible = falseconst that = thisconst { data } = await deviceFilter(this.searchForm)data.forEach(item => {item.lnglats = [item.longitude, item.latitude]item.events = {click(e) {console.log('点击标点', e)that.center = item.lnglatsthat.currentWindow.content = that.createWinContent(item)that.currentWindow.position = item.lnglatsthat.currentWindow.events = {close(e) {console.log('窗体关闭', e)that.currentWindow.visible = false}}that.currentWindow.visible = true}}})this.markerList = data},/*** 基础配置信息*/async getDict() {const { data: { area, digitalType }} = await dictList('dictNames=area&dictNames=digitalType')this.regionOptions = areathis.digitalTypeOptions = digitalType},// 重置resetForm(formName) {this.$refs[formName].resetFields()this.zoom = this.$options.data.call(this).zoomthis.getDetail()},// 快速定位quickOrientation() {if (!this.searchKey) {this.markers = []this.currentWindow.visible = falsereturn}const cur = this.markerList.find(f => f.mediaCode === this.searchKey)if (cur) {this.center = [cur.longitude, cur.latitude]// this.markers = [this.center]this.currentWindow.content = this.createWinContent(cur)this.currentWindow.position = [cur.longitude, cur.latitude]this.currentWindow.visible = truethis.zoom = 15}},// 获取经纬度及地理位置getLocation({ lng, lat, address }) {console.log('获取到经纬度和地址啦:', lng, lat, address)},// 画信息窗createWinContent(item) {return `<div><div style="display: flex;margin-bottom: 12px">${item.src ? `<img src="${item.src}" style="width: 120px;margin-right: 16px;">` : ''}<div style="display: flex;flex-direction: column;justify-content: space-around;"><strong style="font-size: 18px">${item.mediaName}</strong><div style="margin-top: 6px"><span style="font-size: 14px;color: #0082FF;padding: 0px 6px;background: rgba(0,130,255,0.15);border-radius: 4px;">${item.mediaTypeName}</span><span style="font-size: 14px;color: ${!item.status ? '#46A77B' : '#E30000'};padding: 0px 6px;background: ${!item.status ? '#46A77B26' : '#E3000026'};border-radius: 4px;">${!item.status ? '已启用' : '已禁用'}</span></div><div style="margin-top: 8px"><i class="el-icon-location" style="color: #0082FF"></i><span style="font-size: 14px;">${item.regionName}</span></div></div></div><div style="font-size: 14px;color: #666666;line-height: 20px;"><span>${item.specification},</span><span>${item.supplier},</span><span>${item.supplierContact},</span><span>${item.supplierPhone}</span></div></div>`}}
}
</script>
<style lang="scss" scoped>
.box {width: 100%;height: 100%;box-sizing: border-box;padding: 0px;position: relative;.search-box {position: absolute;background-color: #FFFFFF;width: calc(100% - 32px);top: 16px;left: 16px;z-index: 999;border-radius: 4px;.searchForm .el-form-item {margin: 0 0px 16px;}.tip-box {width: 100%;max-height: 260px;position: absolute;top: 30px;overflow-y: auto;background-color: #fff;}.rightType{position: absolute;right: 0px;bottom: -24px;transform: translateY(100%);z-index: 999;background: #FFFFFF;border-radius: 4px;padding: 16px;display: flex;align-items: center;flex-direction: column;.iconItem{font-size: 14px;color: #4A4A4A;display: flex;align-items: center;flex-direction: column;.svg-icon{width: 24px;height: 24px;}}.iconItem+.iconItem{margin-top: 24px;}}}.rightBottom{position: absolute;right: 16px;bottom: 16px;z-index: 999;padding: 16px;font-size: 14px;color: #4A4A4A;background-color: #FFFFFF;border-radius: 4px;.successStatus{margin-right: 24px;}.successStatus::before{content: '';display: inline-block;height: 8px;width: 8px;background-color: #46A77B;border-radius: 50%;margin-right: 5px;}.errorStatus::before{content: '';display: inline-block;height: 8px;width: 8px;background-color: #FF4747;border-radius: 50%;margin-right: 5px;}}
}/* 指定地图的宽高 */
.amapClass {width: 100%;height: 100%;
}
</style>

成果大致样式如下:

附:高德Key申请

登录后到这个地址:我的应用 | 高德控制台

1、点击添加key

2、根据自己的需求选择服务平台,可以看看对应的“可使用服务” 来决定,我这里选择Web端

 3、提交后就有一条新增的记录,复制放进代码使用就好啦

参考地址:

vue-amap基于vue的高德地图使用_amap vue-CSDN博客

 1.5.1 信息窗体 - vue-amap 中文文档 - 开发文档 - 文江博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录第23天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 你修剪的方式不对&#xff0c;我来给你纠正一下&#xff01;| LeetCode&#xff1a;669. 修剪二叉搜索树_哔哩哔哩_bilibili 给你二叉搜索树的根节点 root …

大数据之scala

为什么学习scala spark是新一代内存级大数据计算框架&#xff0c;是大数据的重要内容 spark就是使用scala编写的&#xff0c;因此为了更好的学习spark&#xff0c;需要掌握scala这门语言 spark的兴起&#xff0c;带动scala语言的发展 scala发展历史 联邦理工学院的马丁 奥德…

17.注释和关键字

文章目录 一、 注释二、关键字class关键字 我们之前写的HelloWorld案例写的比较简单&#xff0c;但随着课程渐渐深入&#xff0c;当我们写一些比较难的代码时&#xff0c;在刚开始写完时&#xff0c;你知道这段代码是什么意思&#xff0c;但是等过了几天&#xff0c;再次看这段…

使用 OpenOCD 来调试 STM32

STM32 在 Windows 上的交叉编译二 调试 在上一篇博客 《在Windows上交叉编译STM32(环境搭建)》 &#xff0c;已经让 CubeMX 生成的工程成功编译&#xff0c;并下载到板子上了。 这篇博客主要继续介绍接下来的步骤&#xff0c;调试。硬件是使用的 ST-LINK &#xff0c;别的也无…

C++基础11:模板与命名空间

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C从入门到深入的专栏&#xff0c;参考书籍&#xff1a;《深入浅出 C {\rm C} C》(马晓锐)和《从 C {\rm C} C到 C {\rm C} C精通面向对象编程》(曾凡锋等)。 10.模板与命名空间 10.1 模板简述 模板使函数和类的处理对象…

API数据接口开发tglobal淘宝海外获得淘宝商品详情数据、商品ID、商品标题、价格、销量、规格属性等参数接入请求演示

要获取淘宝海外的商品详情、商品ID、商品标题、价格、销量、规格属性等参数&#xff0c;你可以使用淘宝海外的API。以下是一个简单的Python示例&#xff0c;使用requests库来调用淘宝海外的API。 首先&#xff0c;你需要注册一个开放平台账号并创建一个应用&#xff0c;以获取…

春秋云境CVE-2022-24663

简介 远程代码执行漏洞&#xff0c;任何订阅者都可以利用该漏洞发送带有“短代码”参数设置为 PHP Everywhere 的请求&#xff0c;并在站点上执行任意 PHP 代码。P.S. 存在常见用户名低权限用户弱口令 正文 进入首页我们没看到任何有价值的东西&#xff0c;那么就只好去寻找…

TOP100-回溯(二)

4.39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制…

【算法刷题 | 二叉树 05】3.28(左叶子之和、找树 左下角的值)

文章目录 11.左叶子之和11.1问题11.2解法一&#xff1a;递归11.2.1递归思路11.2.2代码实现 11.3解法二&#xff1a;栈11.3.1栈思想11.3.2代码实现 12.找树左下角的值12.1问题12.2解法一&#xff1a;层序遍历 11.左叶子之和 11.1问题 给定二叉树的根节点 root &#xff0c;返回…

【LeetCode】升级打怪之路 Day 28:回溯算法 — 括号生成 删除无效的括号

今日题目&#xff1a; 22. 括号生成301. 删除无效的括号 参考文章&#xff1a; 回溯算法&#xff1a;括号生成回溯算法&#xff1a;删除无效的括号 这是两道使用回溯算法来解决与括号相关的问题&#xff0c;具备一定的难度&#xff0c;需要学习理解。 通过第一道题“括号生成”…

RAFT:让大型语言模型更擅长特定领域的 RAG 任务

RAFT&#xff08;检索增强的微调&#xff09;代表了一种全新的训练大语言模型&#xff08;LLMs&#xff09;以提升其在检索增强生成&#xff08;RAG&#xff09;任务上表现的方法。“检索增强的微调”技术融合了检索增强生成和微调的优点&#xff0c;目标是更好地适应各个特定领…

查找总价格为目标值的两个商品【双指针】

这道题实际上跟本专栏上一题属于同一类型&#xff0c;是上一题的简单版&#xff0c;可以点击跳跃。 ⬇ 有效三角形的个数【双指针】 法一&#xff1a;暴力求解 class Solution { public:vector<int> twoSum(vector<int> &nums, int target){int n nums.size()…

Python3中画Sin (代码)

画正弦函数 import numpy as np import matplotlib.pyplot as plt # linspace() 函数用于生成等间隔的数字序列&#xff0c;接受三个参数&#xff1a;起始值&#xff0c;结束值&#xff0c;生成的点的数量 x np.linspace(0, 10, 100) y np.sin(x)plt.plot(x, y) plt.xlabel…

Vue中v-for多个Echarts图表组件只渲染一个要素问题排查

这个系列主要是用于记录我日常工作中遇到的一些Bug,既属于知识分享&#xff0c;也是对学习习惯的维持… 问题描述 今天&#xff0c;在开发一个WebGIS大屏项目时&#xff0c;我遇到了多个三维Echarts饼图图表渲染的问题&#xff0c;因为相似图表很多&#xff0c;我决定将Echart图…

Qt 多线程QThread的四种形式

重点&#xff1a; 1.互斥量&#xff1a;QMutex配套使用&#xff0c;lock(),unlock(),如果一个线程准备读取另一个线程数据时候采用tryLock()去锁定互斥量&#xff0c;保证数据完整性。 QMutexLocker简化版的QMutex,在范围区域内使用。 QMutex mutex QMutexLocker locker(&…

在Linux上使用nginx反向代理部署Docker网站

在政务云上部署Web环境&#xff0c;为了保证服务器安全&#xff0c;甲方只开放一个端口且只允许使用https协议进行访问&#xff0c;经过思考&#xff0c;决定使用docker部署网站&#xff0c;使用nginx反向代理&#xff0c;通过不同的二级域名访问不同的端口。 1 使用docker部署…

[Linux]条件变量:实现线程同步(什么是条件变量、为什么需要条件变量,怎么使用条件变量(接口)、例子,代码演示(生产者消费者模型))

目录 一、条件变量 1.什么是条件变量 故事说明 2、为什么需要使用条件变量 竞态条件 3.什么是同步 饥饿问题 二、条件变量的接口 1.pthread_cond_t 2.初始化&#xff08;pthread_cond_init&#xff09; 3.销毁&#xff08;pthread_cond_destroy&#xff09; 4.等待…

虚幻引擎资源加密方案解析

前段时间&#xff0c;全球游戏开发者大会(Game Developers Conference&#xff0c;简称GDC)在旧金山圆满落幕&#xff0c;会议提供了多份值得参考的数据报告。根据 GDC 调研数据&#xff0c;当下游戏市场中&#xff0c;Unreal Engine (下文简称虚幻)和 Unity 是使用最多的游戏引…

nginx代理解决跨域问题

文章目录 一、什么是跨域、跨域问题产生的原因二、注意事项三、nginx代理解决总结 一、什么是跨域、跨域问题产生的原因 跨域&#xff08;Cross-Origin&#xff09;是指在 Web 开发中&#xff0c;一个网页的运行脚本试图访问另一个网页的资源时&#xff0c;这两个网页的域名、…

蓝桥杯省三保底代码——数显+按键功能实现

目录 前言 一、为什么能保底省三 二、数显模块的实现 1.数码管显示​编辑 1&#xff09;断码表 2&#xff09;位选 3&#xff09;段选 4&#xff09;扫描 2.菜单 三、按键功能的实现 1.按键扫描 2.菜单切换 四、完整代码演示 五、结语 前言 上一期介绍全家桶时&…