最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue+高德地圖寫(xiě)地圖選址組件的方法

 更新時(shí)間:2019年05月18日 14:51:59   作者:晴空映云  
這篇文章主要介紹了vue+高德地圖寫(xiě)地圖選址組件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

開(kāi)整

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

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

然后寫(xiě)樣式

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  //無(wú)搜索結(jié)果提示,無(wú)搜索結(jié)果時(shí)會(huì)顯示暫無(wú)搜索結(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)聽(tīng)地圖移動(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)查詢類(lèi)
    var placeSearch = new AMap.PlaceSearch({ 
      type: '汽車(chē)服務(wù)|餐飲服務(wù)|購(gòu)物服務(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)類(lèi)別
      pageSize: 30, // 單頁(yè)顯示結(jié)果條數(shù)
      pageIndex: 1, // 頁(yè)碼
      city: "全國(guó)", // 興趣點(diǎn)城市
      autoFitView: false // 是否自動(dòng)調(diào)整地圖視野使繪制的 Marker點(diǎn)都處于視口的可見(jià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è)方法沒(méi)什么好說(shuō)的,就是高德地圖的方法,copy過(guò)來(lái)就行了,要注意的幾個(gè)點(diǎn):

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

2.這里可以傳條數(shù)和頁(yè)碼,如果需要做上拉加載的都可以使用這個(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)展示的功能就可以使用了,接下來(lái)就是搜索
首先我使用了watch監(jiān)聽(tīng)了用戶輸入的搜索值,當(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>暫無(wú)搜索結(jié)果</p></li>
  </ul>
</div>

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

然后我們來(lái)看一看搜索的方法:

keySearch(){
   AMap.service(["AMap.PlaceSearch"], () => {
     //構(gòu)造地點(diǎn)查詢類(lèi)
     var placeSearch = new AMap.PlaceSearch({
       type: '汽車(chē)服務(wù)|餐飲服務(wù)|購(gòu)物服務(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)類(lèi)別
       pageSize: 30, // 單頁(yè)顯示結(jié)果條數(shù)
       pageIndex: 1, // 頁(yè)碼
       city: "全國(guó)", // 興趣點(diǎn)城市
       citylimit: false, //是否強(qiáng)制限制在設(shè)置的城市內(nèi)搜索
       autoFitView: false // 是否自動(dòng)調(diào)整地圖視野使繪制的 Marker點(diǎn)都處于視口的可見(jià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高德的方法過(guò)來(lái),然后進(jìn)行配置,主要說(shuō)一下這里返回結(jié)果的處理:
1.status為complete的時(shí)候是完成查詢,其中完成后有一個(gè)count 參數(shù)是代表查到的總條數(shù),如果總條數(shù)為0時(shí),我們就this.noSearchShow = true,這個(gè)我們上面說(shuō)了,當(dāng)noSearchShow 為true的時(shí)候會(huì)顯示‘暫無(wú)搜索結(jié)果';如果count不為0的時(shí)候,也就是else中的內(nèi)容,那就將我們查詢到的值賦給this.search_list,然后遍歷出來(lái),然后記得this.noSearchShow = false;
2.另外我是將status不為complete的情況統(tǒng)統(tǒng)視為沒(méi)有搜索結(jié)果,這時(shí)候我們就清空this.search_list,然后this.noSearchShow = true。

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

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

直接@click="search_key = ‘'"就行了,當(dāng)然我們也可以用輸入鍵盤(pán)退格刪除,這時(shí)要注意清空input之后我們要把search_list也清空并且this.noSearchShow = false,這里我是使用了watch來(lái)監(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ì)直接顯示上次的搜索列表,所以我們要清空一下。

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

//這里我們遍歷search_list的時(shí)候?qū)ocation傳進(jìn)來(lái)
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打印出來(lái)就是選擇的地點(diǎn)信息。
在這里我們組件就完成了,另外可能還需要一個(gè)回到當(dāng)前位置的方法,我說(shuō)下思路,就不在寫(xiě)出來(lái)了:
1.在地圖上寫(xiě)一個(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+高德地圖寫(xiě)地圖選址組件的方法詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Vue2.2.0+新特性整理及注意事項(xiàng)

    Vue2.2.0+新特性整理及注意事項(xiàng)

    本文是小編精心給大家收藏整理的關(guān)于Vue2.2.0+新特性,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • Vue組件通信入門(mén)之Provide和Inject機(jī)制

    Vue組件通信入門(mén)之Provide和Inject機(jī)制

    這篇文章主要給大家介紹了關(guān)于Vue組件通信入門(mén)之Provide和Inject機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue組件通信具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 解決echarts echarts數(shù)據(jù)動(dòng)態(tài)更新和dataZoom被重置問(wèn)題

    解決echarts echarts數(shù)據(jù)動(dòng)態(tài)更新和dataZoom被重置問(wèn)題

    這篇文章主要介紹了解決echarts echarts數(shù)據(jù)動(dòng)態(tài)更新和dataZoom被重置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • 詳解Vue2.0組件的繼承與擴(kuò)展

    詳解Vue2.0組件的繼承與擴(kuò)展

    這篇文章主要介紹了詳解Vue2.0組件的繼承與擴(kuò)展,主要分享slot、mixins/extends和extend的用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 解決vue net :ERR_CONNECTION_REFUSED報(bào)錯(cuò)問(wèn)題

    解決vue net :ERR_CONNECTION_REFUSED報(bào)錯(cuò)問(wèn)題

    這篇文章主要介紹了解決vue net :ERR_CONNECTION_REFUSED報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Vue axios的使用和全局baseURL配置方式

    Vue axios的使用和全局baseURL配置方式

    作為一個(gè)全棧開(kāi)發(fā)人員,前端UI框架和網(wǎng)絡(luò)請(qǐng)求都得有基本的掌握,我以最簡(jiǎn)潔易懂的方式講解axios的使用和全局baseURL的配置
    2024-05-05
  • 淺談vue單頁(yè)面中有多個(gè)echarts圖表時(shí)的公用代碼寫(xiě)法

    淺談vue單頁(yè)面中有多個(gè)echarts圖表時(shí)的公用代碼寫(xiě)法

    這篇文章主要介紹了淺談vue單頁(yè)面中有多個(gè)echarts圖表時(shí)的公用代碼寫(xiě)法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • 解決vue-seamless-scroll滾動(dòng)加點(diǎn)贊銜接處數(shù)據(jù)不同步問(wèn)題

    解決vue-seamless-scroll滾動(dòng)加點(diǎn)贊銜接處數(shù)據(jù)不同步問(wèn)題

    這篇文章主要介紹了解決vue-seamless-scroll滾動(dòng)加點(diǎn)贊銜接處數(shù)據(jù)不同步問(wèn)題,初步判斷可能是因?yàn)橄路綉医觱ue-seamless-scroll是靜態(tài)的,沒(méi)同步DOM,本文給大家分享解決方法,感興趣的朋友一起看看吧
    2021-11-11
  • 基于Vue3實(shí)現(xiàn)列表虛擬滾動(dòng)效果

    基于Vue3實(shí)現(xiàn)列表虛擬滾動(dòng)效果

    這篇文章主要為大家介紹了如何利用Vue3實(shí)現(xiàn)列表虛擬滾動(dòng)效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定價(jià)值,需要的可以參考一下
    2022-04-04
  • vue中h5端打開(kāi)app(判斷是安卓還是蘋(píng)果)

    vue中h5端打開(kāi)app(判斷是安卓還是蘋(píng)果)

    這篇文章主要介紹了vue中h5端打開(kāi)app(判斷是安卓還是蘋(píng)果),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評(píng)論

博白县| 乐业县| 洛扎县| 祁阳县| 怀集县| 铅山县| 张家界市| 丹江口市| 大同县| 枝江市| 阜城县| 曲松县| 留坝县| 长治县| 若羌县| 聂荣县| 玉屏| 柯坪县| 英超| 集安市| 蕉岭县| 长海县| 奇台县| 鹤峰县| 手机| 大石桥市| 玉屏| 上高县| 永春县| 清苑县| 遂平县| 新津县| 卢湾区| 深圳市| 平南县| 南靖县| 嘉祥县| 化州市| 中西区| 房产| 揭西县|