百度地图解决加载大量点时卡顿问题

来源:互联网 发布:角色扮演手游 知乎 编辑:程序博客网 时间:2024/05/17 22:17

需求如下:地图上加载上万个点。使用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.               width: 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%; width:100%">    
  10.       <!-- 数据div -->    
  11.       <div id="information_date" ></div>    
  12. </body>    
0 0
原创粉丝点击