vue整合百度地图(关键字检索)
百度地圖
文章目錄
- 百度地圖
- 一、申請百度地圖的密鑰
- 二、官方示例
- 三、使用vue整合百度地圖步驟說明
- 3.1 效果圖:
- 3.2 方式一 vue腳手架2.0版本引用(不推薦):
- 3.3 方式二 封裝成js引用(推薦做法):
- 3.3.1 封裝loadBMap.js
- 3.3.2 在組件中引入封裝的loadBMap
- 3.3.3 在mounted中調(diào)用 loadBMap()
- 四、整合詳解(單獨地圖頁面)
- 4.1、直接上完整代碼,代碼注釋詳解
- 五、地圖為子組件,點擊觸發(fā)按鈕,展示地圖(更常見,詳解)
- 5.1效果圖
- 5.2 在主頁面引入js,點擊按鈕調(diào)用地圖初始化方法
- 5.3完整的子組件地圖代碼(dialog包裹)
- 5.4 說明下組件通信
- 六、其他用法說明
一、申請百度地圖的密鑰
官網(wǎng)入口
白名單要為 *
創(chuàng)建成功
二、官方示例
示例入口
比較有意思的幾個案例
三、使用vue整合百度地圖步驟說明
3.1 效果圖:
說明:
3.2 方式一 vue腳手架2.0版本引用(不推薦):
說明:vue-cli 3.0+ 的版本已經(jīng)取消了webpack.conf這些文件了,所以上面的方法就不適用了,而且耗費性能
其實在config里面也可以使用,但是不推薦:
3. 在組件中引入BMap
3.3 方式二 封裝成js引用(推薦做法):
3.3.1 封裝loadBMap.js
export default function loadBMap() {return new Promise(function(resolve, reject) {if (typeof window.BMap !== 'undefined') {resolve(window.BMap)return true}window.onBMapCallback = function() {resolve(window.BMap)}const script = document.createElement('script')script.type = 'text/javascript'script.src ='https://api.map.baidu.com/api?v=3.0&ak=' + '你的申請ak' + '&callback=onBMapCallback'script.onerror = rejectdocument.head.appendChild(script)}) }位置:
3.3.2 在組件中引入封裝的loadBMap
import loadBMap from "@/utils/loadBMap.js";3.3.3 在mounted中調(diào)用 loadBMap()
async mounted() {await loadBMap() // 加載引入BMap,封裝的jsthis.initMap()//這個是初始化地圖的方法,在method中定義},這樣組件基本準備完成,可以根據(jù)百度官方示例進行編寫
四、整合詳解(單獨地圖頁面)
4.1、直接上完整代碼,代碼注釋詳解
<template><!-- 定義大個盒子 --><div class="app-container"><!--使用element ui --><el-form ref="form" :model="form" label-width="110px"><!-- 檢索框部分 --><el-form-item label="詳細地址:" prop="address"><el-autocompletev-model="form.address"style="width:100%;"popper-class="autoAddressClass":fetch-suggestions="querySearchAsync":trigger-on-focus="false"placeholder="詳細地址"clearable@select="handleSelect"><!-- 雙向數(shù)據(jù)綁定 --><template slot-scope="{ item }"><i class="el-icon-search fl mgr10" /><div style="overflow:hidden;"><div class="title">{{ item.title }}</div><span class="address ellipsis">{{ item.address }}</span></div></template></el-autocomplete></el-form-item><!-- 地圖盒子 --><el-form-item label="地圖定位:"><div id="map-container" style="width:100%;height:500px;" /></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">提交</el-button><el-button>取消</el-button></el-form-item></el-form></div> </template><script> // 引入封裝的js import loadBMap from '@/utils/loadBMap.js' export default {data() {return {form: {address: '', // 詳細地址addrPoint: { // 詳細地址經(jīng)緯度lng: 0,lat: 0}},map: '', // 地圖實例mk: '', // Marker實例locationPoint: null}},async mounted() {await loadBMap() // 加載引入BMapthis.initMap()//初始化地圖},methods: {// 初始化地圖的方法initMap() {var that = this// 1、掛載地圖this.map = new BMap.Map('map-container', { enableMapClick: false })var point = new BMap.Point(113.3324436, 23.1315381)//設(shè)置個默認標(biāo)點this.map.centerAndZoom(point, 19)// 3、設(shè)置圖像標(biāo)注并綁定拖拽標(biāo)注結(jié)束后事件this.mk = new BMap.Marker(point, { enableDragging: true })this.map.addOverlay(this.mk)this.mk.addEventListener('dragend', function(e) {that.getAddrByPoint(e.point)})// 4、添加(右上角)平移縮放控件this.map.addControl(new BMap.NavigationControl({ anchor: BMAP_ANCHOR_TOP_RIGHT, type: BMAP_NAVIGATION_CONTROL_SMALL }))// 5、添加(左下角)定位控件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、瀏覽器定位this.geolocation()// 7、綁定點擊地圖任意點事件this.map.addEventListener('click', function(e) {that.getAddrByPoint(e.point)})},// 獲取兩點間的距離getDistancs(pointA, pointB) {return this.map.getDistance(pointA, pointB).toFixed(2)},// 瀏覽器定位函數(shù)geolocation() {var that = thisvar geolocation = new BMap.Geolocation()geolocation.getCurrentPosition(function(res) {if (this.getStatus() == BMAP_STATUS_SUCCESS) {that.getAddrByPoint(res.point)that.locationPoint = res.point} else {alert('failed' + this.getStatus())console.log('failed' + this.getStatus())that.locationPoint = new BMap.Point(113.3324436, 23.1315381)}}, { enableHighAccuracy: true })},// 2、逆地址解析函數(shù)getAddrByPoint(point) {var that = thisvar geco = new BMap.Geocoder()geco.getLocation(point, function(res) {console.log(res)that.mk.setPosition(point)that.map.panTo(point)that.form.address = res.addressthat.form.addrPoint = point})},// 8-1、地址搜索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)} else {cb(s)}}}var local = new BMap.LocalSearch(this.map, options)local.search(str)},// 8-2、選擇地址handleSelect(item) {this.form.address = item.address + item.titlethis.form.addrPoint = item.pointthis.map.clearOverlays()this.mk = new BMap.Marker(item.point)this.map.addOverlay(this.mk)this.map.panTo(item.point)},//點擊確定輸出form表單的內(nèi)容onSubmit() {console.log(this.form)}} } </script> <!-- 樣式 --> <style lang="scss" scoped>.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;}}} </style>五、地圖為子組件,點擊觸發(fā)按鈕,展示地圖(更常見,詳解)
5.1效果圖
1、 點擊選擇,打開地圖的組件
2、檢索功能,也能在地圖自己標(biāo)點
3、提示信息
3、回顯數(shù)據(jù),地圖組件將數(shù)據(jù)傳輸給父組件,父組件取
第一步,一樣先引入封裝好的js文件
5.2 在主頁面引入js,點擊按鈕調(diào)用地圖初始化方法
引入js
import loadBMap from '@/utils/loadBMap.js'鉤子方法加載
created() {// 地圖loadBMap()// 加載引入BMap}引入地圖組件
//說明@afterSelectPosition="afterSelectPosition"這個是綁定的方法 //用于子組件(地圖)給父組件通信(傳值) <selectPosition ref="selectPositionWin" @afterSelectPosition="afterSelectPosition" />在主頁面點擊選擇,展開地圖
點擊觸發(fā)地圖的方法
5.3完整的子組件地圖代碼(dialog包裹)
要點說明
- 使用父組件觸發(fā)子組件地圖,子組件(地圖)必須使用 $nextTick 方法,不會第一次會看不到地圖,第二次才有
- 子組件向父組件通信是采用$emit方法
- 小編使用的是vue+element+百度地圖
$nextTick說明:
Vue.nectTick()介紹: 是在下次DOM更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào),在修改數(shù)據(jù)之后使用$nextTick,則可以在回調(diào)中獲取更新后的DOM(dom的改變是發(fā)生在nextTick()之后),這個方法作用是當(dāng)數(shù)據(jù)被修改后使用這個方法,會回調(diào)獲取更新后的dom再render出來
Vue.nextTick()作用:在下次dom更新循環(huán)結(jié)束之后,執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個方法,獲得更新后的dom
5.4 說明下組件通信
// 子組件 this.$emit('afterSelectPosition', this.form)//父組件 <selectPosition ref="selectPositionWin" @afterSelectPosition="afterSelectPosition" /> 重點在 @afterSelectPosition="afterSelectPosition"//說明 afterSelectPosition這個必須一樣,名字隨便取, @afterSelectPosition這個是父組件取值的方法//父組件取值的方法 afterSelectPosition(data) {this.dataForm.mapLng = data.addrPoint.lngthis.dataForm.mapLat = data.addrPoint.lat }六、其他用法說明
還有不少用處,示例可以借鑒于百度地圖api的示例demo ==> 入口
完結(jié)
總結(jié)
以上是生活随笔為你收集整理的vue整合百度地图(关键字检索)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区块链P2P网络详细讲解
- 下一篇: html5倒计时秒杀怎么做,vue 设