百度地圖API實時畫出動態運行軌跡(一條行駛軌跡),車頭實時指向行駛方向,設置角度偏移

參考網址:https://blog.csdn.net/skywqnan/article/details/79036262javascript

改變車的方向:http://www.cnblogs.com/peixuanzhihou/p/6540086.htmlhtml

代碼以下:java

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>百度地圖的動態行駛軌跡</title>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=wIt2mDCMGWRIi2pioR8GZnfrhSKQHzLY"></script>
</head>
<body>
<div id="mapId" style="height: 500px;">
    <script>
        var map = new BMap.Map("mapId");
        map.enableScrollWheelZoom(); // 開啓鼠標滾輪縮放
        map.addControl(new BMap.ScaleControl()); // 添加比例尺控件
        // map.centerAndZoom("青島", 8);

        var PointArr = [
            {lat: 36.10339957700999, lng: 120.4207801005104},
            {lat: 36.10349055332635,lng: 120.42113539348455},
            {lat: 36.10370795896673,lng: 120.42162977768736},
            {lat: 36.10411490190429,lng: 120.42166901055167},
            {lat: 36.104232027406695,lng: 120.42185015059275},
            {lat: 36.10425620255758,lng: 120.42202022562539},
            {lat: 36.104265908631284,lng: 120.42208225102176},
            {lat: 36.104399968669526,lng: 120.42187425183421},
            {lat: 36.10452708476511,lng: 120.42076268466177},
            {lat: 36.10480132817409, lng: 120.4196557913201},
            {lat: 36.10560773716036,lng: 120.418951386886},
            {lat: 36.10621159088823,lng: 120.41900182905378},
            {lat: 36.1064641068988,lng: 120.41992809616544},
            {lat: 36.10679444086644,lng: 120.42102125032955},
            {lat: 36.107010189089046,lng: 120.42182982905027},
            {lat: 36.107014665948654,lng: 120.42193587265254},
            {lng: 120.42201589513277, lat: 36.10700627324672},
            {lng: 120.42201589513277, lat: 36.10700627324672},
            {lng: 120.42236704579075, lat: 36.10708566579729},
            {lng: 120.42269817692573, lat: 36.107201270041955},
            {lng: 120.42239277578172, lat: 36.10812797579566},
            {lng: 120.42175457671763, lat: 36.10947659586882},
            {lng: 120.42144906678747, lat: 36.11028554037044},
            {lng: 120.4213722360578, lat: 36.110547069787465},
            {lng: 120.4213722360578, lat: 36.110547069787465},
            {lng: 120.4213722360578, lat: 36.110547069787465},
            {lng: 120.4213722360578, lat: 36.110547069787465},
            {lng: 120.4213722360578, lat: 36.110547069787465},
            {lng: 120.4213722360578, lat: 36.110547069787465},
            {lng: 120.4213722360578, lat: 36.110547069787465},
            {lng: 120.4213722360578, lat: 36.110547069787465},
            {lng: 120.4213722360578, lat: 36.110547069787465},
            {lng: 120.42134433787885, lat: 36.110691285540966},
            {lng: 120.42234193234574, lat: 36.110931417305515},
            {lng: 120.42374305054953, lat: 36.11109804633305},
            {lng: 120.42478859440246, lat: 36.111102173671576},
            {lng: 120.42606467439863, lat: 36.11129314178323},
            {lng: 120.4274220550685, lat: 36.11148065963647},
            {lng: 120.42831965719076, lat: 36.111638311669736},
            {lng: 120.42839951065358, lat: 36.11164240198062},
            {lng: 120.42839951065358, lat: 36.11164240198062},
            {lng: 120.42839951065358, lat: 36.11164240198062},
            {lng: 120.42839951065358, lat: 36.11164240198062},
            {lng: 120.42839951065358, lat: 36.11164240198062},
            {lng: 120.42839951065358, lat: 36.11164240198062},
            {lng: 120.42839951065358, lat: 36.11164240198062},
            {lng: 120.42839951065358, lat: 36.11164240198062},
            {lng: 120.42869196887202, lat: 36.1116737914188},
            {lng: 120.43031048017785, lat: 36.11190642360766},
            {lng: 120.43239173942534, lat: 36.11229570404404},
            {lng: 120.43368467575368, lat: 36.11281195352835},
            {lng: 120.43371757862009, lat: 36.11284016439977},
            {lng: 120.43379230066179, lat: 36.11284161798212},
            {lng: 120.43441423254144, lat: 36.113205746094536},
            {lng: 120.43549342023326, lat: 36.11391074053337},
            {lng: 120.43637497341942, lat: 36.11441797319607},
            {lng: 120.4365024200745, lat: 36.11445405475196},
            {lng: 120.43670459776231, lat: 36.11458083085174},
            {lng: 120.43745246924915, lat: 36.11507070008782},
            {lng: 120.43821097991501, lat: 36.115416050767585},
            {lng: 120.43821097991501, lat: 36.115416050767585},
            {lng: 120.43821097991501, lat: 36.115416050767585},
            {lng: 120.43821097991501, lat: 36.115416050767585},
            {lng: 120.43821097991501, lat: 36.115416050767585},
            {lng: 120.43823585473245, lat: 36.11541929557907},
            {lng: 120.43823585473245, lat: 36.11541929557907},
            {lng: 120.43823585473245, lat: 36.11541929557907},
            {lng: 120.43823585473245, lat: 36.11541929557907},
            {lng: 120.43823585473245, lat: 36.11541929557907},
            {lng: 120.43823585473245, lat: 36.11541929557907},
            {lng: 120.43823585473245, lat: 36.11541929557907},
            {lng: 120.43859812511984, lat: 36.115583971494395},
            {lng: 120.43901701857004, lat: 36.115714318017346},
            {lng: 120.43928467292172, lat: 36.11582517772885},
            {lng: 120.43959708522435, lat: 36.115963587312805},
            {lng: 120.43986466921422, lat: 36.116047547858166},
            {lng: 120.44007952157578, lat: 36.11611896447754},
            {lng: 120.440167025596, lat: 36.11612294605039},
            {lng: 120.440167025596, lat: 36.11612294605039},
            {lng: 120.44024360205321, lat: 36.116138815526504},
            {lng: 120.44024360205321, lat: 36.116138815526504},
            {lng: 120.44024360205321, lat: 36.116138815526504},
            {lng: 120.44026150723737, lat: 36.11614702160796},
            {lng: 120.44027344364953, lat: 36.11615215895656},
            {lng: 120.44027344364953, lat: 36.11615215895656},
            {lng: 120.44028836484941, lat: 36.1161593311561},
            {lng: 120.44034209724579, lat: 36.116201960713745},
            {lng: 120.44048233691922, lat: 36.116254585044935},
            {lng: 120.44048233691922, lat: 36.116254585044935},
            {lng: 120.4405738257871, lat: 36.116276646228826},
            {lng: 120.44073595695149, lat: 36.11635856195875},
            {lng: 120.44115463412841, lat: 36.11652357056175},
            {lng: 120.44118546544034, lat: 36.11653994619434},
            {lng: 120.44118546544034, lat: 36.11653994619434},
            {lng: 120.44121529948468, lat: 36.1165533090833}];
        map.centerAndZoom(PointArr, 13);// 根據經緯度顯示地圖的範圍
        map.setViewport(PointArr);// 根據提供的地理區域或座標設置地圖視野

        addStartMarker(new BMap.Point(PointArr[0].lng, PointArr[0].lat),'起點',map);
        var carMk;//先將終點座標展現的mark對象定義
        //小車行駛圖標
        var drivingPoint = new BMap.Icon('http://developer.baidu.com/map/jsdemo/img/car.png', new BMap.Size(52,26), {
            anchor : new BMap.Size(27, 13),
            imageSize:new BMap.Size(52,26)
        });
        //終點圖標
        var terminalPoint = new BMap.Icon('endMap.png', new BMap.Size(45,45), {
            anchor : new BMap.Size(20, 45),
            imageSize:new BMap.Size(45,45)
        });
        var i = 0;
        var interval = setInterval(function () {
            if (i >= PointArr.length) {
                clearInterval(interval);
                return;
            }
            drowLine(map,PointArr[i],PointArr[i+1]);//畫線調用
            i = i + 1;
        }, 1000);

        // 劃線
        function drowLine(map,PointArr,PointArrNext) {
            if(PointArrNext!=undefined) {
                var polyline = new BMap.Polyline(
                    [
                        new BMap.Point(PointArr.lng, PointArr.lat),
                        new BMap.Point(PointArrNext.lng, PointArrNext.lat)
                    ],
                    {
                        strokeColor: "red",
                        strokeWeight: 7,
                        strokeOpacity: 1
                    });   //建立折線
                map.addOverlay(polyline);
                addMarkerEnd(new BMap.Point(PointArrNext.lng, PointArrNext.lat), '小車行駛', map, PointArrNext, new BMap.Point(PointArr.lng, PointArr.lat));//添加圖標
            }else {
                addMarkerEnd(new BMap.Point(PointArr.lng, PointArr.lat), '終點', map);//添加終點圖標
            }
        }
        //添加起始圖標
        function addStartMarker(point, name,mapInit) {
            if(name=="起點"){
                var myIcon = new BMap.Icon("startMap.png", new BMap.Size(45,45),{
                    anchor: new BMap.Size(20, 45),//這句表示圖片相對於所加的點的位置mapStart
                    imageSize:new BMap.Size(45, 45)//圖標所用的圖片的大小,此功能的做用等同於CSS中的background-size屬性。可用於實現高清屏的高清效果
                    // offset: new BMap.Size(-10, 45), // 指定定位位置
                    // imageOffset: new BMap.Size(0, 0 - 10 * 25) // 設置圖片偏移
                });
                window.marker = new BMap.Marker(point,{icon:myIcon});  // 建立標註
                mapInit.addOverlay(marker);               // 將標註添加到地圖中
                //marker.setAnimation(BMAP_ANIMATION_BOUNCE); //跳動的動畫
            }
        }
        //添加行駛和終點圖標
        function addMarkerEnd(point, name,mapInit,trackUnit,prePoint) {
            if(name=="小車行駛"){
                if(carMk){//先判斷第一次進來的時候這個值有沒有定義,有的話就清除掉上一次的。而後在進行畫圖標。第一次進來時候沒有定義也就不走這塊,直接進行畫圖標
                    mapInit.removeOverlay(carMk);
                }
                carMk = new BMap.Marker(point,{icon:drivingPoint});  // 建立標註
                carMk.setRotation(trackUnit.route);//trackUnit.route
                //getAngle(point,prePoint);// js求解兩點之間的角度
                carMk.setRotation(getAngle(point,prePoint)-90);// 旋轉的角度
                mapInit.addOverlay(carMk);               // 將標註添加到地圖中
                //carMk.setAnimation(BMAP_ANIMATION_BOUNCE); //跳動的動畫
            }else {
                mapInit.removeOverlay(carMk);
                carMk = new BMap.Marker(point,{icon:terminalPoint});  // 建立標註
                mapInit.addOverlay(carMk);
            }
        }
        //得到角度的函數
        function getAngle(n,next){
            var ret
            var w1 = n.lat/180 * Math.PI
            var j1 = n.lng/180 * Math.PI

            var w2 = next.lat/180 * Math.PI
            var j2 = next.lng/180 * Math.PI

            ret = 4 * Math.pow(Math.sin((w1 - w2) / 2), 2) - Math.pow(Math.sin((j1 - j2) / 2) * (Math.cos(w1) - Math.cos(w2)), 2);
            ret = Math.sqrt(ret);

            // var temp = Math.sin(Math.abs(j1 - j2) / 2) * (Math.cos(w1) + Math.cos(w2));
            var temp = Math.sin((j1 - j2) / 2) * (Math.cos(w1) + Math.cos(w2));
            console.log(temp)
            ret = ret/temp;

            ret = Math.atan(ret) / Math.PI * 180 ;
            ret += 90;

            // 這裏用如此臃腫的if..else是爲了斷定追蹤單個點的具體狀況,從而調整ret的值
            if(j1-j2 < 0){
                // console.log('j1<j2')
                if(w1-w2 < 0){
                    // console.log('w1<w2')
                    ret;
                }else{
                    // console.log('w1>w2')
                    ret = -ret+180;
                }
            }else{
                // console.log('j1>j2')
                if(w1-w2 < 0){
                    // console.log('w1<w2')
                    ret = 180+ret;
                }else{
                    // console.log('w1>w2')
                    ret = -ret;
                }
            }
            return ret ;
        }


    </script>
</body>
</html>

 

 

代碼中須要的2張圖片:api

相關文章
相關標籤/搜索