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://www.mzph.cn/web/2467.shtml

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

相关文章

java实现解析html获取图片或视频url

一、前言 有时在实际项目中&#xff0c;比如发布某篇文章&#xff0c;需要取文章中的某张图片作为封面&#xff0c;那么此时需要文章内容&#xff0c;获取html内容中的图片地址作为封面&#xff0c;下面讲下如何获取html中的图片或视频地址。 二、实现 1.先定义一个工具类&…

Python学习教程(Python学习路线+Python学习视频):Python数据结构

数据结构引言&#xff1a; 数据结构是组织数据的方式&#xff0c;以便能够更好的存储和获取数据。数据结构定义数据之间的关系和对这些数据的操作方式。数据结构屏蔽了数据存储和操作的细节&#xff0c;让程序员能更好的处理业务逻辑&#xff0c;同时拥有快速的数据存储和获取方…

android openGL ES详解

1、渲染线程与主线程的通信 两个线程之间的通信可以用如下方法: 在主线程中的 GLSurfaceView 实例可以调用 queueEvent( &#xff09;方法传递一个 Runnable 给后台渲染线程&#xff0c;渲染线程可以调用 Activity 的 runOnUIThread()来传递事件 (event) 给主线程。 2、顶点…

Redhawk:ATE如何产生top level sta file

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接 redhawk: create STA file 在“redhawk: create STA file”一文中介绍了ate的用法,可以应对block level的设计,但当需要做top level分析时&

构建安全高效的前端权限控制系统

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

单片机学习过程

继电器光耦隔离电压转换步进电机直流电机 arduino是最好用的一种&#xff0c;他提供了完整的设备库文件&#xff0c;任何外部设备只要查找相应的库&#xff0c;就可以很方便的使用 &#xff0c; 但是如果不去学习51 或stm32 或 嵌入式玩玩还可以&#xff0c;如果碰到没有实现的…

使用 IPAM 解决方案简化分布式网络管理

随着组织在数字领域的全球扩张&#xff0c;分布式网络是不可避免的&#xff0c;这意味着&#xff0c;随着 IT 基础设施的发展&#xff0c;组织需要适应&#xff0c;这包括在不断增长的系统需求、应用程序堆栈、各种协议和安全防御中监控、现代化和简化流程和资源。在有效管理现…

盲人过马路安全:科技力量赋予“隐形守护者”

作为一名资深记者&#xff0c;我始终关注着社会各群体的生活现状&#xff0c;尤其是那些面临特殊挑战的人群。今天&#xff0c;我想聚焦一个看似平常却对盲人构成重大困扰的日常场景——过马路&#xff0c;以及一款名为蝙蝠避障的辅助应用如何成为他们的盲人过马路安全的守护者…

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决 文章目录 1.前言2.doris是什么&#xff1f;2.1简介2.2介绍2.3使用场景2.4架构 3.官网4.构建部署4.1 构建环境4.2 doris2.0.4的fe和be镜像构建4.2.1 fe2.0.4镜像构建脚本4.2.2 be2.0.4镜像构建4.2.3 启动脚…

FebHost:科技企业如何规划并注册.AI域名?

为确保企业使用.AI域名的方式准确反映其对人工智能技术的关注&#xff0c;企业应考虑以下步骤&#xff1a; 了解法律和合规要求&#xff1a; 第一步是了解与 .AI 域名相关的独特法律和合规要求。由于.AI域名源于安圭拉&#xff0c;企业必须遵守安圭拉的限制和法律规定。这包括…

C语言 字符类型

下面 我们来说字符类型 我们来看这个 保险单 金额 和 总额 都可以用数字类型 而性别则需要字符型 字符数据的存储 – ASCI码 字符类型 char 就是专为存储字符(如字母&#xff0c;标点和数字)而设计的类型。 使用单引号包含单个字符或转义字符去表示一个 char 类型的常量。 …

李沐56_门控循环单元——自学笔记

关注每一个序列 1.不是每个观察值都是同等重要 2.想只记住的观察需要&#xff1a;能关注的机制&#xff08;更新门 update gate&#xff09;、能遗忘的机制&#xff08;重置门 reset gate&#xff09; !pip install --upgrade d2l0.17.5 #d2l需要更新import torch from tor…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别 一、简单介绍 二、简单进行车牌检测和识别实现原理 …

Opencv_10_自带颜色表操作

void color_style(Mat& image); Opencv_10_自带颜色表操作&#xff1a; void ColorInvert::color_style(Mat& image) { int colormap[] { COLORMAP_AUTUMN, COLORMAP_BONE , COLORMAP_JET , COLORMAP_WINTER, COLORMAP_RAINBOW , COLOR…

编译器的学习

常用的编译器&#xff1a; GCCVisual CClang&#xff08;LLVM&#xff09;&#xff1a; Clang 可以被看作是建立在 LLVM 之上的一个项目, 实际上LLVM是clang的后端&#xff0c;clang作为前端前端生成LLVM IR&#xff0c;https://zhuanlan.zhihu.com/p/656699711MSVC &#xff…

Docker常用命令(镜像、容器、网络)

一、镜像 1.1 存出镜像 将镜像保存成为本地文件 格式&#xff1a;docker save -o 存储文件名 存储的镜像docker save -o nginx nginx:latest 1.2 载入镜像 将镜像文件导入到镜像库中 格式&#xff1a;docker load < 存出的文件或docker load -i 存出的文件…

程序猿成长之路之数据挖掘篇——朴素贝叶斯

朴素贝叶斯是数据挖掘分类的基础&#xff0c;本篇文章将介绍一下朴素贝叶斯算法 情景再现 以挑选西瓜为例&#xff0c;西瓜的色泽、瓜蒂、敲响声音、触感、脐部等特征都会影响到西瓜的好坏。那么我们怎么样可以挑选出一个好的西瓜呢&#xff1f; 分析过程 既然挑选西瓜有多个…

Android Studio 报错:AVD Pixel_3a_API_30_x86 is already running

在我的Android Studio和虚拟机运行时&#xff0c;我的电脑不小心关机了&#xff0c;在启动后再次打开Android Studio并运行虚拟机时发现报错。 Error while waiting for device: AVD Pixel_3a_API_30_x86 is already running. If that is not the case, delete the files at C…

c++设计模式之桥接模式(拼接组合)

桥接模式&#xff1a;就是进行拼接组装 应用举例&#xff1a; 1.定义了形状&#xff0c;抽象形状接口&#xff0c;圆&#xff0c;矩形 2.定义了颜色&#xff0c;抽象颜色接口&#xff0c;红色&#xff0c;蓝色 3&#xff0c;怎么桥接&#xff0c;抽象具体形状和具体颜色的组合…

应用部署tomcat的三种方式

由于一直在用springboot框架&#xff0c;集成了tomcat&#xff0c;快忘记如何单独部署tomcat了&#xff0c;以下&#xff0c;记录一下&#xff1a; 部署tomcat有三种方式&#xff1a; 一、方式一&#xff1a;将war包丢进webapps 这是最简单粗暴的方式&#xff1a;将web工程打…