openlayer轨迹回放

话不多说直接贴代码,复制黏贴直接用
https://download.csdn.net/download/lg_696491/11317419

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>轨迹回放</title>

    <link rel="stylesheet" href="ol.css">
    <script type="text/javascript" src="ol-debug.js"></script>
    <script type="text/javascript" src="ol.js" ></script>
    <style type="text/css">
        html,body,#map{
            height: 100%;
            width: 100%;
            padding: 0px;
            margin: 0px;
            overflow: hidden;
        }
    </style>
    <script type="text/javascript">
        function init() {
            var map=new ol.Map({
                target:"map",
                layers:[
                    new ol.layer.Tile({
                    source: new ol.source.OSM()
                  })
                ],
                controls:ol.control.defaults({
                    attribution: false,
                    zoom:true
                }),
                loadTilesWhileAnimating:true,
                view:new ol.View({
                    projection:"EPSG:4326",
                    center: [116.390373,39.9078],
                    zoom: 10,
                    minZoom: 2,
                    maxZoom: 18
                })
            });

            var routeCoords=[];
            var routeCoords0=[];
            
        routeCoords0.push([116.387271,39.912501]);  
        routeCoords0.push([115.422122,40.201176]);
        routeCoords0.push([117.398258,43.904600]);
        
        var wgs84Sphere = new ol.Sphere(6378137); 
        var jiChuChangdu = wgs84Sphere.haversineDistance([116.422122, 40.201176],[116.422087, 40.200887]);
        console.log(jiChuChangdu);
            
        var count = 0;
        var startx = "";
        var starty = "";
        var endx = "";
        var endy = "";
        var avg_x= "";
        var avg_y= "";
        var val_x = "";
        var val_y = "";
        var changdu = "";
        var  da = "";
        for(var j = 0 ; j < routeCoords0.length-1; j++){
            changdu = wgs84Sphere.haversineDistance(routeCoords0[j],routeCoords0[j+1]);//计算两点之间距离
            count =  changdu / jiChuChangdu ; //共分几段
            count = count / 2 ;
            startx = routeCoords0[j][0];
            starty = routeCoords0[j][1];
            endx = routeCoords0[j+1][0];
            endy = routeCoords0[j+1][1];
            avg_x=(endx-startx)/count;
            avg_y=(endy-starty)/count;
            val_x = startx;
            val_y = starty;
            routeCoords.push(routeCoords0[j]);
            for(var i=0;i<count;i++){
                val_x += avg_x;
                val_y += avg_y;
                var val = [parseFloat(val_x.toFixed(6)),parseFloat(val_y.toFixed(6))];
                routeCoords.push(val);
            }
            routeCoords.push(routeCoords0[j+1]);
        }
        
        
        console.log(routeCoords);


            var route=new ol.geom.LineString(routeCoords);
            var routeLength=routeCoords.length;
            var routeFeature=new ol.Feature({
                type:'route',
                geometry:route
            });

            var geoMarker=new ol.Feature({
                type:'geoMarker',
                geometry:new ol.geom.Point(routeCoords[0])
            });

            var startMarker=new ol.Feature({
                type:'icon',
                geometry:new ol.geom.Point(routeCoords[0])
            });
            var endMarker=new ol.Feature({
                type:'icon',
                geometry:new ol.geom.Point(routeCoords[routeLength-1])
            });

            var styles={
                'route':new ol.style.Style({
                    stroke:new ol.style.Stroke({
                        width:6,
                        color:[237,212,0,0.8]
                    })
                }),
                
                'geoMarker':new ol.style.Style({
                    image:new ol.style.Icon({
                        anchor:[0.5,0.5],
                        scale:0.8,
                        src:'dw.png'
                    })
                })
            };

            var animating=false;
            var speed,now;
            var speedInput=document.getElementById("speed");
            var startButton=document.getElementById("start-animation");


            var vectorLayer=new ol.layer.Vector({
                source:new ol.source.Vector({
                    features:[routeFeature,geoMarker,startMarker,endMarker]
                }),
                style:function (feature) {
                   if(animating&&feature.get('type')==='geoMarker'){
                        return null;
                   }
                   return styles[feature.get('type')];
                }
            });
            map.addLayer(vectorLayer);

            var moveFeature=function (event) {
                var vectorContent=event.vectorContext;
                var frameState=event.frameState;

                if(animating){
                    //开始渲染时间 frameState.time(毫秒)
                    var elapsedTime=frameState.time-now;//运行时间
                    //增加速度跳一些索引lineString坐标
                    var index=Math.round(speed*elapsedTime/1000);//一秒等于1000毫秒 转换成秒 即索引递增
                    if(index>=routeLength){
                        stopAnimation(true);
                        return;
                    }
                    var currentPoint=new ol.geom.Point(routeCoords[index]);
                    var feature=new ol.Feature(currentPoint);
                    console.log(currentPoint);
                    console.log(feature);
                    vectorContent.drawFeature(feature,styles.geoMarker);
                }
                //告诉OpenLayers继续postcompose渲染动画
                map.render();
            }
            function startAnimation() {
                if(animating){
                    stopAnimation(false);
                }else{
                    animating=true;
                    now=new Date().getTime();//从 1970/01/01 至今已过去的时间(毫秒)
                    speed=speedInput.value;
                    startButton.textContent="取消";

                    geoMarker.setStyle(null);
                    map.getView().setCenter([116.390373,39.9078]);
                    map.on('postcompose',moveFeature);//地图渲染事件
                    map.render();
                }
            }
            
            function stopAnimation(ended) {
                animating=false;
                startButton.textContent="开始";

                var coord=ended?routeCoords[routeLength-1]:routeCoords[0];
                (geoMarker.getGeometry()).setCoordinates(coord);
                map.un('postcompose',moveFeature);
            }
            startButton.addEventListener('click',startAnimation,false);
        }
    
    </script>
</head>
<body onload="init()">
    <div id="map">
        <label for="speed">速度:<input id="speed" type="range" min="10" max="999" step="10" value="60"></label>
        <button id="start-animation">开始</button>
    </div>

</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容