基于高德地图的描点操作,监听地图缩放,展示合理数量的marker

1.根据两点经纬度算两点之间的距离函数

function Rad(d){
       return d * Math.PI / 180.0;//经纬度转换成三角函数中度分表形式。
    }
//计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度
function GetDistance(lat1,lng1,lat2,lng2){

    var radLat1 = Rad(lat1);
    var radLat2 = Rad(lat2);
    var a = radLat1 - radLat2;
    var  b = Rad(lng1) - Rad(lng2);
    var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
    Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
    s = s *6378.137 ;// EARTH_RADIUS;
    s = Math.round(s * 10000) / 10000; //输出为公里
    //s=s.toFixed(4);
    return s;
}

2.给地图绑定监听事件

map.on("zoomchange",function(){
            for (var i = pathContentArr.length - 1; i >= 0; i--) {
                pathContentArr[i].setMap(null);
            }
            for (var i = pathMarkerArr.length - 1; i >= 0; i--) {
                pathMarkerArr[i].setMap(null);
            }
            pathMarkerArr=[];
            pathContentArr=[];
            drawMarkerByDistance(map.getZoom())
            
        })  

3.drawMarkerByDistance函数【会根据第i个点和第i+1个点之间的距离进行初步筛选,其中select函数对初步筛选出来的点进行了所有点两两之间距离的二次筛选】

function drawMarkerByDistance(zoom){
        var perDistance=0;   //当前累计公里数
        var zoom=zoom||6;
        switch (zoom){
            case 3:
                var targetDistance=800;  //km
                break;
            case 4:
                var targetDistance=400;  //km
                break;
            case 5:
                var targetDistance=200;  //km
                break;
            case 6:
                var targetDistance=120;  //km
                break;
            case 7:
                var targetDistance=60;  //km
                break;
            case 8:
                var targetDistance=30;  //km
                break;
            case 9:
                var targetDistance=15;  //km
                break;
            case 10:
                var targetDistance=7;  //km
                break;
            case 11:
                var targetDistance=4;  //km
                break;
            case 12:
                var targetDistance=1;  //km
                break;
            case 13:
                var targetDistance=0.5;  //km
                break;
            default:
                var targetDistance=0.25;  //km
        }
        var prepareToShowMarker=[];
        for (var i = 0; i < curShipPolyLineData.length; i++) {
            //第一个点和最后一个点默认展示出来,累计长度大于目标长度的画出来
            if (i==0||i==curShipPolyLineData.length-1 || (curShipPolyLineData[i].distance+perDistance)>targetDistance) {
                var marker={
                    lat:parseFloat(curShipPolyLineData[i].latitude),
                    lng:parseFloat(curShipPolyLineData[i].longitude),
                    course:curShipPolyLineData[i].course,
                    AddTime: curShipPolyLineData[i].AddTime,
                }
                prepareToShowMarker.push(marker);
            }
            if(i1){
                if ((curShipPolyLineData[i].distance+perDistance)>targetDistance) {
                    perDistance=0;
                }else{
                    perDistance+=curShipPolyLineData[i].distance;
                }
            }
        }
        
        var select=function(arr){
            var flag=true;
            for(var i=0;i0.5?arr.splice(i,1):arr.splice(j,1);
                        break;
                    }
                }
                if(flag==false){
                    break;
                }
            }
            //当数组中所有的点两两之间的距离都大于targetDistance的时候退出递归
            if (flag==false) {
                select(arr);
            }
        }
        select(prepareToShowMarker);
        for (var i = prepareToShowMarker.length - 1; i >= 0; i--) {
            var position=[prepareToShowMarker[i].lng,prepareToShowMarker[i].lat];
            var content = new AMap.Marker({
                content:prepareToShowMarker[i].AddTime,
                position: position,
                title: prepareToShowMarker[i].AddTime,
                offset:new AMap.Pixel(20,0),
                map: map
            });
            pathContentArr.push(content);
            var marker = new AMap.Marker({
                offset:new AMap.Pixel(0,0),
                icon:"new_images/arrow_r.png",
                angle:((prepareToShowMarker[i].course-90)%360),
                position: position,
                map: map
            });
            pathMarkerArr.push(marker);
        }


        
    }




你可能感兴趣的:(基于高德地图的描点操作,监听地图缩放,展示合理数量的marker)