溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

vue+高德地圖寫地圖選址組件的方法

發(fā)布時(shí)間:2020-09-24 09:11:29 來源:腳本之家 閱讀:293 作者:晴空映云 欄目:web開發(fā)

前言

現(xiàn)在做這個(gè)移動(dòng)端的項(xiàng)目中有一個(gè)地圖選址的功能,本來高德地圖中有一個(gè)現(xiàn)成的選址組件,但是有兩個(gè)問題,因?yàn)樗怯胕frame引用的,第一改不了樣式,這點(diǎn)還勉強(qiáng)能接受;第二他的左上角有一個(gè)返回鍵,在搜索的時(shí)候可以返回到地圖界面,但是在地圖界面時(shí)點(diǎn)返回沒有用,試了半天也沒搞明白怎么監(jiān)聽到那個(gè)返回鍵的點(diǎn)擊事件,所以趁這兩天項(xiàng)目基本結(jié)束自己寫一個(gè)把這個(gè)功能優(yōu)化一下,也方便以后使用。

開整

vue的安裝使用啥的我在這就不說了,直接開始地圖選址組件。
首先上高德開放平臺(tái)弄一個(gè)key,然后在index.html引入

<script src="https://webapi.amap.com/maps?v=1.4.14&key=yourKey"></script>

然后寫樣式

vue+高德地圖寫地圖選址組件的方法

vue+高德地圖寫地圖選址組件的方法

vue+高德地圖寫地圖選址組件的方法

css我就不貼了,大概就是上面一個(gè)搜索框,中間是地圖,然后下面是一個(gè)地址列表,然后一個(gè)搜索結(jié)果的列表。有一點(diǎn)值得注意一下,就是地圖中心的定位圖標(biāo),這個(gè)自己弄一個(gè)定位圖標(biāo)使用絕對(duì)定位,上下左右外邊距為auto的方法定位到中間,但是這時(shí)地圖的中心點(diǎn)是在圖標(biāo)的中心,我們的圖標(biāo)不是一般都是下面是尖的嘛,選址的時(shí)候都會(huì)用尖的部分指到目標(biāo)位置,那這樣就會(huì)有一點(diǎn)偏差,怎么辦呢,比如我們的圖標(biāo)是30*30的,我們就把bottom的值設(shè)為圖標(biāo)的高度的一半15,或者是把top設(shè)為-15,就ok了,另外注意在切圖的時(shí)候靠著圖標(biāo)邊切,不要留空白。
data里定義的值:

data(){
  return{
    center: [106.532357,29.57212],//緯度-經(jīng)度
    search_key: '',        //搜索值
    lists: [],							//地點(diǎn)列表
    search_list: [],       //搜索結(jié)果列表
    noSearchShow: false  //無搜索結(jié)果提示,無搜索結(jié)果時(shí)會(huì)顯示暫無搜索結(jié)果
  }
 },

然后在mounted中調(diào)取第一個(gè)方法------初始化地圖:

adMap(){
	//初始化地圖
  var map = new AMap.Map('container',{
    zoom: 14,      //縮放級(jí)別
    center: this.center, //設(shè)置地圖中心點(diǎn)
    //resizeEnable: true, //地圖初始化加載定位到當(dāng)前城市
  });
  //獲取初始中心點(diǎn)并賦值
  var currentCenter = map.getCenter();//此方法是獲取當(dāng)前地圖的中心點(diǎn)
  this.center = [currentCenter.lng,currentCenter.lat];//將獲取到的中心點(diǎn)的緯度經(jīng)度賦值給data的center
  //根據(jù)地圖中心點(diǎn)查附近地點(diǎn),此方法在下方
  this.centerSearch();
  //監(jiān)聽地圖移動(dòng)事件,并在移動(dòng)結(jié)束后獲取地圖中心點(diǎn)并更新地點(diǎn)列表
  var moveendFun = (e) => {
    // 獲取地圖中心點(diǎn)
    currentCenter = map.getCenter();
    this.center = [currentCenter.lng,currentCenter.lat]
    //根據(jù)地圖中心點(diǎn)查附近地點(diǎn)
    this.centerSearch();
  }
  // 綁定事件移動(dòng)地圖事件
  map.on('moveend', moveendFun);
},

根據(jù)中心點(diǎn)查詢附近地點(diǎn)

centerSearch(){
  AMap.service(["AMap.PlaceSearch"], () => {
    //構(gòu)造地點(diǎn)查詢類
    var placeSearch = new AMap.PlaceSearch({ 
      type: '汽車服務(wù)|餐飲服務(wù)|購物服務(wù)|生活服務(wù)|體育休閑服務(wù)|醫(yī)療保健服務(wù)|住宿服務(wù)|風(fēng)景名勝|(zhì)商務(wù)住宅|政府機(jī)構(gòu)及社會(huì)團(tuán)體|科教文化服務(wù)|交通設(shè)施服務(wù)|金融保險(xiǎn)服務(wù)|公司企業(yè)|地名地址信息', // 興趣點(diǎn)類別
      pageSize: 30, // 單頁顯示結(jié)果條數(shù)
      pageIndex: 1, // 頁碼
      city: "全國", // 興趣點(diǎn)城市
      autoFitView: false // 是否自動(dòng)調(diào)整地圖視野使繪制的 Marker點(diǎn)都處于視口的可見范圍
    });
    //根據(jù)地圖中心點(diǎn)查附近地點(diǎn)
    placeSearch.searchNearBy('', [this.center[0],this.center[1]], 200, (status, result) => {
      if(status == 'complete'){
        this.lists = result.poiList.pois//將查詢到的地點(diǎn)賦值
      }
    });
  });
 },

這個(gè)方法沒什么好說的,就是高德地圖的方法,copy過來就行了,要注意的幾個(gè)點(diǎn):

1.type,需要查找的地點(diǎn)的分類,這個(gè)可以按需添加減少;

2.這里可以傳條數(shù)和頁碼,如果需要做上拉加載的都可以使用這個(gè);

3.placeSearch.searchNearBy(),這個(gè)方法的第二個(gè)參數(shù)就是經(jīng)緯度,是一個(gè)數(shù)組,這里要注意緯度在前,經(jīng)度在后;

4.然后是返回值status是狀態(tài),result是結(jié)果,具體的請(qǐng)參考:
https://lbs.amap.com/api/javascript-api/reference/search#m_AMap.PlaceSearch

到這里我們一個(gè)地點(diǎn)展示的功能就可以使用了,接下來就是搜索
首先我使用了watch監(jiān)聽了用戶輸入的搜索值,當(dāng)search_key(用戶輸入的值)不為空時(shí):

<!--搜索列表-->
<div class="search-list" v-if="!!search_key">
  <ul>
    <li v-for="(item, index) in search_list" :key="index" @click="onSearchLi(item.location)">
      <span>{{item.name}}</span>
      <p>{{item.address}}</p>
    </li>
    <li v-if="noSearchShow"><p>暫無搜索結(jié)果</p></li>
  </ul>
</div>

我們使用v-if判斷當(dāng)search_key不為空時(shí)就顯示搜索列表,這里的雙感嘆號(hào)就是強(qiáng)制轉(zhuǎn)換為布爾值,不寫也可以的,具體為啥我在這就不多說了;這里的search-list就是定位在頁面上的,把地圖給它覆蓋了,css相信大家都會(huì)。

然后我們來看一看搜索的方法:

keySearch(){
   AMap.service(["AMap.PlaceSearch"], () => {
     //構(gòu)造地點(diǎn)查詢類
     var placeSearch = new AMap.PlaceSearch({
       type: '汽車服務(wù)|餐飲服務(wù)|購物服務(wù)|生活服務(wù)|體育休閑服務(wù)|醫(yī)療保健服務(wù)|住宿服務(wù)|風(fēng)景名勝|(zhì)商務(wù)住宅|政府機(jī)構(gòu)及社會(huì)團(tuán)體|科教文化服務(wù)|交通設(shè)施服務(wù)|金融保險(xiǎn)服務(wù)|公司企業(yè)|地名地址信息', // 興趣點(diǎn)類別
       pageSize: 30, // 單頁顯示結(jié)果條數(shù)
       pageIndex: 1, // 頁碼
       city: "全國", // 興趣點(diǎn)城市
       citylimit: false, //是否強(qiáng)制限制在設(shè)置的城市內(nèi)搜索
       autoFitView: false // 是否自動(dòng)調(diào)整地圖視野使繪制的 Marker點(diǎn)都處于視口的可見范圍
     });
     //關(guān)鍵字查詢
     placeSearch.search(this.search_key,(status, result) => {
       if(status == 'complete'){
         if(result.poiList.count === 0){
           this.noSearchShow = true;
         }else{
           this.search_list = result.poiList.pois//將查詢到的地點(diǎn)賦值
           this.noSearchShow = false;
         }
       }else{
         this.search_list = [];
         this.noSearchShow = true;
       }
     });
   });
 },

還是copy高德的方法過來,然后進(jìn)行配置,主要說一下這里返回結(jié)果的處理:
1.status為complete的時(shí)候是完成查詢,其中完成后有一個(gè)count 參數(shù)是代表查到的總條數(shù),如果總條數(shù)為0時(shí),我們就this.noSearchShow = true,這個(gè)我們上面說了,當(dāng)noSearchShow 為true的時(shí)候會(huì)顯示‘暫無搜索結(jié)果';如果count不為0的時(shí)候,也就是else中的內(nèi)容,那就將我們查詢到的值賦給this.search_list,然后遍歷出來,然后記得this.noSearchShow = false;
2.另外我是將status不為complete的情況統(tǒng)統(tǒng)視為沒有搜索結(jié)果,這時(shí)候我們就清空this.search_list,然后this.noSearchShow = true。

這時(shí)候搜索也完成了,接下來如果我們不想搜索了,清空了搜索框,這是點(diǎn)×的清空方法:

<span class="clear" v-if="search_key" @click="search_key = ''"></span>

直接@click="search_key = ‘'"就行了,當(dāng)然我們也可以用輸入鍵盤退格刪除,這時(shí)要注意清空input之后我們要把search_list也清空并且this.noSearchShow = false,這里我是使用了watch來監(jiān)控search_key:

watch: {
   search_key(newv,oldv){
     if(newv == ''){
       this.search_list = [];
       this.noSearchShow = false;
     }
   }
 },

至于為什么要清空呢?因?yàn)槿绻覀兊谝淮芜M(jìn)行了搜索,這時(shí)search_list就有值了,如果下次在進(jìn)入搜索狀態(tài),就會(huì)直接顯示上次的搜索列表,所以我們要清空一下。

上面是說的放棄了搜索,這里是說如果搜索到了我們想要的結(jié)果,那我們會(huì)去點(diǎn)擊我們想要的結(jié)果:

//這里我們遍歷search_list的時(shí)候?qū)ocation傳進(jìn)來
onSearchLi(location){
  this.center = [location.lng,location.lat];
  this.adMap();
  this.search_key = '';
},

這里的步驟是:
1.先給this.center賦值,這里注意緯度在前,經(jīng)度在后!
2.調(diào)取上面的this.adMap()查詢一次新的lists;
3.清空search_key,清空search_key后搜索列表就會(huì)自動(dòng)隱藏了,另外因?yàn)槲覀冇脀atch監(jiān)控了search_key ,所以在這里清空search_key 的同時(shí)也會(huì)清空search_list并將noSearchShow設(shè)為false。

這里基本上就差不多完成了,還有就是最后一步,我們點(diǎn)擊地址列表的時(shí)候獲取地址信息:

//html
<li v-for="(item, index) in lists" :key="index" @click="onResLi(item)">
       <span>{{item.name}}</span>
       <p>{{item.address}}</p>
</li>

//js  
onResLi(e){
   console.log(e)
}

這里e打印出來就是選擇的地點(diǎn)信息。
在這里我們組件就完成了,另外可能還需要一個(gè)回到當(dāng)前位置的方法,我說下思路,就不在寫出來了:
1.在地圖上寫一個(gè)圖標(biāo),給一個(gè)點(diǎn)擊事件;
2.點(diǎn)擊的時(shí)候使用高德的定位方法獲取當(dāng)前位置的坐標(biāo),然后賦值給this.center;
3.再調(diào)一次adMap()方法就會(huì)回到當(dāng)前位置了。

歡迎大佬批評(píng)指正優(yōu)化,小弟獻(xiàn)丑了~

以上所述是小編給大家介紹的vue+高德地圖寫地圖選址組件的方法詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI