• 百度地图Marker优化方案


    简介

    在使用百度地图的时候,我们需要在地图上增加标注Marker来展示设置信息。随着用户需要不断增多,加载更多的Marker标注信息成为了一种奢望。然而通过自己技术的提升,归结出来了一下方案。

    引入百度地图

    需要在百度http://lbsyun.baidu.com/index.php?title=jspopular注册为开发者。此过程略过...

    <head>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你申请的密钥"></script>
    </head>

    在页面HTML 的<head>里引入百度提供的s

    实例化地图

    在body中创建div

    <body>
        <div id="allmap" style="height: 550px;"></div>
        <script type="text/javascript">
                // 百度地图API功能
                var map = new BMap.Map("allmap", { enableMapClick: false });//实例化百度地图
                map.centerAndZoom(new BMap.Point(116.404, 39.915), 5);//设置中心点位与缩放级别
                map.enableScrollWheelZoom();//启用滚动
        </script>
    </body>

    这样就打开HTML就可以看到页面中引入的百度地图了。

    在地图中创建Marker

    // 百度地图API功能
    var map = new BMap.Map("allmap", { enableMapClick: false });//实例化百度地图
    map.centerAndZoom(new BMap.Point(116.404, 39.915), 5);//设置中心点位与缩放级别
    map.enableScrollWheelZoom();//启用滚动
    var pt = null,//点位
        i = 0,//
        mark=null;//新标注
    for(; i < 10; i++) {
        pt = new BMap.Point(Math.random() * 40 + 85, Math.random() * 30 + 21);//随机实例point
        mark=new BMap.Marker(pt);//实例marker
        map.addOverlay(mark);//添加到地图上
    };

    现在地图上就会有10Marker标注

    给地图绑定拖拽and缩放事件

    //地图绑定拖拽事件
    map.addEventListener('dragend', function(e){
        console.log('拖拽事件');
    });
    //地图绑定滚动事件
    map.addEventListener('zoomend', function(e){
        console.log('缩放事件');
    });

    这样的话当地图缩放,或者拖拽时候就可以加载数据marker

    获取可视区域

    获取到可视区域就可以根据当前可视区域显示maker数据。这样避免不必要的marker显示出来。

    var bounds =  map.getBounds(),   //获取可视区域
    SouthWest = bounds.getSouthWest(),   //可视区域左下角
    NorthEast = bounds.getNorthEast();   //可视区域右上角
    console.log("当前地图可视范围是:" + SouthWest.lng + "," + SouthWest.lat + "到" + NorthEast.lng + "," + NorthEast.lat);            

    获取我们再次请求数据的时候,判断当前marker是否存在,存在则不添加。这样的话就会提升很大的速度。

    最终案例

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>marker--标注点位优化方案</title>
            <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=E06eb9d756d0eafc722effb355657b4c"></script>
        
        </head>
        <body>
            <div id="allmap" style="height: 550px;"></div>
            <p id='conunt'></p>
            <script type="text/javascript">
                // 百度地图API功能
                var map = new BMap.Map("allmap", { enableMapClick: false });//实例化百度地图
                map.centerAndZoom(new BMap.Point(116.404, 39.915), 5);//设置中心点位与缩放级别
                map.enableScrollWheelZoom();//启用滚动
                
                var markers = [];//所有marker标注集合
                
                //console.log(markers);
    
                //地图绑定拖拽事件
                map.addEventListener('dragend', function(e){
                    getBounds('dragend');
                });
                //地图绑定滚动事件
                map.addEventListener('zoomend', function(e){
                    getBounds('zoomend');
                });
                /**
                 * 获取可视区域
                 * @type {string} 类型
                 * */
                function getBounds(type){
                    //函数节流
                    if(getBounds.timer){
                        clearTimeout(getBounds.timer);
                        getBounds.timer=null;
                    }
                    getBounds.timer=setTimeout(function(){
                        //如果超过2000则不加载
                        if(markers.length>=1000){
                        }else{
                            addMarker(100);//加载500个marker
                        }
                        var bounds =  map.getBounds(),   //获取可视区域
                        SouthWest = bounds.getSouthWest(),   //可视区域左下角
                        NorthEast = bounds.getNorthEast();   //可视区域右上角
                        console.log("当前地图可视范围是:" + SouthWest.lng + "," + SouthWest.lat + "到" + NorthEast.lng + "," + NorthEast.lat);
                        //处理显示与隐藏的marker
                        var data=boundsShow(SouthWest.lng,NorthEast.lng,SouthWest.lat,NorthEast.lat);
                        
                        //把不在可视区域的maker隐藏起来
                        for(var i=0,lengths=data.listhide.length;i<lengths;i++){
                            data.listhide[i].hide();
                        }
                        dom.innerText='共有:'+markers.length+'个点位,显示:'+data.listshow.length+'个点位';//设置地图上的marker数量
                    },200);
                    
                }
                /**
                 * 在可视区域显示,不在可视区域隐藏
                 * @smlng {number} 小 经度
                 * @bglng {number} 大 经度
                 * @smlat {number} 小纬度
                 * @bglat {number} 大纬度
                 * 
                 * return 返回显示的数量与隐藏的数量
                 * */
                function boundsShow(smlng,bglng,smlat,bglat){
                    var listhide=[],//隐藏的数据
                        listshow=[];//显示的数据
                    for(var i=0,lengths=markers.length;i<lengths;i++){
                        var _point=markers[i].point;
                        //如果marker的经度 小于可视范围的最大经度大于可视范围的最小经度--
                        //并且marker的纬度 小于可是范围的最大纬度大于可视范围的最小纬度--则需要显示
                        if(smlng<_point.lng && _point.lng<bglng && smlat<_point.lat && _point.lat < bglat){
                            //显示
                            listshow.push(markers[i]);
                            //如果之前被隐藏则显示
                            if(!markers[i].isVisible()){
                                markers[i].show();
                            }
                        }else{
                            //不显示
                            listhide.push(markers[i]);
                        }
                    }
                    //返回显示的数量与隐藏的数量
                    return{
                        listshow:listshow,
                        listhide:listhide
                    }
                }
                
                
                /**
                 * 新增marker
                 * @MAX {number} 数量
                 * */
                function addMarker(MAX){
                    dliags(true,'加载中...');
                
                    var pt = null,//点位
                        i = 0,//
                        mark=null;//新标注
                    for(; i < MAX; i++) {
                        pt = new BMap.Point(Math.random() * 40 + 85, Math.random() * 30 + 21);//随机实例point
                        mark=new BMap.Marker(pt);//实例marker
                        map.addOverlay(mark);//添加到地图上
                        markers.push(mark);//存储到数组中
                    };
                    //等待绘制引擎渲染完毕再清楚弹出层
                    setTimeout(function(){
                        dliags(false);
                    },0);
                }
                
                
                
                /**
                 * 弹出层
                 * @state {Boolean}  true:显示  or  false:隐藏
                 * @txt {string} 显示文字
                 * */
                function dliag(){
                    var dom=null;
                    return function(state,txt){
                        var dlog=null,p=null;
                        //如果为 true:显示
                        if(state){
                            if(dom){
                                document.body.appendChild(dom);
                            }else{
                                p=document.createElement('p');
                                p.innerText=txt;
                                p.style.width='100px';
                                p.style.height='45px';
                                p.style.textAlign='center';
                                p.style.position='absolute';
                                p.style.margin='auto';
                                p.style.zIndex='2';
                                p.style.left='0';
                                p.style.right='0';
                                p.style.bottom='0';
                                p.style.top='0';
                                p.style.backgroundColor='#F2F2F2';
                                p.style.lineHeight='45px';
                                p.style.borderRadius='5px';
                                
                                dlog=document.createElement('div');
                                dlog.style.position='absolute';
                                dlog.style.zIndex='1';
                                dlog.style.margin='auto';
                                dlog.style.left='0';
                                dlog.style.right='0';
                                dlog.style.bottom='0';
                                dlog.style.top='0';
                                dlog.style.backgroundColor='#000';
                                dlog.style.opacity='0.6';
                                
                                dom=document.createElement('div');
                                dom.appendChild(dlog);
                                dom.appendChild(p);
                                document.body.appendChild(dom);
                            }
                        }else{
                            document.body.removeChild(dom);
                        }
                    }
                }
                //弹出框
                var dliags=dliag();
                //添加marker
                addMarker(100);
                //获取conunt
                var dom=document.getElementById('conunt');
                //设置显示数量
                dom.innerText='共有:'+markers.length+'个点位,显示:'+markers.length;
            </script>
        </body>
    </html>

    参考链接   demo

    总结

    在使用百度地图的时候,有时候会被百度地图限制 但是我们能优化的也只有js,能够让地图少渲染浏览器少绘制,就会把性能提升到最大化

  • 相关阅读:
    java工程中如何连接redis数据库?
    linux启动达梦数据库
    Maven项目无法编译resources文件夹下资源
    java 后端定义的大写字段传到前端后变成小写
    springboot同时接收表单数据和文件
    java:Fastjson将object转为json时"$ref"的相关问题
    consul注册中心搭建
    maven-compiler-plugin 插件详解
    org.activiti.api.runtime.shared.UnprocessableEntityException
    https配置
  • 原文地址:https://www.cnblogs.com/xiaoxiaokun/p/7660982.html
Copyright © 2020-2023  润新知