实现效果
直接代码(备注很详细的~)
<template>
<div class="baidu_map">
<el-form ref="form" label-suffix=":" label-width="100px">
<el-row :gutter="10">
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
<el-form-item label="详细地址">
<el-autocomplete
style="width:100%;"
popper-class="autoAddressClass"
v-model="mapData.address"
:fetch-suggestions="querySearch"
:trigger-on-focus="false"
placeholder="请输入详细地址"
@select="handleSelect"
clearable
>
<template #default="{ item }">
<div class="autoAddressClass_item">
<ElIcon :size="20" color="balck">
<Search />
</ElIcon>
<div>
<div class="title">{{ item.title }}</div>
<span class="address ellipsis">{{ item.address }}</span>
</div>
</div>
</template>
</el-autocomplete>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
<el-form-item label="经纬度" prop="projectId">
<el-input disabled placeholder="请选择经纬度" v-model="mapData.point" type="text" :readonly="true" ></el-input>
</el-form-item>
</el-col>
</el-row>
<div id="map" :style="{ width, height }"></div>
</el-form>
</div>
</template>
<script setup>
import { Search } from '@element-plus/icons-vue'
const { latitude, longitude, width, height, zoom} = defineProps({
latitude:{
type:Number,
default:36.67411054692821
},
longitude:{
type: Number,
default:117.10358591219932,
},
width:{
type: String,
default: '920px'
},
height:{
type: String,
default: '400px'
},
zoom:{
type: Number,
default: 12
},
})
const mapData = ref({
address:'',
point:'',
lat:'',
lng:'',
})
const emits = defineEmits(['getPoint'])
const BMap = window.BMap
let Map = null
let mk = null
onMounted(()=>{
Map = new BMap.Map('map',{enableMapClick:false})
var point = new BMap.Point(longitude, latitude)
Map.centerAndZoom(point, zoom)
Map.enableScrollWheelZoom(true)
mk = new BMap.Marker(point,{enableDragging:true})
Map.addOverlay(mk)
mk.addEventListener('dragend', function(e){
getAddrByPoint(e.point)
})
})
function querySearch(str,cb){
var options = {
onSearchComplete: function(res){
var arr = [];
if (local.getStatus() == BMAP_STATUS_SUCCESS){
for (var i = 0; i < res.getCurrentNumPois(); i ++){
arr.push(res.getPoi(i));
}
}
cb(arr)
}
}
var local = new BMap.LocalSearch(Map, options)
local.search(str)
}
function handleSelect(item){
mapData.value = {
address:item.address,
point:item.point.lat + ',' + item.point.lng,
lat:item.point.lat,
lng:item.point.lng
}
Map.clearOverlays()
mk = new BMap.Marker(item.point,{enableDragging:true})
mk.addEventListener('dragend', function(e){
getAddrByPoint(e.point)
})
Map.addOverlay(mk)
Map.panTo(item.point)
}
function getAddrByPoint(point){
var geco = new BMap.Geocoder();
geco.getLocation(point, function(res){
mapData.value = {
address:res.address,
point:point.lat + ',' + point.lng,
lat:point.lat,
lng:point.lng
}
mk.setPosition(point)
Map.panTo(point)
})
}
defineExpose({ mapData })
</script>
<style scoped lang="scss">
.autoAddressClass{
li {
.title {
line-height: 30px;
text-overflow: ellipsis;
overflow: hidden;
}
.address {
line-height: 1;
font-size: 12px;
color: #b4b4b4;
margin-bottom: 5px;
}
.autoAddressClass_item{
overflow: hidden;
display: flex;
align-items: center;
.el-icon{
margin-right: 20px;
}
}
}
}
</style>