基于高德地图JS API实现Vue地图选点组件

基于高德地图JS API2.0实现一个搜索选择地点后返回给父组件位置信息的功能,同时可以进行回显

目录

  • 1 创建key和秘钥
    • 1.1 登录高德地图开放平台
    • 1.2 创建应用
    • 1.3 绑定服务创建秘钥
  • 2 使用组件前准备
    • 2.1 导入loader
    • 2.2 在对应的组件设置秘钥
    • 2.3 引入css样式
  • 3 功能实现
    • 3.1 初始化地图
    • 3.2 增加搜索功能
    • 3.3 暴露增加标记函数
  • 4 全部代码
  • 5 实现效果

1 创建key和秘钥

1.1 登录高德地图开放平台

打开开放平台地址

注册账号 或 申请账号

1.2 创建应用

在这里插入图片描述

1.3 绑定服务创建秘钥

在这里插入图片描述

在这里插入图片描述

2 使用组件前准备

2.1 导入loader

推荐pnpm

pnpm i @amap/amap-jsapi-loader -D

2.2 在对应的组件设置秘钥

<script type="text/javascript" lang="ts">
window._AMapSecurityConfig = {securityJsCode: "安全秘钥"
};
</script>

2.3 引入css样式

<link rel="stylesheet" href="https://cache.amap.com/lbs/static/main1119.css" />

3 功能实现

3.1 初始化地图

<script setup lang="ts">
import { ref, onMounted, onUnmounted } from "vue";
import AMapLoader from "@amap/amap-jsapi-loader";
import { Search } from "@element-plus/icons-vue";let map = null;
let aMap = null;
onMounted(() => {AMapLoader.load({key: "key", // 申请好的Web端开发者Key,首次调用 load 时必填version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15plugins: ["AMap.PlaceSearch", "AMap.AutoComplete"] // 需要使用的的插件列表,如比例尺'AMap.Scale'等}).then(AMap => {// 第一参数是对应的div的idmap = new AMap.Map("container", {// 设置地图容器idviewMode: "3D", // 是否为3D地图模式zoom: 11, // 初始化地图级别center: [116.397428, 39.90923] // 初始化地图中心点位置});aMap = AMap;});
});
onUnmounted(() => {map?.destroy();
});
</script>
<template><div id="map-box"><div id="container" /></div>
</template>
<style scoped>
#map-box {width: 100%;height: 450px;position: relative;
}
#container {width: 100%;height: 100%;
}#myPageTop {position: absolute;top: 5px;right: 10px;font-family: "Microsoft Yahei", Pinghei;font-size: 14px;background: none 0px 0px repeat scroll rgb(255, 255, 255);border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);border-image: initial;margin: 10px auto;padding: 6px;
}
#panel {background-color: white;max-height: 400px;overflow-y: auto;
}
</style>

3.2 增加搜索功能

function search() {const placeSearch = new aMap.PlaceSearch({pageSize: 10, // 单页显示结果条数pageIndex: 1, // 页码map: map, // 展现结果的地图实例panel: "panel", // 结果列表将在此容器中进行展示。autoFitView: true // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围});//关键字查询placeSearch.search(keyword.value);placeSearch.on("selectChanged", function (e) {const data = e.selected.data;const temp = {province: data.pname,provinceCode: data.pcode,city: data.cityname,cityCode: data.citycode,county: data.adname,countyCode: data.adcode,storeAddr: data.address,storeDetailAddr: data.pname + data.cityname + data.adname + data.address,longitude: `${data.location.lng}`,latitude: `${data.location.lat}`};// 回调父组件emit("change", temp);});
}
// 宏注册emit
const emit = defineEmits(["change"]);const keyword = ref("");
<template><div id="map-box"><div id="container" /><!-- 增加的部分 --><div id="myPageTop"><el-input@keyup.enter="search"placeholder="请输入地址"v-model="keyword"><template #prepend><el-button :icon="Search" @click="search" /></template></el-input><div id="panel" /></div></div>
</template>

3.3 暴露增加标记函数

let loaded = false; // 判断地图是否完成渲染
const record = []; // 记录地图未加载完成之前的添加标签记录
// 循环渲染之前记录的地址
function loadRecord() {record.forEach(item => {addMarker(item.longitude, item.latitude, item.content);});
}
function addMarker(longitude: number, latitude: number, content: string) {if (!loaded) {record.push({ longitude, latitude, content });return;}if (!longitude || !latitude) return;const marker = new aMap.Marker({position: [longitude, latitude],icon: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",anchor: "bottom-center",offset: new aMap.Pixel(0, 0)});marker.setMap(map);marker.setTitle(content);// 设置label标签// label默认蓝框白底左上角显示,样式className为:amap-marker-labelmarker.setLabel({direction: "bottom",offset: new aMap.Pixel(0, 0), //设置文本标注偏移量content: `<div style='padding:1px 5px;'>${content}</div>` //设置文本标注内容});map.setZoomAndCenter(11, [longitude, latitude]); //同时设置地图层级与中心点
}
defineExpose({addMarker
});

4 全部代码

<link rel="stylesheet" href="https://cache.amap.com/lbs/static/main1119.css" />
<script type="text/javascript" lang="ts">
window._AMapSecurityConfig = {securityJsCode: "秘钥"
};
</script>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from "vue";
import AMapLoader from "@amap/amap-jsapi-loader";
import { Search } from "@element-plus/icons-vue";let map = null;
let aMap = null;
let loaded = false;
const record = []; // 记录地图未加载完成之前的添加标签记录
onMounted(() => {AMapLoader.load({key: "key", // 申请好的Web端开发者Key,首次调用 load 时必填version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15plugins: ["AMap.PlaceSearch", "AMap.AutoComplete"] // 需要使用的的插件列表,如比例尺'AMap.Scale'等}).then(AMap => {// 第一参数是对应的div的idmap = new AMap.Map("container", {// 设置地图容器idviewMode: "3D", // 是否为3D地图模式zoom: 11, // 初始化地图级别center: [116.397428, 39.90923] // 初始化地图中心点位置});aMap = AMap;// 地图加载完成后会触发此回调函数loaded = true;loadRecord();});
});
onUnmounted(() => {map?.destroy();
});
// 循环渲染之前记录的地址
function loadRecord() {record.forEach(item => {addMarker(item.longitude, item.latitude, item.content);});
}
function addMarker(longitude: number, latitude: number, content: string) {if (!loaded) {record.push({ longitude, latitude, content });return;}if (!longitude || !latitude) {console.error("缺少必要信息")return;}const marker = new aMap.Marker({position: [longitude, latitude],icon: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",anchor: "bottom-center",offset: new aMap.Pixel(0, 0)});marker.setMap(map);marker.setTitle(content);// 设置label标签// label默认蓝框白底左上角显示,样式className为:amap-marker-labelmarker.setLabel({direction: "bottom",offset: new aMap.Pixel(0, 0), //设置文本标注偏移量content: `<div style='padding:1px 5px;'>${content}</div>` //设置文本标注内容});map.setZoomAndCenter(11, [longitude, latitude]); //同时设置地图层级与中心点
}
defineExpose({addMarker
});
function search() {const placeSearch = new aMap.PlaceSearch({pageSize: 10, // 单页显示结果条数pageIndex: 1, // 页码map: map, // 展现结果的地图实例panel: "panel", // 结果列表将在此容器中进行展示。autoFitView: true // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围});//关键字查询placeSearch.search(keyword.value);placeSearch.on("selectChanged", function (e) {const data = e.selected.data;const temp = {province: data.pname,provinceCode: data.pcode,city: data.cityname,cityCode: data.citycode,county: data.adname,countyCode: data.adcode,storeAddr: data.address,storeDetailAddr: data.pname + data.cityname + data.adname + data.address,longitude: `${data.location.lng}`,latitude: `${data.location.lat}`};// 回调父组件emit("change", temp);});
}
const emit = defineEmits(["change"]);const keyword = ref("");
</script><template><div id="map-box"><div id="container" /><!-- 增加的部分 --><div id="myPageTop"><el-input@keyup.enter="search"placeholder="请输入地址"v-model="keyword"><template #prepend><el-button :icon="Search" @click="search" /></template></el-input><div id="panel" /></div></div>
</template><style scoped>
#map-box {width: 100%;height: 450px;position: relative;
}
#container {width: 100%;height: 100%;
}#myPageTop {position: absolute;top: 5px;right: 10px;font-family: "Microsoft Yahei", Pinghei;font-size: 14px;background: none 0px 0px repeat scroll rgb(255, 255, 255);border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);border-image: initial;margin: 10px auto;padding: 6px;
}
#panel {background-color: white;max-height: 400px;overflow-y: auto;
}
</style>

5 实现效果

回显效果,会自动设置到地图中心
在这里插入图片描述
选点效果
在这里插入图片描述

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

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

相关文章

Leetcode 1514 概率最大的路径

文章目录 1. 题目描述2. 我的尝试 1. 题目描述 原题链接&#xff1a;Leetcode 1514 概率最大的路径 给你一个由 n 个节点&#xff08;下标从 0 开始&#xff09;组成的无向加权图&#xff0c;该图由一个描述边的列表组成&#xff0c;其中 edges[i] [a, b] 表示连接节点 a 和 b…

HTML静态网页成品作业(HTML+CSS)——非遗昆曲介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

【测试开发学习历程】在CentOS7上安装Docker

前言&#xff1a; 内容进入到Docker的时间虽然不是特别长&#xff0c; 但是呢在虚拟机上安装Docker的步骤还是不能少&#xff0c; 因为自己以后也是可能用到这个东西的。 注意&#xff0c;下文中提到的保存退出的命令是&#xff1a; :wq 如果要编辑文件的步骤&#xff0c;…

CIDR网络地址、广播地址、网段区间计算说明与计算工具

文章目录 开始问题参考答案 答案解析计算工具测试 开始 好久没有看计算网络&#xff0c;感觉已经完全返给老师了。 最近&#xff0c;有同事遇到个问题&#xff0c;网络一直不对&#xff0c;又开始重新看一下。 相信很多朋友长时间不看也忘了&#xff0c;所以&#xff0c;这里…

web学习笔记(三十三)

目录 1.严格模式 1.1严格模式的概念&#xff1a; 1.2严格模式在语义上更改的地方&#xff1a; 1.3如何开启严格模式 1.4严格模式应用上的变化 2.原型链 1.严格模式 1.1严格模式的概念&#xff1a; 严格模式有点像es5向es6过渡而产生的一种模式&#xff0c;因为es6的语法…

Spring项目问题—前后端交互:Method Not Allowed

问题 前后端交互时出现Method Not Allowed问题 Ajax中使用的是get&#xff0c;方法仍然出现post方法报错 Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method POST not supported] 浏览器中没有报错&#xff0c;只是接收不到后端返…

C++:类与对象(中)

一、构造函数 1.1特性 构造函数是特殊的成员函数&#xff0c;需要注意的是&#xff0c;构造函数的虽然名称叫构造&#xff0c;但是需要注意的是构造函数的主要任务并不是开空间创建对象&#xff0c;而是初始化对象。 1. 函数名与类名相同。 2. 无返回值。 3. 对象实例化时编…

RPC通信原理(一)

RPC通信原理 RPC的概念 如果现在我有一个电商项目&#xff0c;用户要查询订单&#xff0c;自然而然是通过Service接口来调用订单的实现类。 我们把用户模块和订单模块都放在一起&#xff0c;打包成一个war包&#xff0c;然后再tomcat上运行&#xff0c;tomcat占有一个进程&am…

Learn OpenGL 13 模板测试

模板测试 当片段着色器处理完一个片段之后&#xff0c;模板测试(Stencil Test)会开始执行&#xff0c;和深度测试一样&#xff0c;它也可能会丢弃片段。接下来&#xff0c;被保留的片段会进入深度测试&#xff0c;它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的&a…

python爬虫-AES.CBS加密案例(mmz批量爬取)

下载mmz本页数据 批量下载请看主页&#xff01;&#xff01;&#xff01; 代码&#xff1a; import requests from Crypto.Cipher import AES import base64cookies {PHPSESSID: 48nu182kdlsmgfo2g7hl6eufsa,Hm_lvt_6cd598ca665714ffcd8aca3aafc5e0dc: 1710568549,SECKEY_A…

MySql入门教程--MySQL数据库基础操作

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

Typora设置文本颜色

目录 总共分为三种方法 1.使用markdown语法的内联公式 2.使用HTML语法 3.借助第三方软件&#xff08;不建议&#xff0c;操作没那么顺滑&#xff09; 总共分为三种方法 1.使用markdown语法的内联公式 <1>首先需要在设置中勾选Markdown扩展语法下的内联公式&#xff…

【计算机系统结构】重叠方式

&#x1f4dd;本文介绍 本文主要内容位计算机系统结构的重叠方式 &#x1f44b;作者简介&#xff1a;一个正在积极探索的本科生 &#x1f4f1;联系方式&#xff1a;943641266(QQ) &#x1f6aa;Github地址&#xff1a;https://github.com/sankexilianhua &#x1f511;Gitee地址…

深入浅出落地应用分析:AI数字人「微软小冰」

hi,各位,今天要聊的是AI小冰,机缘巧合,投递了这家公司的产品,正好最近在看数字人相关的,就详细剖析下这款产品! 前言 小冰,全称为北京红棉小冰科技有限公司,前身为微软(亚洲)互联网工程院人工智能小冰团队,是微软全球最大的人工智能独立产品研发团队。作为微软全…

Redis中的缓存设计

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c;缓存层和存储层都不会命中&#xff0c;通常处于容错的考虑&#xff0c;如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c;失去了缓存保护后端存储的意义。…

mysql5.7离线安装 windows

windows上离线安装mysql5.7 下载安装包 去官网下载对应版本的mysql官网 点击archives,接着选择自己要下载的版本&#xff0c;选择windows系统&#xff0c;并根据自己电脑的位数选择相应的版本【找到“此电脑”&#xff0c;鼠标右击&#xff0c;出来下拉框&#xff0c;选择“属性…

【django framework】ModelSerializer+GenericAPIView接口数据流

GenericAPIView数据从序列化到最终返回响应的数据流 // 以ModelSerializergenerics.CreateAPIView为例 程序终归是为了处理数据&#xff0c;怎么处理&#xff0c;以怎样的顺序和方法去处理&#xff0c;就涉及到了具体的业务流程。当我们是用了一个牛掰的框架&#xff0c;发现原…

考察c语言关键字

C语言——关键字 1.问题&#xff1a;简述goto语句的作用 答&#xff1a;无条件跳转 具体来说&#xff0c;其作用在于允许程序在执行时无条件地跳转到指定的标签位置&#xff0c;并从该标签位置继续执行。通过goto语句&#xff0c;可以实现程序流程的无条件转移&#xff0c;使得…

使用PWM实现呼吸灯功能

CC表示的意思位捕获比较&#xff0c;CCR表示的是捕获比较寄存器 占空比等效于PWM模拟出来的电压的多少&#xff0c;占空比越大等效出的模拟电压越趋近于高电平&#xff0c;占空比越小等效出来的模拟电压越趋近于低电平&#xff0c;分辨率表示的是占空比变化的精细程度&#xf…

离线安装docker、docker-compose、Mysql镜像

离线安装docker docker-compose mysql镜像 一、下载docker docker-compose mysql 镜像文件 1、首先下载docker镜像 博主所用文件版本号&#xff1a; docker-23.0.6.tgz 下载docker 地址 &#xff1a;https://blog.csdn.net/xiaohanshasha/article/details/135489623?spm1001…