Vue使用百度地图实现聚合的效果(vue-baidu-map)
- 安装插件:
yarn add vue-baidu-map
- 在
main.js
中全局引入密钥(在百度开发者中心注册):import BaiduMap from 'vue-baidu-map'
Vue.use(BaiduMap, {
ak: 'your_app_key'
})
- 代码实现:
<template>
<baidu-map id="allmap" :zoom="mapZoom" :center="mapCenter" class="allmap" :scroll-wheel-zoom="true">
</baidu-map>
</template>
<script type="text/javascript">
export default{
data() {
return {
map: null,
mapCenter:{ lng: 121.508483, lat: 31.289045 },
mapZoom:13,
},
}
mounted(){
this.getList()
this.initMap()
},
methods: {
initMap() {
const that = this
that.map = new BMapGL.Map("allmap");
that.map.centerAndZoom(new BMapGL.Point(that.mapCenter.lng, that.mapCenter.lat), 5);
that.map.enableScrollWheelZoom(true);
that.map.setMapType(BMAP_EARTH_MAP);
that.map.addEventListener("zoomend", function(e) {
var ZoomNum = that.map.getZoom();
if (ZoomNum <= 6) {
that.getqingdanList(30)
} else if (ZoomNum > 6 && ZoomNum < 10) {
that.getList(50)
} else {
that.getList(100)
}
});
},
pixelCluster(markers, distance) {
let clusters = []
for (let i = 0; i < markers.length; i++) {
let cluster = [markers[i]]
for (let j = i + 1; j < markers.length; j++) {
const pixel1 = this.map.pointToPixel(new BMapGL.Point(markers[i].lng, markers[i].lat))
const pixel2 = this.map.pointToPixel(new BMapGL.Point(markers[j].lng, markers[j].lat))
const pixelDistance = Math.sqrt(Math.pow(pixel1.x - pixel2.x, 2) + Math.pow(pixel1.y - pixel2.y, 2))
if (pixelDistance < distance) {
cluster.push(markers[j])
markers.splice(j, 1)
j--
}
}
clusters.push(cluster)
}
var myIcon = new BMapGL.Icon('src/assets/img/biaoqian.png', new BMapGL.Size(23, 25), {
anchor: new BMapGL.Size(10, 25),
});
clusters.forEach(cluster => {
const center = this.getClusterCenter(cluster)
const qingdanId = this.getClusterQingdanId(cluster)
const label = new BMapGL.Label(cluster.length, {offset: new BMapGL.Size(15, -30)})
label.setStyle({
color: "#fff",
backgroundColor: "rgba(0, 0, 0, 0.3)",
borderRadius: "10px",
padding: "0 10px",
fontSize: "14px",
lineHeight: "20px",
border :"0",
transform:'translateX(-50%)'
});
const marker = new BMapGL.Marker(center, {icon: myIcon})
marker.qingdanId = {
qingdanId: qingdanId
}
marker.myId = "shouyetubiao";
marker.setLabel(label)
this.map.addOverlay(marker)
})
},
getClusterCenter(cluster) {
let totalLng = 0
let totalLat = 0
cluster.forEach(marker => {
totalLng += parseFloat(marker.lng)
totalLat += parseFloat(marker.lat)
})
const centerLng = totalLng / cluster.length
const centerLat = totalLat / cluster.length
return new BMapGL.Point(centerLng, centerLat)
},
getClusterQingdanId(cluster) {
let qingdanId = null;
cluster.forEach(marker => {
qingdanId = marker.qingdanId
})
return qingdanId
},
getqingdanList(xiangsu) {
if (this.map != null && this.map.getOverlays() != null && this.map.getOverlays().length > 0) {
this.removeOverlayById("shouyetubiao")
}
this.$http({
url: this.$http.adornUrl('/qingdan/list'),
method: 'get',
}).then(({data}) => {
if (data.code === 0) {
this.qingdanList = data.qingdanList
}
})
this.pixelCluster(this.qingdanList, xiangsu)
},
removeOverlayById(id) {
var overlays = this.map.getOverlays();
overlays.forEach(overlay => {
if(overlay.myId === id) {
this.map.removeOverlay(overlay)
}
});
},
}
}
</script>