您好,登錄后才能下訂單哦!
前言
現(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>
然后寫樣式
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)站的支持!
免責(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)容。