当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LAMP+WordPress
  • 15、Python如何获取文件的状态
  • 测试工具笔记
  • 2024.9.15周报
  • ThinkPHP8出租屋管理系统
  • 2011年全国硕士研究生入学统一考试计算机科学与技术
  • 2024_中秋国庆双节来临 祝CSDN所有开发者与网站节日快乐
  • 详解 Pandas 的 rename 函数
  • Linux PTP 测量实操 (IEEE 1588)
  • vscode 链接数据库
  • RLS带遗忘因子的递归最小二乘法
  • SSH软链接后门从入门到应急响应
  • AI创意引擎:优化Prompt提示词的高效提问技巧
  • 《深度学习》OpenCV 高阶 图像金字塔 用法解析及案例实现
  • Linux学习-ELK(一)
  • 【翻译】babel对TC39装饰器草案的实现
  • 11111111
  • Node + FFmpeg 实现Canvas动画导出视频
  • node入门
  • Python 基础起步 (十) 什么叫函数?
  • Rancher-k8s加速安装文档
  • Sass Day-01
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 批量截取pdf文件
  • 前端面试之CSS3新特性
  • 前嗅ForeSpider采集配置界面介绍
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何选择开源的机器学习框架?
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 深入浅出webpack学习(1)--核心概念
  • 实战|智能家居行业移动应用性能分析
  • 使用docker-compose进行多节点部署
  • 问题之ssh中Host key verification failed的解决
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 智能合约Solidity教程-事件和日志(一)
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​​​​​​​​​​​​​​Γ函数
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #微信小程序:微信小程序常见的配置传旨
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (笔记)M1使用hombrew安装qemu
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .equals()到底是什么意思?
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET Remoting学习笔记(三)信道
  • .Net 基于MiniExcel的导入功能接口示例
  • .net 使用ajax控件后如何调用前端脚本
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?