初識二

  • 點聚合
  • 點聚合清除
  • 批量添加marker優化
  • 批量多邊形的優化

點聚合

1.需要引入MarkerClusterer_min.js和textIconOverlay.js

<script src="js/bmap/textIconOverlay/textIconOverlay.js"></script>
<script src="js/bmap/MarkerClusterer_min.js"></script>

2.js

//初始化打點數據
var markers=[];
//初始化點聚合
var markerClusterer=new BMapLib.MarkerClusterer(page.map, {markers:markers}); 
var data=[]//數據
var markers = [];var pointslng=[]
  		data.forEach(function(item,idx){
  			var myIcon = new BMap.Icon("image/circle.png", new BMap.Size(24, 24), {
               // offset: new BMap.Size(20, 20), // 指定定位位置
                //imageOffset: new BMap.Size(0, 0) // 設置圖片偏移
            });
        	var pt=new BMap.Point(lng,lat);
  			pointslng.push(pt)
  	  		var marker=new BMap.Marker(pt,{icon:myIcon})
	  	  	marker.addEventListener('click', function (e) {
	  	      var str='<div>str</div>'
	  	      var p=new BMap.Point(e.point.lng,e.point.lat);
		      var myLabel = new BMap.Label(str,     //為lable填寫內容
		         {offset:new BMap.Size(0,0),                  //label的偏移量,為了讓label的中心顯示在點上
		         position:p});                                //label的位置
		         myLabel.setStyle({                                   //給label設置樣式,任意的CSS都是可以的
		         fontSize:"14px",               //字號
		         border:"0",                    //邊
		         textAlign:"left",            //文字水平靠左顯示
		         borderRadius:'5px',
		         color:'#fff',
		         cursor:"pointer",
		         AutoSize:"false",
		         maxWidth:'1000px',
		         backgroundColor:'rgba(0,0,0,0.7)'
		         });
		         myLabel.setZIndex(99)
		         map.addOverlay(myLabel);//把label添加到地圖上
	  	  });
 		   markers.push(marker);
  		})
  	  	//添加聚合點
		markerClusterer.addMarkers(markers)
		map.setViewport(pointslng)

點聚合清除

markerClusterer.clearMarkers();
注意:全局要先進行初始化markerClusterer

批量添加marker優化

因為項目要求剛開始必須加載所有的點,所以剛開始的數據沒辦法減少,導致移動或者縮放很卡,如果使用點聚合,因為個別點歸於接近,在18級(項目只到18級)還是顯示多個,顯示不了單個,所以目前做了2項優化:
1.接口使用gzip獲取數據(減少數據傳輸時間),然後把數據分成若干份,使用setTimeout,延遲渲染部分數據
2.點只顯示可視範圍內的
接下來主要講第二項:
1.先定義一個全局的空數組markers
var marker=[];
2.渲染全部的點(我們項目要求全部。。。)

pointData(data)
  	function pointData(data){//海量點
  		markers=[]//重新渲染需要清空
  		data.forEach(function(item,idx){
  			//logo_type 1:藍色,2:灰色,3:紅色
  			var logo='image/china_telecom.png';
  			var myIcon = new BMap.Icon(logo, new BMap.Size(16, 16));
           // myIcon.setImageSize(new BMap.Size(16, 16));這個可以修改圖片大小
        	var pt=new BMap.Point(item.lng,item.lat);
  	  		var marker=new BMap.Marker(pt,{icon:myIcon})
  	  		map.addOverlay(marker)
  	  		markers.push(marker)
	  	  	//PointClick(marker,item)//點擊事件可不寫
	  	  	//pointMouse(marker,item)//鼠標滑過事件可不寫
  		})
  	}

2.監聽縮放平移
這一部分事件來源於這位大神的文章

map.addEventListener("zoomend", function () {
    getBounds('zoomend');
 });
//地圖綁定拖拽事件
map.addEventListener('dragend', function(e){
   	getBounds('dragend');
});
/**
 * 獲取可視區域
 * @type {string} 類型
 * */
function getBounds(type){
    //函數節流
    if(getBounds.timer){
        clearTimeout(getBounds.timer);
        getBounds.timer=null;
    }
    getBounds.timer=setTimeout(function(){
        var map=page.map
        var bounds =  map.getBounds(),   //獲取可視區域
        SouthWest = bounds.getSouthWest(),   //可視區域左下角
        NorthEast = bounds.getNorthEast();   //可視區域右上角
       // console.log("當前地圖可視範圍是:" + SouthWest.lng + "," + SouthWest.lat + "到" + NorthEast.lng + "," + NorthEast.lat);
       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();
        }
        console.log('共有:'+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
    }
}

批量多邊形的優化

類似於批量點的優化