vue3 +百度地图 实现 地点检索,输入联想,经纬度,逆地理编码,创建标记,label等

由于百度地图文档确实有点欠缺,在这里记录一下

    • vue3 + 百度地图(js api 3.0)
    • 实现效果如下
    • 实现方式
    • 注意事项

vue3 + 百度地图(js api 3.0)

  • 需求: 地图弹框组件,可以搜索地图点,输入联想,回车定位等
  • 项目:vue3 + ts + 百度地图js api

实现效果如下

在这里插入图片描述
在这里插入图片描述

实现方式

  • 首先引入百度地图
const loadingBMPGL = (ak: string) => {return new Promise(function (resolve, reject) {window.init = () => resolve(BMapGL);const script = document.createElement('script');script.type = 'text/javascript';script.src = `https://api.map.baidu.com/api?v=3.0&type=webgl&ak=${ak}&callback=init`;script.onerror = reject;document.head.appendChild(script);});
};
  • 初始化地图实例并监听事件
const initMap = (val: any) => {loadingBMPGL(val).then((BMapGL: any) => {map = new window.BMapGL.Map('mapContainer');// 初始化地图,设置中心点坐标和地图级别var ac = new window.BMapGL.Autocomplete({//建立一个自动完成的对象input: 'searchInput',location: map,});ac.setInputValue(searchData.value);ac.addEventListener('onhighlight', function (e) {var str = '';var value = e.fromitem.value;if (e.fromitem.index > -1) {str =value.province +' ' +value.city +' ' +value.district +' ' +value.street +' ' +value.business;}var highlight = 'Suggestion: ' + str;document.getElementById('searchInput').placeholder = str;});ac.addEventListener('onconfirm', function (e) {var confirmStr =e.item.value.province +'/' +e.item.value.city +'/' +e.item.value.district +'/' +e.item.value.street +'/' +e.item.value.business;const address = {name: e.item.value.address,address: confirmStr,point: e.item.value.location,};selectResult(address);console.log('确认选择: ', e, confirmStr);});// 以天安门为例map.centerAndZoom(new window.BMapGL.Point(116.404, 39.915), 11);// 启用地图拖拽事件map.enableDragging();// 启用地图缩放map.enableScrollWheelZoom(true);// 监听地图点击事件map.addEventListener('click', function (e) {// 获取点击位置的坐标const point = e.latlng;// 清除之前的标记if (currentMarker) {map.removeOverlay(currentMarker);}map.clearOverlays();// 创建标记并添加到地图上currentMarker = new window.BMapGL.Marker(point);map.addOverlay(currentMarker);map.centerAndZoom(point, 35);// geolocation.enableSDKLocation();// 创建地理编码服务实例const geocoder = new window.BMapGL.Geocoder();// 使用地理编码服务获取地址geocoder.getLocation(point, function (result) {if (result) {const address = result.content.address + result.content.poi_desc;searchData.value = address;lat.value = point.lat;lng.value = point.lng;// 在点击位置显示信息窗口const infoWindow = new window.BMapGL.Label('您点击的位置:' + address + '<br>' + '经纬度:' + point.lng + ',  ' + point.lat);infoWindow.setStyle({color: 'black',fontSize: '14px',backgroundColor: 'white',border: '1px solid #ccc',padding: '2px',});currentMarker.setLabel(infoWindow);} else {console.log('未找到该位置的地址');}});});// 0: 成功。表示搜索请求成功,并且结果可以通过 result 对象进行获取和处理。// 1: 没有找到匹配的结果。表示搜索关键字没有匹配到任何地点。// 2: 请求被拒绝。可能是由于权限问题或请求格式不正确。// 3: API 密钥无效。表示使用的 API 密钥不正确或已过期。// 4: 发生了未知错误。表示出现了无法预料的问题。localSearch.value = new window.BMapGL.LocalSearch(map, {// renderOptions: { map: map },onSearchComplete: function (result) {if (localSearch.value.getStatus() === 0) {if (result._pois.length != 0) {console.log('Search completed:', localSearch.value, result);searchResults.value = result._pois.map(poi => {return {id: poi.uid,name: poi.title,address: poi.address,point: poi.point,};});}} else {console.log('Search failed:', result, localSearch.value.getStatus());}},});// 初始化搜索一次// searchLocation(searchData.value);});
};

其实这里有两种方式实现;

  1. 其一是使用BMapGL.Autocomplete 创建一个自定义对象,需要一个input框来绑定输入框,还有一个地图的区域
<div class="map-container" id="mapContainer" ref="mapContainer"></div><div class="search-box"><el-inputid="searchInput"ref="searchdom"style="width: 250px"v-model="searchData"placeholder="搜索地点"><!-- @input="searchLocation" --><template #suffix><img class="search-icon" src="@/assets/img/water-works/search.png" alt="" /></template></el-input><!-- 显示搜索结果列表 --><!-- <div class="search-list" v-if="searchResults.length"><ul><li v-for="result in searchResults" :key="result.id" @click="selectResult(result)"><span style="padding: 12px 7px"> {{ result.name }}</span></li></ul></div> --></div>

这里需要注意的是:需要单独设置一下搜索结果列表的层级,不然会遮挡导致看不见,要去掉style标签的 scoped,这样的话重写的css样式才能生效。

.tangram-suggestion {z-index: 99999;
}

onhighlightonconfirm 分别设置监听输入联想和选择搜索结果的事件,可以在回调中设置需要的操作

  1. 第二种就是利用BMapGL.LocalSearch 方法,也就是localSearch.value
在输入框上设置  `@input="searchLocation"`
const searchLocation = (keyword: any) => {localSearch.value.search(keyword);
};
调用BMapGL.LocalSearch 的回调方法 给searchResults.value 赋值然后将上面的搜索列表注释放开就可以在选中事件中做相应操作,如:
const selectResult = (result: any) => {console.log(result);// 清空搜索结果列表searchResults.value = [];// 清空搜索框searchData.value = result.address;// 获取搜索结果const poi = result.point;// 在地图上标记位置markerPosition.value = poi;lat.value = poi.lat;lng.value = poi.lng;// const icon = new window.BMapGL.Icon('@/assets/img/water-works/marker.svg', new window.BMapGL.Size(20, 20));// icon.setImageSize(new window.BMapGL.Size(32,32));// const marker = new window.BMapGL.Marker(poi,{ icon: icon });const marker = new window.BMapGL.Marker(poi);// 创建标签const label = new window.BMapGL.Label('名称:' + result.name + '<br>' + '经纬度:' + poi.lng + ',  ' + poi.lat,{offset: new window.BMapGL.Size(20, -10), // 调整标签位置});label.setStyle({color: 'black',fontSize: '14px',backgroundColor: 'white',border: '1px solid #ccc',padding: '2px',});// 将标签添加到标记marker.setLabel(label);map.addOverlay(marker);map.centerAndZoom(poi, 35);
};

注意事项

  1. vue3 和ts项目中没有直接的BMapGL 对象,所以挂在了Window下面
  2. 注意修改结果列表的层级z-index

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

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

相关文章

尚品汇-订单拆单、支付宝关闭交易、关闭过期订单整合(五十)

目录&#xff1a; &#xff08;1&#xff09;拆单接口 &#xff08;2&#xff09;取消订单业务补充关闭支付记录 &#xff08;3&#xff09;支付宝关闭交易 &#xff08;4&#xff09;查询支付交易记录 &#xff08;5&#xff09;PaymentFeignClient 远程接口 &#xff08…

JMeter脚本开发

环境部署 Ubuntu系统 切换到root用户 sudo su 安装上传下载的命令 apt install lrzsz 切换文件目录 cd / 创建文件目录 mkdir java 切换到Java文件夹下 cd java 输入rz回车 选择jdk Linux文件上传 解压安装包 tar -zxvf jdktab键 新建数据库 运行sql文件 选择sql文件即…

基于51单片机的电饭锅控制系统proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1CGyg6uPhFI0MeaBWwe_HAg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

RedisTemplate操作ZSet的API

文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素&#xff0c;并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…

LineageOS刷机教程

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ LineageOS 是一个基于 Android 开源项目&#xff08;AOSP&#xff09;的开源操作系统&#xff0c;主要由社区开发者维护。它起源于 CyanogenMod 项目&#xff…

10年Python程序员教你多平台采集10万+电商数据【附实例】

10万级电商数据采集需要注意什么&#xff1f; 在进行10万级电商数据采集时&#xff0c;有许多关键因素需要注意&#xff1a; 1. 采集平台覆盖&#xff1a;确保可以覆盖主流的电商平台&#xff0c;如淘宝、天猫、京东、拼多多等。 2. 数据字段覆盖&#xff1a;检查是否可以对平…

go 笔记

数据结构与 方法&#xff08;增删改查&#xff09; 安装goland,注意版本是2024.1.1&#xff0c;不是2024.2.1&#xff0c;软件下载地址也在链接中提供了 ‘go’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 在 Windows 搜索栏中输入“环境变量”&#…

架构理论碰撞:对比TOGAF、Zachman、DODAF和FEAF等主流架构框架

信息架构框架对比分析&#xff1a;选择适合企业的最佳方案 在企业数字化转型过程中&#xff0c;信息架构的设计与实施至关重要。成功的信息架构能够有效地支持业务流程优化&#xff0c;提升数据管理效率&#xff0c;推动技术创新。然而&#xff0c;不同的信息架构框架各有其独…

COMTRADE binary数据文件解析

一、COMTRADE 二进制文件的解析需要用到cfg文件中的配置信息&#xff0c;以及dat文件中的数据。 二、cfg文件 1、cfg文件整体配置 2、cfg文件实例 厂站名&#xff0c;记录装置&#xff0c;COMTRADE标准版本年号 SMARTSTATION,IED123,2013 总通道数&#xff0c;模拟通道编号&…

记录word转xml文件踩坑

word文件另存为xml文件后&#xff0c;xml文件乱码 解决方法&#xff1a; 1.用word打开.docx文件 2.另存为xml文件 3.点击工具 -> Web选项 -> 编码&#xff0c;选择UTF-8 4.点击确定 5.使用notpad打开xml文件 6.使用xml tool进行xml格式化即可。

uniapp小程序,使用腾讯地图获取定位

本篇文章分享一下在实际开发小程序时遇到的需要获取用户当前位置的问题&#xff0c;在小程序开发过程中经常使用到获取定位功能。uniapp官方也提供了相应的API供我们使用。 官网地址&#xff1a;uni.getLocation(OBJECT)) 官网获取位置的详细介绍这里就不再讲述了&#xff0c;大…

安宝特方案 | 医疗AR眼镜,重新定义远程会诊体验

【AR眼镜&#xff1a;重新定义远程会诊体验】 在快速发展的医疗领域&#xff0c;安宝特医疗AR眼镜以其尖端技术和创新功能&#xff0c;引领远程会诊的未来&#xff0c;致力于为为医生和患者带来更高效、精准和无缝的医疗体验。 探索安宝特医疗AR眼镜如何在医疗行业中引领新风潮…

视频推拉流/直播点播EasyDSS平台安装失败并报错“install mediaserver error”是什么原因?

TSINGSEE青犀视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可…

MongoDB日志级别

日志 查看当前的日志级别 根据你提供的 MongoDB 命令结果&#xff0c;命令 db.adminCommand({ getParameter: "logComponentVerbosity" }) 返回了 "ok" : 0&#xff0c;这意味着命令执行失败&#xff0c;没有成功获取到日志级别的配置信息。错误信息 &quo…

【JAVA入门】Day45 - 压缩流 / 解压缩流

【JAVA入门】Day45 - 压缩流 / 解压缩流 文章目录 【JAVA入门】Day45 - 压缩流 / 解压缩流一、解压缩流二、压缩流 在文件传输过程中&#xff0c;文件体积比较大&#xff0c;传输较慢&#xff0c;因此我们发明了一种方法&#xff0c;把文件里的数据压缩到一种压缩文件中&#x…

[苍穹外卖]-10WebSocket入门与实战

WebSocket WebSocket是基于TCP的一种新的网络协议, 实现了浏览器与服务器的全双工通信, 即一次握手,建立持久连接,双向数据传输 区别 HTTP是短连接, WebSocket是长连接HTTP单向通信, 基于请求响应模型WebSocket支持双向通信 相同 HTTP和WebSocket底层都是TCP连接 应用场景…

JVM 调优篇7 调优案例1-堆空间的优化解决

一 jvm优化 1.1 优化实施步骤 1)减少使用全局变量和大对象&#xff1b; 2)调整新生代的大小到最合适&#xff1b; 3)设置老年代的大小为最合适&#xff1b; 4)选择合适的GC收集器&#xff1b; 1.2 关于GC优化原则 多数的Java应用不需要在服务器上进行GC优化&#xff1b…

【ArcGISProSDK】初识

ArcGIS Pro SDK 提供四种主要的可扩展性模式&#xff1a;加载项、托管配置、插件数据源和 CoreHost 应用程序。 各模块文件对比 API 核心 核心程序集位于 {ArcGIS Pro 安装文件夹}\bin 中。 程序集描述ArcGIS.Core.dll 提供 CIM、地理数据库、几何图形和公共设施网络 API。 …

Notepad++插件:TextFX 去除重复行

目录 一、下载插件 TextFX Characters 二、去重实操 2.1 选中需要去重的文本 2.2 操作插件 2.3 结果展示 2.3.1 点击 Sort lines case sensitive (at column) 2.3.2 点击 Sort lines case insensitive (at column) 一、下载插件 TextFX Characters 点【插件】-【插件管理…

从头开始学MyBatis—02基于xml和注解分别实现的增删改查

首先介绍此次使用的数据库结构&#xff0c;然后引出注意事项。 通过基于xml和基于注解的方式分别实现了增删改查&#xff0c;还有获取参数值、返回值的不同类型对比&#xff0c;帮助大家一次性掌握两种代码编写能力。 目录 数据库 数据库表 实体类 对应的实体类如下&#x…