日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > vue >内容正文

vue

vue整合百度地图(关键字检索)

發(fā)布時(shí)間:2023/12/20 vue 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue整合百度地图(关键字检索) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

百度地圖


文章目錄

  • 百度地圖
  • 一、申請(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ō)明:

  • 搜索檢索位置,獲取經(jīng)緯度
  • 地圖標(biāo)點(diǎn)反解析出經(jīng)緯度
  • 3.2 方式一 vue腳手架2.0版本引用(不推薦):

  • 在index.html引入
  • <script async type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=你的ak"></script>
  • 在 webpack.base.conf.js 添加externals.BMap配置,與entry平級(jí),內(nèi)容如下
  • entry: {app: ['babel-polyfill', './src/main.js'] }, externals: {BMap: 'BMap' }

    說(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ā)地圖的方法

    selectPosition() {// 調(diào)用子組件(地圖)的初始化方法this.$refs.selectPositionWin.myMehod() },

    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

    <template><!-- dialogShow綁定對(duì)話框是否展示,默認(rèn)為false--><el-dialog :visible.sync="dialogShow" :title="dialogTitle" :close-on-click-modal="false" append-to-body top="5vh"width="900px" height="400px"><!-- 大盒子--><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: 700px"popper-class="autoAddressClass":fetch-suggestions="querySearchAsync":trigger-on-focus="false"placeholder="詳細(xì)地址"clearable@select="handleSelect"><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: 700px; height: 350px"/></el-form-item><!-- 按鈕事件--><el-form-item><el-button type="primary" @click="onSubmit">確定</el-button><el-button @click="handleClose">取消</el-button></el-form-item></el-form></div></el-dialog> </template><script>/* 無(wú)須在引入,因?yàn)樵诟附M件已經(jīng)引入了 *///import loadBMap from "@/utils/loadBMap.js";export default {data() {return {dialogShow: false,//對(duì)話框狀態(tài)dialogTitle: '地圖定位',form: {address: "", // 詳細(xì)地址addrPoint: {// 詳細(xì)地址經(jīng)緯度lng: 0,lat: 0,},},map: "", // 地圖實(shí)例mk: "", // Marker實(shí)例locationPoint: null,};},methods: {//必須使用$nextTick不然第一次地圖會(huì)初始化失敗,第二次才看得地圖// 必須使用$nextTick不然地圖的創(chuàng)建坐標(biāo)會(huì)比地圖掛載還快。第一次會(huì)初始化失敗myMehod() {//將對(duì)話框狀態(tài)改為true,也就是打開(kāi)對(duì)話框this.dialogShow = truethis.$nextTick(() => {this.initMap()})},// 初始化地圖initMap() {var that = this;// 1、掛載地圖this.map = new BMap.Map("map-container", {enableMapClick: false});var point = new BMap.Point(119.30244559059787, 26.106339983665546);//默認(rèn)點(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);console.log("locationError", 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 = this;var 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(119.30244559059787, 26.106339983665546);}},{enableHighAccuracy: true});},// 2、逆地址解析函數(shù)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;});},// 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.title;this.form.addrPoint = item.point;this.map.clearOverlays();this.mk = new BMap.Marker(item.point);this.map.addOverlay(this.mk);this.map.panTo(item.point);},//提交數(shù)據(jù)onSubmit() {// console.log('緯度:',this.form.addrPoint.lat);// console.log('經(jīng)度:',this.form.addrPoint.lng);//傳輸數(shù)據(jù)this.$emit('afterSelectPosition', this.form)//子組件向父組件通信//提示框this.$confirm('地址確定好了嗎, 是否繼續(xù)?', '提示', {confirmButtonText: '確定',cancelButtonText: '取消',type: 'warning'}).then(() => {//將對(duì)話框狀態(tài)改為false,也就是關(guān)閉對(duì)話框this.dialogShow = false//將文本域數(shù)據(jù)清空,不然第二次進(jìn)來(lái)會(huì)有數(shù)據(jù)this.form.address = ''})},handleClose() {//將對(duì)話框狀態(tài)改為false,也就是關(guān)閉對(duì)話框this.dialogShow = false//提示this.$message({type: 'success',message: "關(guān)閉地圖"})//將文本域數(shù)據(jù)清空,不然第二次進(jìn)來(lái)會(huì)有數(shù)據(jù)this.form.address = ''}},}; </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>

    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ō)明

  • 比如在一個(gè)范圍內(nèi)的打卡
  • 硬件定位超出地圖規(guī)定范圍預(yù)警等一系列操作
  • 獲取多個(gè)經(jīng)緯度的地點(diǎn),在地圖上使用標(biāo)點(diǎn)顯示
  • 路線導(dǎo)航功能
  • 還有不少用處,示例可以借鑒于百度地圖api的示例demo ==> 入口


    完結(jié)

    總結(jié)

    以上是生活随笔為你收集整理的vue整合百度地图(关键字检索)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。