Vue基于高德地图API封装一个地图组件

一、参考资料
 

高德开放平台 | 高德地图API (amap.com)
 

二、安装及配置
 

pnpm i @vuemap/vue-amap --save

man.ts      密钥及安全密钥需要自己到高德地图开放平台控制台获取.

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import vant from 'vant'
import 'vant/lib/index.css'
import VueAMap, { initAMapApiLoader } from '@vuemap/vue-amap'
import '@vuemap/vue-amap/dist/style.css'import * as echarts from 'echarts'initAMapApiLoader({key: '841d5250cb7f61adda2ee70c1e3abdaf',securityJsCode: 'd122cbf5a33de34356661cf0cef1a553', // 新版key需要配合安全密钥使用plugins: [// 定位空间,用来获取和展示用户主机所在的经纬度位置'AMap.Geolocation',// 输入提示插件'AMap.Autocomplete',// POI搜索插件'AMap.PlaceSearch',// 右下角缩略图插件,比例尺'AMap.Scale',// 地图鹰眼插件'AMap.OverView',// 地图工具条'AMap.ToolBar',// 类别切换空间,实现默认图层与卫星图,实施交通层之间切换的控制'AMap.MapType',// 编辑 折线多边形'AMap.PolyEditor','AMap.CircleEditor',// 地图编码'AMap.Geocoder']
})const app = createApp(App)
//全局挂载echarts
app.config.globalProperties.$echarts = echarts
app.use(router)
app.use(ElementPlus)
app.use(VueAMap)
app.use(vant)
app.mount('#app')
三、源码分享
 

1、map.vue

<template><el-dialog v-model="showMapDialog"><template #default><div id="container"><AmapSelect v-model="locationData" @callback="getMapInfo" /></div></template></el-dialog>
</template><script lang="ts" setup>
import { ref, nextTick, defineEmits } from 'vue'
// import { ElMessage } from 'element-plus';
import AmapSelect from './AmapSelect.vue'const props = defineProps({title: {type: String,default: '选择位置'},center: {type: Array,default: () => [115.846381, 28.659961]}
})const locationData:any = ref([])
const showMapDialog = ref(false)
const emit = defineEmits(['submit'])function getMapInfo(info: any) {// console.log(info,'info'); 可拿到点击的地址 以及经纬度  可用于做回显等其他操作// debuggeremit('submit', {address: info.address,lnglat: info.lnglat})
}const openForm = () => {showMapDialog.value = truenextTick(() => {locationData.value=props.center;})
}//提交// const okModal = async () => {}//导出方法defineExpose({openForm
})
</script><style lang="scss" scoped>
#container {height: 400px;
}.el-dialog__body {padding: 0 !important;
}
</style>

2、AmapSelect.vue

<template><el-amap :zoom="zoom" @init="init"><el-amap-search-box:visible="visible"@select="selectChange"@choose="handleChange"placeholder="请输入"/></el-amap>
</template><script>
export default {name: 'AmapSelect',emits: ['callback'],props: {visible: {type: Boolean,default: true},modelValue: {type: Array,default: []}},data() {return {zoom: 12,map: null,geocoder: new AMap.Geocoder({}),activeAddress: null,}},watch: {modelValue: {handler(val, oldVal) {if (val) {// let lnglat = val[1].split(',')this.onClickMap({lnglat: { lng: val[0], lat: val[1] }})}},deep: true}},mounted() {},methods: {init(map) {this.map = mapmap.on('click', this.onClickMap.bind(this))},selectChange({ poi }) {if (poi.location) {let { lng, lat } = poi.locationthis.onClickMap({lnglat: { lng, lat }},() => {this.map.setCenter([lng, lat])})}},handleChange(e) {console.log('handleChange: ', e)}, // 点击地图onClickMap(e, callback) {let lnglat = [e.lnglat.lng, e.lnglat.lat]var infoWindow = new AMap.InfoWindow({offset: new AMap.Pixel(0, 0)})this.geocoder.getAddress(lnglat, (status, result) => {if (status === 'complete' && result.info === 'OK') {// result为对应的地理位置详细信息var province = result.regeocode.addressComponent.province //省var city = result.regeocode.addressComponent.city //市var district = result.regeocode.addressComponent.district //县区var township = result.regeocode.addressComponent.township //镇、街道var region = province + city + district + township //返回所属区域let addressName = result.regeocode.formattedAddress.replace(region,'')let address = ''if (!addressName) {address = regionaddressName = region} else {address = result.regeocode.formattedAddress}let obj = {lnglat: lnglat.toString(),address: address,addressName: addressName}infoWindow.setContent(this.createdInfoWindowContent(obj))infoWindow.open(this.map, lnglat) // 更新数据callback && callback()}})this.map.setCenter(lnglat)}, // 窗口信息createdInfoWindowContent(data) {var infoWindowContent ='<style>.btn {display: inline-block; font-weight: 400; text-align: center; white-space: nowrap; vertical-align: middle;' +'-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; border: 1px solid transparent;' +'transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;' +'background-color: transparent; background-image: none; color: #25A5F7; border-color: #25A5F7; padding: .25rem .5rem; line-height: 1.5;' +'border-radius: 1rem;  -webkit-appearance: button; cursor:pointer;}</style>' +'<div className="custom-infowindow input-card">' +'<label  class="input-item-text">' +data.addressName +'</label>' +'<div class="input-item">' +'<div class="input-item-prepend">' +'<span style="color:grey">' +data.address +'</span>' +'</div>' +'</div>' + // 为 infowindow 添加自定义事件'<input id="lnglat2container" type="button" class="btn" value="选择地址" onclick="setLngLat()"/>' +'</div>'// debugger;window.setLngLat = () => {this.$emit('update:modelValue', [data.address, data.lnglat])this.$emit('callback', data)}return infoWindowContent}}
}
</script><style lang="scss" scoped></style>
四、效果展示

点击窗口信息的选择地址可拿到点击位置的信息然后再做后续操作!!!主要还是参考高德地图API的官方文档.

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯管道

一开始拿到这道题没有什么头绪。综合各路大佬题解&#xff0c;一下子豁然开朗。 题眼&#xff1a;每一段感受器都感受到水的最早时间。由于整个管道&#xff0c;分为多个段&#xff0c;每个段都有一个感受器。所以题眼翻译为&#xff1a;覆盖满整条管道&#xff0c;所需要的最短…

系统设计 --- E2E Test System

系统设计 --- E2E Test System 什么是E2EE2E Architecture Example 什么是E2E E2E&#xff08;端到端&#xff09;测试是一种软件测试方法&#xff0c;旨在模拟真实的用户场景&#xff0c;测试整个应用程序或系统的端到端功能和交互流程。E2E 测试涵盖了从用户界面到后端系统的…

用于车载T-BOX汽车级的RA8900CE

用于车载T-BOX等高精度计时的汽车级时钟模块RTC:RA8900CE.车载实时时钟芯片RA8900CE内置32.768Khz的晶体&#xff0c;实现年、月、日、星期、小时、分钟和秒精准计时。RA8900CE满足AEC-Q200认证&#xff0c;内置温补功能&#xff0c;保证实时时钟的稳定可靠&#xff0c;功耗低至…

计算机网络3——数据链路层3以太网的MAC层

文章目录 一、MAC 层的硬件地址1、介绍2、注意点3、定制标准 二、MAC 帧的格式1、结构2、工作原理3、其他 一、MAC 层的硬件地址 1、介绍 在局域网中&#xff0c;硬件地址又称为物理地址或 MAC地址(因为这种地址用在MAC帧中)。 大家知道&#xff0c;在所有计算机系统的设计中…

[C++][算法基础]能被整除的数(容斥原理)

给定一个整数 &#x1d45b; 和 &#x1d45a; 个不同的质数 &#x1d45d;1,&#x1d45d;2,…,&#x1d45d;&#x1d45a;。 请你求出 1∼&#x1d45b; 中能被 &#x1d45d;1,&#x1d45d;2,…,&#x1d45d;&#x1d45a; 中的至少一个数整除的整数有多少个。 输入格式…

Linux报错处理:‘abrt-cli status’ timed out

最近登录服务器时出现报错&#xff0c;后来查阅资料发现是因为ssh登录时间很久&#xff0c;登录后出现abrt-cli status timed out 的报错。 1.问题分析 abrt-cli是ABRT(Automated Bug Reporting Tool)的命令行接口&#xff0c;用于在Linux系统中处理和报告程序崩溃。 如果abr…

【Java--数据结构】“从扑克到程序:深入探讨洗牌算法的原理与魅力“

前言 以下是学习Java顺序表的一个实例应用———简单的洗牌算法。 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 定义每张扑克牌的属性 生成一副扑克牌&#xff08;不包含大小王&#xff09; 洗牌方法 发牌方…

软件测试之【软件测试概论二】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言软件测试模型瀑布模型V模型W&#xff08;双V&#xff09;模型测试活动 软…

ElasticSearch总结二

正向索引和倒排索引&#xff1a; 正向索引&#xff1a; 比方说我这里有一张数据库表&#xff0c;那我们知道对于数据库它一般情况下都会基于i d去创建一个索引&#xff0c;然后形成一个b树。 那么你根据i d进行检索的速度&#xff0c;就会非常的快&#xff0c;那么这种方式的…

(N-151)基于微信小程序校园学生活动管理平台

开发工具&#xff1a;IDEA、微信小程序 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;vue、uniapp 服务端技术&#xff1a;springbootmybatisplus 本系统分微信小程序和管理后台两部分&am…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.6-1.8

目录 第一门课&#xff1a;第二门课 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)…

【六十】【算法分析与设计】用一道题目解决dfs深度优先遍历,dfs中节点信息,dfs递归函数模板进入前维护出去前回溯,唯一解的剪枝飞升返回值true

路径之谜 题目描述 小明冒充X星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是nn个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着音走,也不能跳跃。每走到一个新方格,就要向正北 方和正西…

跨部门协作中的沟通困境与平台建设策略——以软硬件研发为例

一、背景 在科技行业&#xff0c;跨部门合作的重要性不言而喻&#xff0c;然而实际工作中&#xff0c;经常会遭遇沟通不畅的现象。以软件与硬件研发部门为例&#xff0c;两者在产品研发过程中经常需要紧密协作&#xff0c;但却时常出现信息传递障碍。当你试图阐述观点时&#…

01、创建型-单例模式--只有一个实例

文章目录 前言一、基本介绍1.1 什么是单例模式1.2 为什么要用单例模式1.3 应用场景1.4 单例优缺点 二、单例模式的实现方式2.1 饿汉式单例2.1.1 静态变量方式2.1.2 静态代码块 2.2 懒汉式单例2.2.1 懒汉式单例2.2.2 懒汉式优化①-线程安全2.2.2 懒汉式优化②-双重检查锁2.2.3 懒…

图书租赁系统-扣费服务

resources中添加moment.js文件。 然后引入moment.js文件&#xff1a; <script src"/js/moment.js"></script>借阅结束时间选完后changeDate事件&#xff1a; $("input[nameendTime]").datetimepicker({format: "yyyy-mm-dd hh:ii",…

分享基于鸿蒙OpenHarmony的Unity团结引擎应用开发赛

该赛题旨在鼓励更多开发者基于OpenHarmony4.x版本&#xff0c;使用团结引擎创造出精彩的游戏与应用。本次大赛分为“创新游戏”与“创新3D 化应用”两大赛道&#xff0c;每赛道又分“大众组”与“高校组”&#xff0c;让不同背景的开发者同台竞技。无论你是游戏开发者&#xff…

【NoC片上网络 On-Chip Network】应用程序的网络流量 合成网络流量

应用程序的网络流量 and 合成网络流量 1. 应用程序的网络流量 APPLICATION TRAFFIC2. 合成网络流量 SYNTHETIC TRAFFIC3. 合成网络流量的具体介绍 应用程序的网络流量 and 合成网络流量 1. 应用程序的网络流量 APPLICATION TRAFFIC 在 MPSoC(多处理器片上系统) 中&#xff…

网络安全之CSRFSSRF漏洞(上篇)(技术进阶)

目录 一&#xff0c;CSRF篇 二&#xff0c;认识什么是CSRF 三&#xff0c;实现CSRF攻击的前提 四&#xff0c;实战演练 【1】案例1 【2】案例2 【3】案例3 【4】案例4&#xff08;metinfo&#xff09; 一&#xff0c;CSRF篇 二&#xff0c;认识什么是CSRF CSRF&#x…

使用ollama部署llama3-8B

windows系统 安装ollama教程如下&#xff1a;https://juejin.cn/post/7359821944147722280 如果你不仅仅满足于本地自己调试&#xff0c;还希望同事也能够访问 那么按照下面步骤走&#xff08;windows系统&#xff09; set OLLAMA_HOST0.0.0.0 ollama serve然后同一个局域网下…

uniapp app权限说明弹框2024.4.23更新

华为上架被拒绝 用uni-app开发的app&#xff0c;上架华为被拒&#xff0c;问题如下&#xff1a; 您的应用在运行时&#xff0c;未见向用户告知权限申请的目的&#xff0c;向用户索取&#xff08;电话、相机、存储&#xff09;等权限&#xff0c;不符合华为应用市场审核标准。…