vue整合百度地图(关键字检索)
百度地圖
文章目錄
- 百度地圖
- 一、申請(qǐng)百度地圖的密鑰
- 二、官方示例
- 三、使用vue整合百度地圖步驟說(shuō)明
- 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()
- 四、整合詳解(單獨(dú)地圖頁(yè)面)
- 4.1、直接上完整代碼,代碼注釋詳解
- 五、地圖為子組件,點(diǎn)擊觸發(fā)按鈕,展示地圖(更常見(jiàn),詳解)
- 5.1效果圖
- 5.2 在主頁(yè)面引入js,點(diǎn)擊按鈕調(diào)用地圖初始化方法
- 5.3完整的子組件地圖代碼(dialog包裹)
- 5.4 說(shuō)明下組件通信
- 六、其他用法說(shuō)明
一、申請(qǐng)百度地圖的密鑰
官網(wǎng)入口
白名單要為 *
創(chuàng)建成功
二、官方示例
示例入口
比較有意思的幾個(gè)案例
三、使用vue整合百度地圖步驟說(shuō)明
3.1 效果圖:
說(shuō)明:
3.2 方式一 vue腳手架2.0版本引用(不推薦):
說(shuō)明:vue-cli 3.0+ 的版本已經(jīng)取消了webpack.conf這些文件了,所以上面的方法就不適用了,而且耗費(fèi)性能
其實(shí)在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=' + '你的申請(qǐng)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()//這個(gè)是初始化地圖的方法,在method中定義},這樣組件基本準(zhǔn)備完成,可以根據(jù)百度官方示例進(jìn)行編寫(xiě)
四、整合詳解(單獨(dú)地圖頁(yè)面)
4.1、直接上完整代碼,代碼注釋詳解
<template><!-- 定義大個(gè)盒子 --><div class="app-container"><!--使用element ui --><el-form ref="form" :model="form" label-width="110px"><!-- 檢索框部分 --><el-form-item label="詳細(xì)地址:" prop="address"><el-autocompletev-model="form.address"style="width:100%;"popper-class="autoAddressClass":fetch-suggestions="querySearchAsync":trigger-on-focus="false"placeholder="詳細(xì)地址"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: '', // 詳細(xì)地址addrPoint: { // 詳細(xì)地址經(jīng)緯度lng: 0,lat: 0}},map: '', // 地圖實(shí)例mk: '', // Marker實(shí)例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è)置個(gè)默認(rèn)標(biāo)點(diǎn)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、綁定點(diǎn)擊地圖任意點(diǎn)事件this.map.addEventListener('click', function(e) {that.getAddrByPoint(e.point)})},// 獲取兩點(diǎn)間的距離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)},//點(diǎn)擊確定輸出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>五、地圖為子組件,點(diǎn)擊觸發(fā)按鈕,展示地圖(更常見(jiàn),詳解)
5.1效果圖
1、 點(diǎn)擊選擇,打開(kāi)地圖的組件
2、檢索功能,也能在地圖自己標(biāo)點(diǎn)
3、提示信息
3、回顯數(shù)據(jù),地圖組件將數(shù)據(jù)傳輸給父組件,父組件取
第一步,一樣先引入封裝好的js文件
5.2 在主頁(yè)面引入js,點(diǎn)擊按鈕調(diào)用地圖初始化方法
引入js
import loadBMap from '@/utils/loadBMap.js'鉤子方法加載
created() {// 地圖loadBMap()// 加載引入BMap}引入地圖組件
//說(shuō)明@afterSelectPosition="afterSelectPosition"這個(gè)是綁定的方法 //用于子組件(地圖)給父組件通信(傳值) <selectPosition ref="selectPositionWin" @afterSelectPosition="afterSelectPosition" />在主頁(yè)面點(diǎn)擊選擇,展開(kāi)地圖
點(diǎn)擊觸發(fā)地圖的方法
5.3完整的子組件地圖代碼(dialog包裹)
要點(diǎn)說(shuō)明
- 使用父組件觸發(fā)子組件地圖,子組件(地圖)必須使用 $nextTick 方法,不會(huì)第一次會(huì)看不到地圖,第二次才有
- 子組件向父組件通信是采用$emit方法
- 小編使用的是vue+element+百度地圖
$nextTick說(shuō)明:
Vue.nectTick()介紹: 是在下次DOM更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào),在修改數(shù)據(jù)之后使用$nextTick,則可以在回調(diào)中獲取更新后的DOM(dom的改變是發(fā)生在nextTick()之后),這個(gè)方法作用是當(dāng)數(shù)據(jù)被修改后使用這個(gè)方法,會(huì)回調(diào)獲取更新后的dom再render出來(lái)
Vue.nextTick()作用:在下次dom更新循環(huán)結(jié)束之后,執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個(gè)方法,獲得更新后的dom
5.4 說(shuō)明下組件通信
// 子組件 this.$emit('afterSelectPosition', this.form)//父組件 <selectPosition ref="selectPositionWin" @afterSelectPosition="afterSelectPosition" /> 重點(diǎn)在 @afterSelectPosition="afterSelectPosition"//說(shuō)明 afterSelectPosition這個(gè)必須一樣,名字隨便取, @afterSelectPosition這個(gè)是父組件取值的方法//父組件取值的方法 afterSelectPosition(data) {this.dataForm.mapLng = data.addrPoint.lngthis.dataForm.mapLat = data.addrPoint.lat }六、其他用法說(shuō)明
還有不少用處,示例可以借鑒于百度地圖api的示例demo ==> 入口
完結(jié)
總結(jié)
以上是生活随笔為你收集整理的vue整合百度地图(关键字检索)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 区块链P2P网络详细讲解
- 下一篇: 记一个vue router相关的 Unc