效果
代码: public/index.html引入,在</body>标签上 lng是经度 lat是纬度
1.<!--高德地图js-->
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.14&key=2d5879db229ad4cca377758bc00ecd93&plugin=AMap.Driving"></script>
2.父页面引用的对象弹框
<el-dialog title="选择地址" :visible.sync="mapOpen" width="1000px" append-to-body :closeOnClickModal=false>
<Amap v-if="mapOpen" ref="map" :longitude="form.lng" :latitude="form.lat" />
<div v-show="!isReadOnly" slot="footer" class="dialog-footer">
<el-button type="primary" @click="getMap">确 定</el-button>
<el-button @click="hideMap">取 消</el-button>
</div>
</el-dialog>
getMap() {
this.form.lng = this.$refs.map.position.lng;
this.form.lat = this.$refs.map.position.lat;
// this.form.bizAddr = this.$refs.map.position.adress;
this.mapOpen = false;
},
hideMap() {
this.mapOpen = false;
}
3.引用的页面
<template>
<div id="amap-container">
<el-input
id="search-input"
v-model="searchValue"
class="input-with"
placeholder="请输入地址"
clearable
@clear="handelclearInput"
@keyup.native.enter="handelSearch"
>
<el-button
slot="append"
size="small"
type="primary"
icon="el-icon-search"
@click="handelSearch"
>搜索</el-button
>
</el-input>
<div id="searchResultPanel" />
<el-row style="margin-top: 10px;" class="margin-top-10 address">
当前地址是: {{ formattedAddress }}
</el-row>
<el-row style="margin-top: 10px;" class="margin-top-10 address">
经度:{{position.lng}} <span style="margin-left: 2%"> 纬度:{{position.lat}} </span>
</el-row>
<div style="height:390px;" id="custom-amap" />
</div>
</template>
<script>
/*const AMap = window.AMap;*/
export default {
name: 'AMap',
props: {
defaultValue: {
type: String,
default: ''
}
},
data() {
return {
defaultCity: '镇江',
// 地图对象
map: null,
// 定位默认地址 | 搜索后选择的地址
formattedAddress: null,
// 地址对应的经纬度信息
position: {},
// 检索关键字
searchValue: '',
// 检索函数对象
placeSearch: null,
// 检索结果数据数据
searchInfoList: [],
// 地图标记
marker: '',
// 地址解析(正向)
geocoder: '',
// 地址名称
name: ''
};
},
watch: {
defaultValue() {
this.searchValue = this.defaultValue;
}
},
// 父组件传来的参数
props: [
'longitude',
'latitude',
// 'bizAddr'
],
mounted() {
// 初始化地图页面
this.initMap();
},
beforeDestroy() {
// 销毁地图
this.map.destroy();
},
methods: {
// 初始化地图页面
initMap() {
this.map = new AMap.Map('custom-amap', {
resizeEnable: true,
zoom: 50,
});
// 添加工具栏
this.map.plugin(['AMap.ToolBar', 'AMap.Scale', 'AMap.OverView'], () => {
// 工具条
const toolbar = new AMap.ToolBar();
// 比例尺
const scale = new AMap.Scale();
// 显示鹰眼
const overView = new AMap.OverView();
this.map.addControl(toolbar);
this.map.addControl(scale);
this.map.addControl(overView);
});
// 添加maker
//this.setMaker();
// 添加鼠标点选地图选择地址
this.addAmapGeocoder();
// 添加定位
this.addAMapGeolocation();
// 添加检索提示
this.addAMapAutocompletePlaceSearch();
},
// 添加maker
setMaker() {
this.marker = new AMap.Marker();
this.map.add(this.marker);
// 添加解析地理位置插件
this.map.plugin('AMap.Geocoder', () => {
// 异步加载插件
this.geocoder = new AMap.Geocoder({
city: this.defaultCity, // 默认:“全国”
radius: 1000 // 范围,默认:500
});
});
},
// 添加鼠标点选地图选择地址
addAmapGeocoder() {
// 添加maker
this.setMaker();
// 地图添加点击事件
this.map.on('click', e => {
const lnglat = [e.lnglat.lng, e.lnglat.lat];
this.marker.setPosition(lnglat);
this.geocoder.getAddress(lnglat, (status, result) => {
if (status === 'complete' && result.regeocode) {
const res = result.regeocode;
const data = {
// 地址名称
adress: res.formattedAddress,
// 纬度lat
lat: lnglat[1],
// 经度lng
lng: lnglat[0]
};
this.formattedAddress = res.formattedAddress;
this.position = data;
} else {
alert(JSON.stringify(result));
}
});
});
},
// 添加自动定位
addAMapGeolocation() {
this.map.plugin('AMap.Geolocation', () => {
const geolocation = new AMap.Geolocation({
// 是否使用高精度定位,默认:true
enableHighAccuracy: true,
// 设置定位超时时间,默认:无穷大
timeout: 10000,
// 定位按钮的停靠位置的偏移量,默认:Pixel(10, 20)
buttonOffset: new AMap.Pixel(10, 20),
// 定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
zoomToAccuracy: true,
// 定位按钮的排放位置, RB表示右下
buttonPosition: 'RB'
});
// 获取当前位置
geolocation.getCurrentPosition();
// 添加定位当前城市成功监听
AMap.event.addListener(
geolocation,
'complete',
this.onCurrentPositionComplete
);
// 添加定位当前城市发生错误监听
AMap.event.addListener(
geolocation,
'error',
this.onCurrentPositionError
);
});
},
// 添加检索提示检索
addAMapAutocompletePlaceSearch() {
// 自动提示
this.map.plugin('AMap.Autocomplete', () => {
const auto = new AMap.Autocomplete({
city: this.defaultCity,
input: 'search-input'
});
// 添加检索监听
AMap.event.addListener(auto, 'select', this.onSelectAutocomplete);
});
// 检索服务
AMap.service(['AMap.PlaceSearch'], () => {
// 构造地点查询类
this.placeSearch = new AMap.PlaceSearch({
type: '', // 兴趣点类别
pageSize: 5, // 单页显示结果条数
pageIndex: 1, // 页码
city: this.defaultCity, // 兴趣点城市
citylimit: false, // 是否强制限制在设置的城市内搜索
map: this.map, // 展现结果的地图实例
panel: 'searchResultPanel', // 结果列表将在此容器中进行展示。
autoFitView: true // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
});
});
// 添加检索监听
AMap.event.addListener(
this.placeSearch,
'listElementClick',
this.onSelectSearch
);
},
// 定位当前城市成功回调
onCurrentPositionComplete(res) {
// 添加maker
let lnglat = [];
if(this.longitude != null){
lnglat = [this.longitude, this.latitude];
// this.formattedAddress = this.bizAddr;
const pos = {"lng":this.longitude, "lat":this.latitude};
this.position = pos;
}else{
lnglat = [res.position.lng, res.position.lat];
this.formattedAddress = res.formattedAddress;
this.position = res.position;
}
//this.setMaker();
this.marker.setPosition(lnglat);
this.map.setCenter(lnglat);
},
// 定位当前城市发生错误回调
onCurrentPositionError(err) {
console.log(err);
},
// 按钮触发检索
handelSearch() {
this.placeSearch.search(this.searchValue, (status, info) => {
this.searchInfoList = info.poiList.pois;
});
},
// 选择自动提示数据事件回调
onSelectAutocomplete(e) {
this.searchValue = e.poi.name;
this.handelSearch();
},
// 选择检索数据结果事件回调
onSelectSearch(e) {
const res = e.data;
this.formattedAddress = res.cityname + res.adname + res.address;
this.name = res.name;
this.position = res.location;
},
// 清除input里的值,清除搜索结果,再次初始化map
handelclearInput() {
document.querySelector('#searchResultPanel').innerHTML = '';
},
/*// 保存当前选择的地址,分发事件
handelSave() {
this.searchValue = this.formattedAddress;
const { lat, lng } = this.position;
const data = {
name: this.name,
// 地址名称
address: this.formattedAddress,
// 纬度lat
lat,
// 经度lng
lng
};
this.$emit('getPosition', data);
},*/
}
};
</script>
<style lang="scss">
#amap-container {
.el-input__clear {
line-height: 34px;
// top: 20px;
}
#custom-amap {
height: 60vh;
width: 100%;
margin-top: 10px;
border: 1px solid #ccc;
}
.input-with {
// position: fixed;
// top: 40px;
z-index: 1;
width: 580px;
}
.address {
color: #373737;
}
}
.amap-sug-result {
z-index: 99999;
}
</style>