vue項(xiàng)目使用高德地圖的定位及關(guān)鍵字搜索功能的實(shí)例代碼(踩坑經(jīng)驗(yàn))
1.首先在index.html引入高德地圖的秘鑰。如圖:

注意:如果使用關(guān)鍵字搜索功能要加上 plugin=AMap.Autocomplete,AMap.PlaceSearch,否則功能無(wú)法使用,并會(huì)報(bào)錯(cuò)
2. 定位功能,代碼如下:
const map = new AMap.Map(this.$refs.container, {
resizeEnable: true
}) // 創(chuàng)建Map實(shí)例
const options = {
'showButton': true, // 是否顯示定位按鈕
'buttonPosition': 'LB', // 定位按鈕的位置
'buttonOffset': new AMap.Pixel(10, 20), // 定位按鈕距離對(duì)應(yīng)角落的距離
'showMarker': true, // 是否顯示定位點(diǎn)
'showCircle': true, // 是否顯示定位精度圈
'circleOptions': {// 定位精度圈的樣式
'strokeColor': '#0093FF',
'noSelect': true,
'strokeOpacity': 0.5,
'strokeWeight': 1,
'fillColor': '#02B0FF',
'fillOpacity': 0.25
},
zoomToAccuracy: true // 定位成功后是否自動(dòng)調(diào)整地圖視野到定位點(diǎn)
}
AMap.plugin(['AMap.Geolocation'], function() {
const geolocation = new AMap.Geolocation(options)
map.addControl(geolocation)
geolocation.getCurrentPosition()
})
//下面是點(diǎn)擊地圖時(shí)加入mark。注意:要在綁定事件前記錄this,否則在綁定的回調(diào)方法中使用this將是該事件的this
const _this = this
AMap.event.addListener(map, 'click', function(e) {
map.clearMap() // 清除地圖上所有添加的覆蓋物
new AMap.Marker({
position: e.lnglat,
map: map
})
_this.handleMap(e.lnglat.getLng(), e.lnglat.getLat())
})
3.關(guān)鍵字搜索功能
html部分代碼(注意ref,id,class的名字要和官網(wǎng)保持一致,否則可能出不來(lái)想要的效果):
<template>
<div class="map-chart">
<div id="container" ref="container" />
<div id="myPageTop">
<table>
<tr>
<td>
<label>請(qǐng)輸入關(guān)鍵字:</label>
</td>
</tr>
<tr>
<td>
<input id="tipinput">
</td>
</tr>
</table>
</div>
</div>
</template>
script代碼:
export default {
name: 'Map',
props: [],
data() {
return {
placeSearch: null
}
},
mounted() {
this.mapInit()
},
methods: {
mapInit() {
const map = new AMap.Map(this.$refs.container, {
resizeEnable: true
}) // 創(chuàng)建Map實(shí)例
const options = {
'showButton': true, // 是否顯示定位按鈕
'buttonPosition': 'LB', // 定位按鈕的位置
'buttonOffset': new AMap.Pixel(10, 20), // 定位按鈕距離對(duì)應(yīng)角落的距離
'showMarker': true, // 是否顯示定位點(diǎn)
'showCircle': true, // 是否顯示定位精度圈
'circleOptions': {// 定位精度圈的樣式
'strokeColor': '#0093FF',
'noSelect': true,
'strokeOpacity': 0.5,
'strokeWeight': 1,
'fillColor': '#02B0FF',
'fillOpacity': 0.25
},
zoomToAccuracy: true // 定位成功后是否自動(dòng)調(diào)整地圖視野到定位點(diǎn)
}
//注意:要在綁定事件前記錄this,否則在綁定的回調(diào)方法中使用this將是該事件的this
const _this = this
// 輸入提示
const autoOptions = {
input: 'tipinput'
}
const auto = new AMap.Autocomplete(autoOptions)
this.placeSearch = new AMap.PlaceSearch({
map: map
}) // 構(gòu)造地點(diǎn)查詢(xún)類(lèi)
AMap.event.addListener(auto, 'select', this.select)// 注冊(cè)監(jiān)聽(tīng),當(dāng)選中某條記錄時(shí)會(huì)觸發(fā)
//點(diǎn)擊搜索出的mark點(diǎn)事件
AMap.event.addListener(this.placeSearch, 'markerClick', function(e) {
_this.$emit('bMapDate', e.data.location.lng, e.data.location.lat)
})
},
select(e) {
this.placeSearch.setCity(e.poi.adcode)
this.placeSearch.search(e.poi.name) // 關(guān)鍵字查詢(xún)查詢(xún)
},
handleMap(o, a) {
this.$emit('bMapDate', o, a)
}
}
}
</script>
整體完成代碼:
<template>
<div class="map-chart">
<div id="container" ref="container" />
<div id="myPageTop">
<table>
<tr>
<td>
<label>請(qǐng)輸入關(guān)鍵字:</label>
</td>
</tr>
<tr>
<td>
<input id="tipinput">
</td>
</tr>
</table>
</div>
</div>
</template>
<script>
export default {
name: 'Map',
props: [],
data() {
return {
placeSearch: null
}
},
mounted() {
this.mapInit()
},
methods: {
mapInit() {
const map = new AMap.Map(this.$refs.container, {
resizeEnable: true
}) // 創(chuàng)建Map實(shí)例
const options = {
'showButton': true, // 是否顯示定位按鈕
'buttonPosition': 'LB', // 定位按鈕的位置
'buttonOffset': new AMap.Pixel(10, 20), // 定位按鈕距離對(duì)應(yīng)角落的距離
'showMarker': true, // 是否顯示定位點(diǎn)
'showCircle': true, // 是否顯示定位精度圈
'circleOptions': {// 定位精度圈的樣式
'strokeColor': '#0093FF',
'noSelect': true,
'strokeOpacity': 0.5,
'strokeWeight': 1,
'fillColor': '#02B0FF',
'fillOpacity': 0.25
},
zoomToAccuracy: true // 定位成功后是否自動(dòng)調(diào)整地圖視野到定位點(diǎn)
}
AMap.plugin(['AMap.Geolocation'], function() {
const geolocation = new AMap.Geolocation(options)
map.addControl(geolocation)
geolocation.getCurrentPosition()
})
const _this = this
AMap.event.addListener(map, 'click', function(e) {
map.clearMap() // 清除地圖上所有添加的覆蓋物
new AMap.Marker({
position: e.lnglat,
map: map
})
_this.handleMap(e.lnglat.getLng(), e.lnglat.getLat())
})
// 輸入提示
const autoOptions = {
input: 'tipinput'
}
const auto = new AMap.Autocomplete(autoOptions)
this.placeSearch = new AMap.PlaceSearch({
map: map
}) // 構(gòu)造地點(diǎn)查詢(xún)類(lèi)
AMap.event.addListener(auto, 'select', this.select)// 注冊(cè)監(jiān)聽(tīng),當(dāng)選中某條記錄時(shí)會(huì)觸發(fā)
AMap.event.addListener(this.placeSearch, 'markerClick', function(e) {
_this.$emit('bMapDate', e.data.location.lng, e.data.location.lat)
})
},
select(e) {
this.placeSearch.setCity(e.poi.adcode)
this.placeSearch.search(e.poi.name) // 關(guān)鍵字查詢(xún)查詢(xún)
},
handleMap(o, a) {
this.$emit('bMapDate', o, a)
}
}
}
</script>
<style scoped>
.map-chart{
position: relative;
margin-bottom:15px;
width: 100%;
height: 400px;
border: 1px #dddddd solid;
}
/deep/ .amap-logo,/deep/ .amap-copyright {
display: none!important;
}
#container {
margin-bottom:15px;
width: 100%;
height: 400px;
border: 1px #dddddd solid;
z-index: 99999999;
}
.button-group {
position: absolute;
bottom: 20px;
right: 20px;
font-size: 12px;
padding: 10px;
}
.button-group .button {
height: 28px;
line-height: 28px;
background-color: #0D9BF2;
color: #FFF;
border: 0;
outline: none;
padding-left: 5px;
padding-right: 5px;
border-radius: 3px;
margin-bottom: 4px;
cursor: pointer;
}
.button-group .inputtext {
height: 26px;
line-height: 26px;
border: 1px;
outline: none;
padding-left: 5px;
padding-right: 5px;
border-radius: 3px;
margin-bottom: 4px;
cursor: pointer;
}
#tip {
background-color: #fff;
padding-left: 10px;
padding-right: 10px;
position: absolute;
font-size: 12px;
right: 10px;
top: 20px;
border-radius: 3px;
border: 1px solid #ccc;
line-height: 30px;
}
.amap-info-content {
font-size: 12px;
}
#myPageTop {
position: absolute;
top: 5px;
right: 10px;
background: #fff none repeat scroll 0 0;
border: 1px solid #ccc;
margin: 10px auto;
padding:6px;
font-family: "Microsoft Yahei", "微軟雅黑", "Pinghei";
font-size: 14px;
z-index: 99999999;
}
#myPageTop label {
margin: 0 20px 0 0;
color: #666666;
font-weight: normal;
}
#myPageTop input {
width: 170px;
}
#myPageTop .column2{
padding-left: 25px;
}
</style>
由于我在項(xiàng)目中使用了dialog,搜索出來(lái)的結(jié)果會(huì)在蒙版后面顯示,去掉scope和加/deep/、>>>都沒(méi)用,最后在index.html加樣式。代碼如下:
<style type="text/css">
.amap-sug-result {
z-index: 2999!important;
}
</style>
效果:

以上就是踩了無(wú)數(shù)坑總結(jié)出來(lái)的經(jīng)驗(yàn)。。。
到此這篇關(guān)于vue項(xiàng)目使用高德地圖的定位及關(guān)鍵字搜索功能的實(shí)例代碼(踩坑經(jīng)驗(yàn))的文章就介紹到這了,更多相關(guān)vue 高德地圖定位搜索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你在vue項(xiàng)目中使用svg圖標(biāo)的方法
本文給大家介紹了在vue項(xiàng)目中使用svg圖標(biāo)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-04-04
vue中$nexttick,$set,$forceupdate的區(qū)別
本文主要介紹了vue中$nexttick,$set,$forceupdate的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
vue中數(shù)據(jù)綁定值(字符串拼接)的幾種實(shí)現(xiàn)方法
這篇文章主要介紹了vue中數(shù)據(jù)綁定值(字符串拼接)的幾種實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
vue父組件與子組件之間的數(shù)據(jù)交互方式詳解
最近一直在做一個(gè)vue移動(dòng)端商城的實(shí)戰(zhàn),期間遇到一個(gè)小小的問(wèn)題,值得一說(shuō),下面這篇文章主要給大家介紹了關(guān)于vue父組件與子組件之間數(shù)據(jù)交互的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
快速解決element的autofocus失效問(wèn)題
這篇文章主要介紹了快速解決element的autofocus失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
vue3循環(huán)設(shè)置ref并獲取的解決方案
我們?cè)谄綍r(shí)做業(yè)務(wù)的時(shí)候,父子組件通信會(huì)經(jīng)常用到ref,這篇文章主要給大家介紹了關(guān)于vue3循環(huán)設(shè)置ref并獲取的解決方案,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02

