zoukankan      html  css  js  c++  java
  • 百度地图解决加载大量点时卡顿问题

    需求如下:地图上加载上万个点。使用marker发现点太多页面会卡死,研究发现可以使用聚合及海量点实现。

    js代码如下:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1.    
    2. //聚合实现代码  
    3. function ss(markerArr){//markerArr数据库数据查询的结果  
    4.     var markers = [];   
    5.     var pt = null;    
    6.     var i = 0;    
    7.     for (; i < markerArr.length; i++) {    
    8.        pt = new BMap.Point(markerArr[i].longitude, markerArr[i].latitude);    
    9.        markers.push(new BMap.Marker(pt));    
    10.     }    
    11.     var markerClusterer = new BMapLib.MarkerClusterer(map, {markers:markers});   
    12. }  
    13.   
    14. //海量点实现代码  
    15. function sss(){  
    16.     var points = [];  // 添加海量点数据  
    17.     for (var i = 0; i < markerArr.length; i++) {  
    18.         points.push(new BMap.Point(markerArr[i].longitude, markerArr[i].latitude));  
    19.     }  
    20.     var options = {  
    21.             size: 6,  
    22.             shape: 2,  
    23.             color: '#d340c3'  
    24.         };  
    25.     basestationPointCollection = new BMap.PointCollection(points, options);  // 初始化PointCollection  
    26.     basestationPointCollection.addEventListener('click', function (e) {  
    27.           var basestationName="";//名称  
    28.           var basestationType="";//地址  
    29.           //关于自定义信息 修改json [[经度,维度,1,名称,地址,电话]]  
    30.           //循环查出值  
    31.           for (var i = 0; i < markerArr.length; i++) {  
    32.               points.push(new BMap.Point(markerArr[i].longitude,markerArr[i].latitude));  
    33.               if(markerArr[i].longitude==e.point.lng&&markerArr[i].latitude==e.point.lat){//经度==点击的,维度  
    34.                   basestationName=markerArr[i].basestationName;  
    35.                   basestationType=markerArr[i].basestationType;  
    36.                   break;  
    37.               }  
    38.           }  
    39.           var point = new BMap.Point(e.point.lng, e.point.lat);  
    40.           var opts = {  
    41.                250, // 信息窗口宽度  
    42.               height: 70, // 信息窗口高度  
    43.               title:"", // 信息窗口标题  
    44.               enableMessage: false,//设置允许信息窗发送短息  
    45.           }  
    46.           var infowindow = new BMap.InfoWindow("基站名称:"+basestationName+"<br/>基站类型:"+basestationType);  
    47.           map.openInfoWindow(infowindow, point);  
    48.       });  
    49.     map.addOverlay(basestationPointCollection);  // 添加Overlay  
    50. }  
    51.   
    52. //地图上自定义控件:自定义多选框  
    53. function showMap(){  
    54.     map = new BMap.Map("information_date",{minZoom:6,maxZoom:17}); // 创建地图实例  
    55.     if(city==""){  
    56.         map.centerAndZoom("西安",14); // 初始化地图,设置中心点坐标和地图级别。  
    57.     }else{  
    58.         map.centerAndZoom(city,14); // 初始化地图,设置中心点坐标和地图级别。  
    59.     }  
    60.     map.enableScrollWheelZoom(true); //启用滚轮放大缩小   
    61.     //向地图中添加缩放控件    
    62.     var ctrlNav = new window.BMap.NavigationControl({    
    63.         anchor: BMAP_ANCHOR_TOP_LEFT,    
    64.         type: BMAP_NAVIGATION_CONTROL_LARGE    
    65.     });    
    66.     map.addControl(ctrlNav);    
    67.       
    68.     //向地图中添加比例尺控件    
    69.     var ctrlSca = new window.BMap.ScaleControl({    
    70.         anchor: BMAP_ANCHOR_BOTTOM_LEFT    
    71.     });    
    72.     map.addControl(ctrlSca);   
    73.       
    74.      // 定义一个控件类,即function  
    75.     function ZoomControl(){  
    76.       // 默认停靠位置和偏移量  
    77.       this.defaultAnchor = BMAP_ANCHOR_TOP_RIGHT;  
    78.       this.defaultOffset = new BMap.Size(10, 10);  
    79.     }  
    80.   
    81.     // 通过JavaScript的prototype属性继承于BMap.Control  
    82.     ZoomControl.prototype = new BMap.Control();  
    83.   
    84.     // 自定义控件必须实现自己的initialize方法,并且将控件的DOM元素返回  
    85.     // 在本方法中创建个div元素作为控件的容器,并将其添加到地图容器中  
    86.     ZoomControl.prototype.initialize = function(map){  
    87.       // 创建一个DOM元素  
    88.       var div = document.createElement("div");  
    89.       var business = div.appendChild(document.createElement("input"));  
    90.       div.appendChild(document.createTextNode("营业厅信息"));  
    91.       div.appendChild(document.createElement("br"))  
    92.         
    93.       var cell = div.appendChild(document.createElement("input"));  
    94.       div.appendChild(document.createTextNode("4G工参信息"));  
    95.       div.appendChild(document.createElement("br"))  
    96.         
    97.       var basestation = div.appendChild(document.createElement("input"));  
    98.       div.appendChild(document.createTextNode("规划基站信息"));  
    99.       business.type="checkbox";  
    100.       business.name="message";  
    101.       business.id="bus"  
    102.       business.checked="checked";  
    103.       cell.type="checkbox";  
    104.       cell.name="message";  
    105.       cell.id="cel"  
    106.       cell.checked="checked";  
    107.       basestation.type="checkbox";  
    108.       basestation.name="message";  
    109.       basestation.id="bas";  
    110.       basestation.checked="checked";  
    111.             
    112.             
    113.       // 设置样式  
    114.       div.style.cursor = "pointer";  
    115. //      div.style.border = "1px solid gray";  
    116.       div.style.backgroundColor = "white";  
    117.       div.style.width='120px'  
    118.       // 绑定事件,点击一次放大两级  
    119.       business.onclick = function(e){//营业厅  
    120.          if(document.getElementById("bus").checked){//是否被选中  
    121.              showMapMessage(true,false,false);  
    122.          }else{  
    123.              showHall();   
    124.          }  
    125.       }  
    126.       cell.onclick = function(e){//4G工参  
    127.          if(document.getElementById("cel").checked){//是否被选中  
    128.              showMapMessage(false,false,true);   
    129.          }else{  
    130.              showCell();  
    131.          }  
    132.       }  
    133.       basestation.onclick = function(e){//规划基站  
    134.          if(document.getElementById("bas").checked){//是否被选中  
    135.              showMapMessage(false,true,false);   
    136.          }else{  
    137.              showBasestation();  
    138.          }  
    139.       }  
    140.       // 添加DOM元素到地图中  
    141.       map.getContainer().appendChild(div);  
    142.       // 将DOM元素返回  
    143.       return div;  
    144.     }  
    145.     // 创建控件  
    146.     var myZoomCtrl = new ZoomControl();  
    147.     // 添加到地图当中  
    148.     map.addControl(myZoomCtrl);  
    149.       
    150. }  

    jsp页面代码如下:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=密钥"></script>    
    2. <script type="text/javascript" src="http://api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay_min.js"></script>      
    3. <script type="text/javascript" src="http://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js"></script>      
    4. <script type="text/javascript">    
    5.     var path = "<%=request.getContextPath()%>";    
    6.     var hall = "<%=request.getContextPath()%>/common/my_resource/picture/hall.png";    
    7. </script>    
    8. </head>    
    9. <body style="height:100%; 100%">    
    10.       <!-- 数据div -->    
    11.       <div id="information_date" ></div>    
    12. </body>    
  • 相关阅读:
    Rust语言学习笔记(11)
    Rust语言学习笔记(10)
    Rust语言学习笔记(9)
    Rust语言学习笔记(8)
    趣味编程:静夜思(Rust版)
    Python sorted()
    Python 魔法方法
    Python filter()
    Python的map和reduce
    Python函数的参数
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317778.html
Copyright © 2011-2022 走看看