百度地图海量点位渲染造成卡顿问题解决

传统的地图撒点方式在数据量大的情况下势必会造成页面卡顿效果,因为通过循环点位方式去撒点他是不断在页面上添加dome元素。

就比如下面这个效果(这个通过vue-baidu-map组件来实现的,传统for添加marker效果是一样的):

<bml-marker-clusterer :averageCenter="true" :styles="clustererStyles">
				<bm-marker v-for="(item,index) in MarkerList" :key="index" :position="{lng: item.lng, lat: item.lat}"
					@click="infoWindowOpen(item)" :icon="iconFormatter(item)">
				</bm-marker>
</bml-marker-clusterer>
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 现在我们来去解决这个问题

// 我们需要这两个api来解决这个问题
<script src="https://api.map.baidu.com/api?v=3.0&&type=web&ak=你自己申请的al" type="text/javascript" charset="utf-8"></script>

// mapv
<script src="http://mapv.baidu.com/build/mapv.min.js"></script>

核心代码

initMap() {
    const vm = this
    vm.BDmap = new BMap.Map('container'); // 创建Map实例
    vm.BDmap.centerAndZoom(new BMap.Point(116.404, 39.915), 12); // 初始化地图,设置中心点坐标和地图级别
    vm.BDmap.enableScrollWheelZoom(true); // 开启鼠标滚轮缩放
    // 添加切换图层控件
    var mapType = new BMap.MapTypeControl({
        "mapTypes": [BMAP_NORMAL_MAP, BMAP_HYBRID_MAP],
        "anchor": BMAP_ANCHOR_BOTTOM_RIGHT
    });
    vm.BDmap.addControl(mapType); //2D图,卫星图
    // 设置中心点
    if (vm.MapCenter.lng) {
        var point = new BMap.Point(vm.MapCenter.lng, vm.MapCenter.lat);
        vm.BDmap.setCenter(point);
    }
    // 创建定位控件
    var locationControl = new BMap.GeolocationControl();
    vm.BDmap.addControl(locationControl);

    // 创建图标
    vm.myIcon = new BMap.Icon(
        sbld, // 图片地址
        new BMap.Size(55, 60), //视窗大小
        {
            "imageSize": new BMap.Size(55, 60), //显示图标大小(根据实际大小等比例缩放)
            "imageOffset": new BMap.Size(0, 0) // 图片相对视窗的偏移 
        }
    );
    // 存放点位信息
    var data = [];
    // 图标对象
    var image = new Image();
    image.src = sbld;
    image.onload = function() {
    vm.MarkerList.map(item => {
        data.push({
            geometry: {
                type: 'Point',
                coordinates: [item.lng, item.lat],
                dataInfo: item
            },
        icon: image
        });
    })
    var dataSet = new mapv.DataSet(data);

    var options = {
        draw: 'icon',
        methods: {
            click: function(item) {
                item ? vm.infoWindowOpen(item.geometry.dataInfo) : ""
            }
        },
        size: 50,
        width: 55,
        height: 60,
        // sx: 10,
        // sy: 10,
        // swidth: 50,
        // sheight: 50,
    }

        var mapvLayer = new mapv.baiduMapLayer(vm.BDmap, dataSet, options);
    }
}

这样我们最终实现出来效果

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值