1.main.js
import BaiduMap from 'vue-baidu-map'
Vue.use(BaiduMap, {
// 自己申请的ak码
ak: ''
})
2.组件使用
注意:css设置宽高
<template>
<div class="map-div">
<!-- 输入搜索地址 -->
<el-input v-model="value"
prefix-icon="el-icon-search"
class="search" />
<!-- 地图 -->
<baidu-map class="map"
:center="center"
:zoom="zoom"
:scroll-wheel-zoom="true"
@zoomend="onZoomEnd"
@ready="onReady">
<!-- 根据位置搜索地址 -->
<bm-local-search :keyword="value"
:panel="false"
:auto-viewport="true"></bm-local-search>
</baidu-map>
</div>
</template>
<script>
import { bd09togcj02, gcj02tobd09 } from '@/utils/methods'
export default {
props: {
form: Object,
edit: Boolean
},
data() {
return {
zoom: 15, // 地图展示级别,缩放的倍数
BMap: '', // 存储全局地图
map: '',
value: '', // 搜索的地址
center: { lng: 0, lat: 0 } // 中心点
}
},
methods: {
onReady({ BMap, map }) {
this.BMap = BMap
this.map = map
let _this = this
if (this.edit) {
this._transilateToGc(this, this.form.lng, this.form.lat)
this._addMarker(this, this.center.lng, this.center.lat)
} else {
this.value = '广州'
}
this.zoom = 15
map.setDefaultCursor('crosshair') // 改变鼠标样式
map.addEventListener('click', function (e) { // 获取经纬度
_this.value = ''
_this._transilateToGc(_this, e.point.lng, e.point.lat)
})
},
// 监听缩放时改变zoom的值
onZoomEnd(e) {
this.zoom = e.target.getZoom()
},
// 添加标注
_addMarker(_this, lng, lat) {
let BMap = this.BMap
_this.map.clearOverlays() // 清空标注
let newPoint = new BMap.Point(lng, lat)
var marker = new BMap.Marker(newPoint)// 创建标注
_this._getLocationName(BMap, newPoint)
_this.map.addOverlay(marker) // 将标注添加到地图中
marker.disableDragging()
marker.addEventListener('click', function (e) {
_this._openInfoWindow(_this, newPoint)
e.domEvent.stopPropagation()
})
},
// 根据经纬度获取详细地址
_getLocationName(BMap, newPoint) {
let _this = this
// 获取定位名称
let gc = new BMap.Geocoder() // 初始化,Geocoder类
gc.getLocation(newPoint, function (rs) { // getLocation函数用来解析地址信息,分别返回省市区街等
let addComp = rs.addressComponents
_this.form.province = addComp.province // 获取省份
_this.form.city = addComp.city // 获取城市
_this.form.county = addComp.district // 区
let street = addComp.street // 街
let streetNumber = addComp.streetNumber ? addComp.streetNumber : ''
_this.form.address = _this.form.province + _this.form.city + _this.form.county + street + streetNumber
_this._openInfoWindow(_this, newPoint)
})
},
// 打开信息窗口
_openInfoWindow(_this, newPoint) {
var opts = {
width: 250, // 信息窗口宽度
height: 80, // 信息窗口高度
title: '信息' // 信息窗口标题
}
var infoWindow = new _this.BMap.InfoWindow(_this.form.address, opts) // 创建信息窗口对象
_this.map.openInfoWindow(infoWindow, newPoint)
},
// 转成百度坐标
_transilateToBd() {
let result = gcj02tobd09(this.form.lng, this.form.lat)
this.center = { lng: result[0], lat: result[1] }
},
// 转成火星坐标
_transilateToGc(_this, lng, lat) {
let result = bd09togcj02(lng, lat)
_this.form.lng = result[0].toString()
_this.form.lat = result[1].toString()
}
}
}
</script>
火星坐标和百度地图坐标的转换
// 百度地图坐标转火星坐标
export const bd09togcj02 = (lng, lat) => {
const PI = Math.PI
var x = lng - 0.0065
var y = lat - 0.006
var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * PI)
var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * PI)
var gLng = z * Math.cos(theta)
var gLat = z * Math.sin(theta)
return [gLng, gLat]
}
// 火星转百度
export const gcj02tobd09 = (lng, lat) => {
const PI = Math.PI
var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * PI)
var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * PI)
var bLng = z * Math.cos(theta) + 0.0065
var bLat = z * Math.sin(theta) + 0.006
return [bLng, bLat]
}