请你扮演一个资深前端,用vue结合百度地图写一个通过按钮打开弹框(el-dialog),在百度地图上选点获取经纬度及名称的功能(可搜索地点)
时间: 2024-03-01 13:51:08 浏览: 80
好的,这是一个比较实用的功能,我可以帮你实现。首先,我们需要在 Vue 项目中安装并引入百度地图 JavaScript API,并且引入 Element UI。
在 Vue 组件中,我们可以定义一个按钮,点击按钮时打开一个弹框:
```html
<template>
<div>
<el-button type="primary" @click="openDialog">选择地点</el-button>
<el-dialog title="选择地点" :visible.sync="dialogVisible">
<!-- 弹框内容 -->
</el-dialog>
</div>
</template>
```
接下来,在弹框中添加百度地图组件和搜索框组件:
```html
<el-dialog title="选择地点" :visible.sync="dialogVisible">
<!-- 百度地图组件 -->
<div ref="mapContainer" style="height: 400px;"></div>
<!-- 搜索框组件 -->
<el-input v-model="searchText" placeholder="请输入地址或关键字" @keyup.enter.native="search"></el-input>
<!-- 地址列表 -->
<el-select v-model="selectedAddress" placeholder="请选择地址" style="width: 100%;">
<el-option v-for="address in addressList" :key="address.name" :label="address.name" :value="address"></el-option>
</el-select>
<!-- 确定和取消按钮 -->
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="confirm">确定</el-button>
</span>
</el-dialog>
```
然后,我们在组件的 `mounted` 生命周期钩子中初始化百度地图,并监听地图的点击事件:
```js
<script>
import { BMap } from 'vue-baidu-map'
export default {
components: {
BMap
},
data() {
return {
// 弹框是否可见
dialogVisible: false,
// 搜索框文本
searchText: '',
// 地址列表
addressList: [],
// 选中的地址
selectedAddress: null,
// 百度地图实例
map: null,
// 地图点击事件句柄
clickHandler: null
}
},
mounted() {
// 初始化百度地图
this.map = new BMap.Map(this.$refs.mapContainer)
this.map.centerAndZoom(new BMap.Point(116.404, 39.915), 11)
this.map.enableScrollWheelZoom(true)
// 监听地图点击事件
this.clickHandler = e => {
this.selectedAddress = {
name: '',
lng: e.point.lng,
lat: e.point.lat
}
const geoc = new BMap.Geocoder()
geoc.getLocation(e.point, (rs) => {
const addComp = rs.addressComponents
this.selectedAddress.name = addComp.province + addComp.city + addComp.district + addComp.street + addComp.streetNumber
})
}
this.map.addEventListener('click', this.clickHandler)
},
beforeDestroy() {
// 移除地图点击事件监听
if (this.clickHandler) {
this.map.removeEventListener('click', this.clickHandler)
}
},
methods: {
// 打开弹框
openDialog() {
this.dialogVisible = true
},
// 搜索地址
search() {
const local = new BMap.LocalSearch(this.map, {
onSearchComplete: (results) => {
this.addressList = results.map(result => {
const point = result.point
return {
name: result.title,
lng: point.lng,
lat: point.lat
}
})
}
})
local.search(this.searchText)
},
// 确认选择
confirm() {
if (this.selectedAddress) {
this.$emit('select', this.selectedAddress)
this.dialogVisible = false
}
}
}
}
</script>
```
最后,你可以在组件中监听弹框的 `select` 事件,获取选中的地址信息。这样,我们就实现了在百度地图上选点获取经纬度及名称的功能。
阅读全文