Tip:本篇文章为案例分析,技术点较多,所以篇幅较长,认真阅览的你一定会学到很多知识。

前言百度地图开放平台 给开发者们提供了丰富的地图功能与服务,使我们的项目中可以轻松地实现地图定位、地址搜索、路线导航等功能。本文给大家介绍如何在vue项目中引用百度地图,并设计实现简单的地图定位、地址搜索功能。

一、效果图及功能点

先来看一下效果图



效果图看不够? 点此 试试在线操作!(初次进入加载较慢,请耐心等待)

功能点:

  1. 挂载百度地图
  2. 封装逆地址解析函数(根据坐标点获取详细地址)
  3. 设置图像标注并绑定拖拽标注结束后事件
  4. 添加(右上角)平移缩放控件
  5. 添加(左下角)定位控件
  6. 浏览器定位(定位当前地点)
  7. 绑定点击地图任意点事件
  8. 结合element-ui实现输入提示选取地址并定位功能

二、前期准备

在正式开发之前,我们先做好以下准备:

  • 在你的vue项目中引入element-ui (引入方法 戳这

    说明:本案例是结合element-ui进行开发,主要是为方便实现上面第8点功能,大家若是引入其他UI框架也可以,功能实现方法参照本案例自行修改即可。
  • 申请百度地图AK

    前往 百度地图开放平台控制台 ,登录百度账号,创建应用即得。

三、引入百度地图

下面介绍如何在vue项目中引入百度地图

方法一

第1步:在 index.html 中引入下面代码,注意将你的AK代入

<script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=您的密钥"></script>

第2步:在 webpack.base.conf.js 添加externals.BMap配置,与entry平级,内容如下,

entry: {
app: ['babel-polyfill', './src/main.js']
},
externals: {
BMap: 'BMap'
}

第3步:在组件中引入BMap

import BMap from 'BMap'

方法二

我们知道,vue-cli 3.0+ 的版本已经取消了webpack.conf这些文件了,所以上面的方法就不适用了。而且,方法一在index.html中全局引入百度api,有点耗性能。更多时候我们只希望在单个组件里按需引入即可,所以下面介绍的是以封装的方法引入。

第1步:在你的项目js资源文件夹下新建loadBMap.js文件,内容如下:

/**
* 动态加载百度地图api函数
* @param {String} ak 百度地图AK,必传
*/
export default function loadBMap(ak) {
return new Promise(function(resolve, reject) {
if (typeof window.BMap !== 'undefined') {
resolve(window.BMap)
return true
}
window.onBMapCallback = function() {
resolve(window.BMap)
}
let script = document.createElement('script')
script.type = 'text/javascript'
script.src =
'http://api.map.baidu.com/api?v=3.0&ak=' + ak + '&callback=onBMapCallback'
script.onerror = reject
document.head.appendChild(script)
})
}

第2步:在组件中引入loadBMap函数

import loadBMap from '@/<js资源文件夹>/loadBMap.js'

第3步:在mounted中调用 loadBMap()

//这里运用async/await 进行异步处理,保证BMap加载进来后才执行后面的操作
async mounted() {
await loadBMap('您的密钥') //加载引入BMap
...
}

这样就在当前组件中引入百度地图 BMap 了,可以开始开发了。

四、功能解析

下面开始对上述所列 8 点功能进行详细的代码解析。

说明:本文用的是方法一引入百度地图,源码 用的是方法二

1、挂载百度地图

首先需要给地图分配一个容器,并设置宽高

<div id="map-container" style="width:100%;height:500px;"></div>

根据需求,定义data参数

data() {
return {
form: {
address: '', //详细地址
addrPoint: { //详细地址经纬度
lng: 0,
lat: 0
}
},
map: '', //地图实例
mk: '' //Marker实例
}
}

初始化地图

methods: {
initMap() {
var that = this;
this.map = new BMap.Map("map-container", {enableMapClick:false}) //新建地图实例,enableMapClick:false :禁用地图默认点击弹框
var point = new BMap.Point(113.30765,23.12005);
this.map.centerAndZoom(point,19)
}
},
mounted() {
this.initMap()
}

到此,就可以在你的页面上看到地图啦!

2、封装逆地址解析函数

参考百度地图 逆地址解析 示例demo,封装一个逆地址解析函数,供下面的功能调用。

/**
* 逆地址解析函数(根据坐标点获取详细地址)
* @param {Object} point 百度地图坐标点,必传
*/
getAddrByPoint(point){
var that = this;
var geco = new BMap.Geocoder();
geco.getLocation(point, function(res){
console.log(res) //内容见下图
that.mk.setPosition(point) //重新设置标注的地理坐标
that.map.panTo(point) //将地图的中心点更改为给定的点
that.form.address = res.address; //记录该点的详细地址信息
that.form.addrPoint = point; //记录当前坐标点
})
}



3、设置图像标注并绑定拖拽标注结束后事件

图像标注Marker是百度地图覆盖物类中的其中一种,它用来标识当前坐标点的位置,也就是我们在地图上所看到的小红点(当然这个点也可以自定义图标样式,这里我们不说,有兴趣的可以参考百度地图覆盖物示例 - 设置点的新图标)。

设置图像标注很简单,只需要下面两行代码

initMap() {
...
this.mk = new BMap.Marker(point,{enableDragging:true}) //创建一个图像标注实例,enableDragging:是否启用拖拽,默认为false
this.map.addOverlay(this.mk) //将覆盖物添加到地图中
}

这样你就可以在地图上看到小红点啦,接下来我们给这个点绑定拖拽事件。

拖拽事件有三类,dragstart(开始拖拽时触发)、dragging(拖拽过程中触发)和dragend(拖拽结束时触发),实际项目中我们更注重的是拖拽标注结束后的位置信息,因此我们在这给标注绑定拖拽结束后事件:

initMap() {
...
this.mk.addEventListener('dragend', function(e){
that.getAddrByPoint(e.point) //拖拽结束后调用逆地址解析函数,e.point为拖拽后的地理坐标
})
}

注意:这里我们将代码写在上面定义的 initMap 函数中,地图初始化时一同执行即可

4、添加(右上角)平移缩放控件

百度地图提供了很多的 控件类,方便我们查看和操作地图。本案例只解析平移缩放控件NavigationControl 和 地图定位控件GeolocationControl,其他控件可 参考示例 自行学习。

下面我们先引入平移缩放控件并将其位置置于右上角:

initMap() {
...
var navigationControl = new BMap.NavigationControl({ //创建一个特定样式的地图平移缩放控件
anchor: BMAP_ANCHOR_TOP_RIGHT, //靠右上角位置
type: BMAP_NAVIGATION_CONTROL_SMALL //SMALL控件类型
})
this.map.addControl(navigationControl ) //将控件添加到地图
}

附:

anchor参数解析

BMAP_ANCHOR_TOP_LEFT | 控件将定位到地图的左上角

BMAP_ANCHOR_TOP_RIGHT | 控件将定位到地图的右上角

BMAP_ANCHOR_BOTTOM_LEFT | 控件将定位到地图的左下角

BMAP_ANCHOR_BOTTOM_RIGHT | 控件将定位到地图的右下角

type参数解析

BMAP_NAVIGATION_CONTROL_LARGE | 标准的平移缩放控件(包括平移、缩放按钮和滑块)

BMAP_NAVIGATION_CONTROL_SMALL | 仅包含平移和缩放按钮

BMAP_NAVIGATION_CONTROL_PAN | 仅包含平移按钮

BMAP_NAVIGATION_CONTROL_ZOOM | 仅包含缩放按钮

5、添加(左下角)定位控件

下面我们引入地图定位控件并将其位置置于左下角:

initMap() {
...
var geolocationControl = new BMap.GeolocationControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT}) //创建一个地图定位控件
geolocationControl.addEventListener("locationSuccess", function(e){ //绑定定位成功后事件
that.getAddrByPoint(e.point) //定位成功后调用逆地址解析函数
});
geolocationControl.addEventListener("locationError",function(e){ //绑定定位失败后事件
alert(e.message);
});
this.map.addControl(geolocationControl) //将控件添加到地图
}

6、浏览器定位

参考百度地图 浏览器定位 示例demo,进入页面,我们将坐标定位到当前所在地坐标。

/**
* 浏览器定位函数
*/
geolocation() {
var that = this;
var geolocation = new BMap.Geolocation();
geolocation.getCurrentPosition(function(res){
if(this.getStatus() == BMAP_STATUS_SUCCESS){
that.getAddrByPoint(res.point) //当成功时,调用逆地址解析函数
} else {
alert('failed'+this.getStatus()); //失败时,弹出失败状态码
}
},{enableHighAccuracy: true}) //enableHighAccuracy:是否要求浏览器获取最佳效果,默认为false
}

同样在initMap中调用即可

initMap() {
...
this.geolocation()
}

7、绑定点击地图任意点事件

在地图上选取地址。点击地图上任意点,都将获取该点的地址信息。

initMap() {
...
this.map.addEventListener('click', function(e){ //给地图绑定点击事件
that.getAddrByPoint(e.point) //点击后调用逆地址解析函数
})
}

8、结合element-ui实现输入提示选取地址并定位功能

最后是本案例的主要功能,输入框输入关键字搜索地址,调用百度地图LocalSearch服务进行检索。

首先,我们需要写入一个输入框。这里利用的是element-ui的 <el-autocomplete>组件,该组件提供了fetch-suggestions属性和select事件【参考文档】,方便我们把检索结果遍历显示出来并进行选择操作。

<el-autocomplete
style="width:100%;"
popper-class="autoAddressClass"
v-model="form.address"
:fetch-suggestions="querySearchAsync"
:trigger-on-focus="false"
placeholder="详细地址"
@select="handleSelect"
clearable>
<template slot-scope="{ item }">
<i class="el-icon-search fl mgr10"></i>
<div style="overflow:hidden;">
<div class="title">{{ item.title }}</div>
<span class="address ellipsis">{{ item.address }}</span>
</div>
</template>
</el-autocomplete>

接下来需提供两个方法:

querySearchAsync(str,cb){
var options = {
onSearchComplete: function(res){ //检索完成后的回调函数
var s = [];
if (local.getStatus() == BMAP_STATUS_SUCCESS){
for (var i = 0; i < res.getCurrentNumPois(); i ++){
s.push(res.getPoi(i));
}
cb(s) //获取到数据时,通过回调函数cb返回到<el-autocomplete>组件中进行显示
} else{
cb(s)
}
}
}
var local = new BMap.LocalSearch(this.map, options) //创建LocalSearch构造函数
local.search(str) //调用search方法,根据检索词str发起检索
}
  • handleSelect:点击选中建议项时触发的方法
handleSelect(item) {
this.form.address = item.address + item.title; //记录详细地址,含建筑物名
this.form.addrPoint = item.point; //记录当前选中地址坐标
this.map.clearOverlays() //清除地图上所有覆盖物
this.mk = new BMap.Marker(item.point) //根据所选坐标重新创建Marker
this.map.addOverlay(this.mk) //将覆盖物重新添加到地图中
this.map.panTo(item.point) //将地图的中心点更改为选定坐标点
}

最后再稍微处理一下autocomplete组件的下拉款样式

.autoAddressClass{
li {
i.el-icon-search {margin-top:11px;}
.mgr10 {margin-right: 10px;}
.title {
text-overflow: ellipsis;
overflow: hidden;
}
.address {
line-height: 1;
font-size: 12px;
color: #b4b4b4;
margin-bottom: 5px;
}
}
}

至此,我们就完成了上面所有的功能点。

附:

项目源码git地址:vue-admin-web

项目线上地址:vue-admin-web/BMap

希望本篇案列可以帮助大家了解百度地图的使用。

觉得这篇文章有用的话就点个赞吧~~么么哒(づ ̄ 3 ̄)づ

Vue项目引用百度地图并实现搜索定位等功能的更多相关文章

  1. vue项目 调用百度地图 BMap is not defined

    这次老板新接了一个四点半官网页面,使用vue来写.emm……我感觉整个人都不好了,两天半解决了20个静态页面.还好vue写页面简直飞快,遇到一个vue的新坑,使用百度地图. 研究了好一会,总是报错BM ...

  2. vue脚手架搭建项目引用百度地图--出坑

    这是官网地址 https://dafrok.github.io/vue-baidu-map/#/zh/start/installation 需要声明注意的是 BaiduMap 组件容器本身是一个空的块 ...

  3. 使用Vue Baidu Map对百度地图实现输入框搜索定位

    前端时间需要在页面的输入框输入地址,搜索并在百度地图上获取选定结果的坐标,前端使用了Vue + Element-ui,地图方面直接使用了封装好的百度地图vue组件-vue-baidu-map     ...

  4. Vue项目引入百度地图

    先去百度开放平台申请ak.http://lbsyun.baidu.com/ 进来之后 按照步骤走,先登录百度账号,然后申请成为开发者,然后申请ak密钥 填写完毕后提交,会给你邮箱发个激活邮件 点击申请 ...

  5. vue项目接入百度地图

    方法一 :使用第三方工具 vue-baidu-map 安装命令: yarn add vue-baidu-map --save 文档地址:https://dafrok.github.io/vue-bai ...

  6. vue项目使用百度地图API获取经纬度

    一.首先在百度api注册获得ak密钥 二.进行引入 (1).第一种方式: 直接在vue中index.html中用script标签引入. //你的ak密钥需要替换真实的你的ak码 <script ...

  7. vue项目,百度地图api高亮选取区域,高亮某个地区,行政区域等

    效果如下: var blist = [] ,maxZoom: });// 创建地图实例 var point = new window.BMap.Point(89.48,31.57); map.cent ...

  8. vue 中引用 百度地图

    1.在 http://lbsyun.baidu.com/ 申请 秘钥 2.在index.html文件中引入 <script src="http://api.map.baidu.com/ ...

  9. JSP界面引用百度地图获取坐标

    需求: 需要在JSP界面上引用百度地图,文本框中输入地址之后,自动拿到在百度地图上的经纬度 解决步骤: 1.引入百度地图api: head中进行引用<script type="text ...

  10. 百度地图API地点搜索-获取经纬度

    分享一下地图上的地点搜索和鼠标点击获取地点经纬度,这些都是地图比较基本和实用的代码,其中还包括了根据用户IP进行地图的显示.改变地图上的鼠标样式.启用滚轮缩放等,算是半入门吧,其他的一些可以自己参考百 ...

随机推荐

  1. IIC总线学习笔记

    IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板.嵌入式系统或手 ...

  2. 【技术实战】Vue技术实战【四】

    需求实战一 效果展示 代码展示 <template> <ARow> <ACol> <a-statistic-countdown :value="de ...

  3. Python类型提示

    摘自:Python 类型提示简介 - FastAPI (tiangolo.com) 快速入门 类型提示用于声明一个变量的类型,在Python 3.6+版本的时候引入. 示例: def get_full ...

  4. javascript创建数组

    javascript数组:var array=[ ]等于创建一个数组 array[0]代表给数组的第一个位置上赋值,值为32 array[5]代表给数组的第六位置上赋值.值为3 在位置0,1,2,5位 ...

  5. GitOps 与 DevOps:了解关键差异,为企业做出最佳选择

    在软件开发领域,GitOps 和 DevOps 是加强协作和实现软件交付流程自动化的重要技术.虽然这两种模式都旨在提高软件开发生命周期的效率,但它们的核心原则和实施方式却各不相同. 本篇文章将帮助您了 ...

  6. 解密Prompt系列13. LLM Agent-指令微调方案: Toolformer & Gorilla

    上一章我们介绍了基于Prompt范式的工具调用方案,这一章介绍基于模型微调,支持任意多工具组合调用,复杂调用的方案.多工具调用核心需要解决3个问题,在哪个位置进行工具调用(where), 从众多工具中 ...

  7. Docker数据持久化与数据共享

    上篇文章的最后我们使用Docker部署了一个纯前端项目,但还有一个很重要的问题就是容器中产生的数据(比如log文件),容器一旦被删除,容器内的所有数据也就没有了,为了避免这个问题我们可以将数据存储到容 ...

  8. 《Linux基础》09. Shell 编程

    @ 目录 1:Shell 简介 2:Shell 脚本 2.1:规则与语法 2.2:执行方式 2.3:第一个 Shell 脚本 3:变量 3.1:系统变量 3.2:用户自定义变量 3.2.1:规则 3. ...

  9. 京东工业根据ID取商品详情 API

    item_get-根据ID取商品详情  注册开通 vipmro.item_get 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secret ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题

    一.用go语言,参照图 8-3 的方法,说明 RADIX-SORT在下列英文单词上的操作过程:COW,DOG,SEA,RUG,ROW,MOB, BOX, TAB, BAR, EAR,TAR, DIG, ...