放弃openlayers3自带轨迹回放效果、H5实现完美实现

1直感觉OL3的轨迹回放使用度不高,在点的数量变少的时候开始跳动,很不唯美,,所以结合百度路数的开放源代码实现轨迹回放的完美滑动,如下图:

附上代码(代码复制即可运行

<!DOCTYPE html>
<html>
  <head>
    <title>Accessible Map</title>
    <link rel="stylesheet" href="https://openlayers.org/en/v3.19.1/css/ol.css" type="text/css">
    <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
     <!--  <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script> //如果要支持低版本浏览器你可以取消注释-->
    <script src="https://openlayers.org/en/v3.19.1/build/ol.js"></script>
    <style>
      a.skiplink {
        position: absolute;
        clip: rect(1px, 1px, 1px, 1px);
        padding: 0;
        border: 0;
        height: 1px;
        width: 1px;
        overflow: hidden;
      }
      a.skiplink:focus {
        clip: auto;
        height: auto;
        width: auto;
        background-color: #fff;
        padding: 0.3em;
      }
      #map:focus {
        outline: #4A74A8 solid 0.15em;
      }
    </style>
  </head>
  <body>
    <a class="skiplink" href="#map">Go to map</a>
    <div id="map" class="map" tabindex="0"></div>
    <button id="zoom-out">Zoom out</button>
    <button id="zoom-in">Zoom in</button>
    <script>


        var _map;
 
        function lu_LngLat(lng, lat) {
        //如果有坐标偏移,你可以在这做
               var lnglat = { "lng": lng, "lat": lat };
            
            //经纬度坐标转换到高斯坐标
            return ol.proj.fromLonLat([lnglat.lng, lnglat.lat]);
        }
        //------------------------------//
      
        /**
        * 轨迹回放
       
        * @constructor
        */
        function lu_LocusOption(data) {
            this.locusData = {
                locusId: null,
                label: null,
                icon: "http://webapi.amap.com/images/car.png",
                lnglat: [],
                lineType: "solid",
                lineWidth: 3,
                nodeIcon: null,
                lineOpacity: 0.6,
                lineColor: "#0000ff"
            }

            this.locusState = {
                moveSpeed: 100,
                isSetView: true,
                syncEvent: null,
                circlable: false,
                overlayEvent: null
            }
            if (data) {
                if (data.locusData) {
                    if (data.locusData.locusId) this.locusData.locusId = data.locusData.locusId;
                    if (data.locusData.icon) this.locusData.icon = data.locusData.icon;
                    if (data.locusData.label) this.locusData.label = data.locusData.label;
                    if (data.locusData.lnglat) this.locusData.lnglat = data.locusData.lnglat;
                    if (data.locusData.lineType) this.locusData.lineType = data.locusData.lineType;
                    if (data.locusData.nodeIcon) this.locusData.nodeIcon = data.locusData.nodeIcon;
                    if (data.locusData.lineWidth) this.locusData.lineWidth = data.locusData.lineWidth;
                    if (data.locusData.lineColor) this.locusData.lineColor = data.locusData.locusData.lineColor;
                    if (data.locusState) {
                        if (data.locusState.moveSpeed) this.locusState.moveSpeed = data.locusState.moveSpeed;
                        if (data.locusState.isSetView != undefined) this.locusState.isSetView = data.locusState.isSetView;
                        if (data.locusState.syncEvent) this.locusState.syncEvent = data.locusState.syncEvent;
                        if (data.locusState.circlable != undefined) this.locusState.circlable = data.locusState.circlable;
                        if (data.locusState.overlayEvent) this.locusState.overlayEvent = data.locusState.overlayEvent;
                    }
                }
            }
        }


        var _lu_locus;
        var lu_MoveLocus = function(LocusOption, isfor) {
            if (_lu_locus) {
                _lu_locus.stop();
            }
            try {

                var _locusState = LocusOption.locusState;
                var _locusData = LocusOption.locusData;
                if (_locusState.isClearOverlay) {
                    //清空
                }
              
                lu_DrawLinesAndMarkers(_locusData, _locusState);

                //开启路书
                _lu_locus = new TYMapLib.lu_track(_map, _locusData.lnglat, {
                    defaultContent: _locusData.label,
                    autoView: _locusState.isSetView, //是否开启自动视野调整,如果开启那么路书在运动过程中会根据视野自动调整
                    speed: _locusState.moveSpeed,
                    enableRotation: true, //是否设置marker随着道路的走向进行旋转
                    circlable: _locusState.circlable
                });

            } catch (e) {
                console.log(e.message);
            }
        }

        function lu_DrawLinesAndMarkers(locusData, _locusState) {
            if (locusData) {
                if (locusData.nodeIcon) image = locusData.nodeIcon;
                if (locusData.label) text = locusData.label.content;
                if (locusData.label) offset = locusData.label.offset;
            }
          
            var styles = {
                'route': new ol.style.Style({
                    stroke: new ol.style.Stroke({
                        width: 2, color: [237, 212, 0, 0.8]
                    })
                }),
                'node': new ol.style.Style({
                    image: new ol.style.Circle({
                        radius: 5,
                        stroke: new ol.style.Stroke({
                            color: "#ffffff",
                            width: 2
                        }),
                        fill: new ol.style.Fill({
                            color: "#000000"
                        })
                    })
                }),
                'icon1': new ol.style.Style({
                    image: new ol.style.Icon({
                        anchor: [0.5, 1],
                        src: image
                    }),
                    text: new ol.style.Text({
                        font: "13px Microsoft Yahei",
                        text: "起点",
                        fill: new ol.style.Fill({
                            color: "#aa3300"
                        }),
                        stroke: new ol.style.Stroke({ color: "#fff", width: 2 }),
                        textAlign: "left"
                    })
                }),
                'icon2': new ol.style.Style({
                    image: new ol.style.Icon({
                        anchor: [0.5, 1],
                        src: image
                    }),
                    text: new ol.style.Text({
                        font: "13px Microsoft Yahei",
                        text: "终点",
                        fill: new ol.style.Fill({
                            color: "#aa3300"
                        }),
                        stroke: new ol.style.Stroke({ color: "#fff", width: 2 }),
                        textAlign: "left"
                    })
                }),
                'geoMarker': new ol.style.Style({
                    image: new ol.style.Icon({
                        anchor: [0.5, 0.5],
                        rotation: 0,
                        size: [52, 26],
                        src: 'http://webapi.amap.com/images/car.png'
                    }),
                    text: new ol.style.Text({
                        font: "13px Microsoft Yahei",
                        text: text,
                        fill: new ol.style.Fill({
                            color: "#aa3300"
                        }),
                        stroke: new ol.style.Stroke({ color: "#fff", width: 2 }),
                        offsetX: offset[0],
                        offsetY: offset[1],
                        textAlign: "left"
                    })
                })
            };

            var locussff = [], star, stop;
            var style = new ol.style.Style({
                stroke: new ol.style.Stroke({
                    width: 5,
                    color: [237, 212, 0, 0.8]
                })
            });
            var lineFeature = new ol.Feature(new ol.geom.LineString(locusData.lnglat));
            lineFeature.setId(locusData.locusId);
            lineFeature.setStyle(style);
            locussff.push(lineFeature);

            //节点打印
            var arrLngLat = locusData.lnglat;

            var arrX = [], arrY = [];
            for (var i in arrLngLat) {
                //console.log(i)
                if (i > 0 && i < arrLngLat.length - 1) {
                    var nodeMarker = new ol.Feature({
                        type: 'node',
                        geometry: new ol.geom.Point(locusData.lnglat[i])
                    });
                    locussff.push(nodeMarker);
                } else {
                    if (i == 0) {
                        var starMarker = new ol.Feature({
                        type: 'node',
                            geometry: new ol.geom.Point(arrLngLat[i])
                        });
                        locussff.push(starMarker);
                    } else if (i == arrLngLat.length - 1) {
                        var startMarker = new ol.Feature({
                        type: 'node',
                            geometry: new ol.geom.Point(arrLngLat[i])
                        });
                        locussff.push(startMarker);
                    }
                }
                arrX.push(arrLngLat[i][0]);
                arrY.push(arrLngLat[i][1]);
            }

            var routeCoords = arrLngLat;
            var routeLength = arrLngLat.length;

            var vectorLayer = new ol.layer.Vector({
                zIndex: 50000,
                source: new ol.source.Vector({
                    features: locussff
                }),
                style: function(feature) {
                    // hide geoMarker if animation is active
                    if (feature.get('type') === 'geoMarker') return null;
                    return styles[feature.get('type')];
                }
            });

            _map.addLayer(vectorLayer);

            //标题
            var mp2 = document.createElement("div");
            mp2.id = "mycar_title";
            mp2.innerHTML = text;

            var title = new ol.Overlay({
                id: "_ty_lj_key_title",
                //autoPan: true,
                position: [arrX[0][0], arrY[0][1]],
                stopEvent: false,
                offset: offset,
                positioning: "bottom-left",
                element: mp2
            });
            _map.addOverlay(title);

            //视野
            _lu_box(arrX, arrY);
            /**
            * 获取最好视野
            * @param __boxX
            * @param __boxY
            * @author luwenjun 2016-9-22
            * @returns
            */
            function _lu_box(__boxX, __boxY) {
                try {
                    var sort1 = [__boxX.sort()[0], __boxX.sort()[__boxX.sort().length - 1]];
                    var sort2 = [__boxY.sort()[0], __boxY.sort()[__boxY.sort().length - 1]];
                    _map.getView().fit([sort1[0], sort2[0], sort1[1], sort2[1]], _map.getSize());
                } catch (e) {
                    console.log(e.message);
                }
            }

            //添加事件
            if (_locusState.overlayEvent) {
                var keys__ = _map.on(_locusState.overlayEvent.mouseEvent, function(evt) {
                    var feature = _map.forEachFeatureAtPixel(evt.pixel,
                            function(feature) {
                                return feature;
                            });
                    if (feature) {
                        var mkNew = new Object();
                        var coord = feature.getGeometry().getCoordinates();
                        var newcoord = new GPSLngLat(coord[0], coord[1]);
                        mkNew.lng = newcoord.GPSLng;
                        mkNew.lat = newcoord.GPSLat;

                        _locusState.overlayEvent.mouseFunc(mkNew);
                    }
                });
                _ty_point.push(keys__);
            }
        }

        function TYCar(lnglat, config) {
            var mp = document.createElement("div");
            mp.id = "mymovecar";
            mp.style.position = "absolute";

            var mimg = document.createElement("img");
            if (config.icon) mimg.src = config.icon;
            mp.appendChild(mimg);

            var TYMarker = new ol.Overlay({
                id: "_ty_lj_key_car",
                stopEvent: false,
                offset: [-26, -13],
                positioning: "center-center",
                element: mp
            });

            TYMarker.setPosition(lnglat);
            //console.log(config);
            TYMarker.setRotation = function(a) {
                if (!isNaN(a)) {
                    if (a <= 360 && a >= 0) {
                        var x = document.getElementById("mymovecar");
                        x.style.transform = "rotate(" + a + "deg)";
                    }
                }
            }

            return TYMarker;
        }

        /**
        * @namespace BMap的所有library类均放在TYMapLib命名空间下
        */
        var TYMapLib = window.TYMapLib = TYMapLib || {};
        (function() {
            /**
            * @exports lu_track as TYMapLib.lu_track
            */
            var lu_track =
                    TYMapLib.lu_track = function(map, path, opts) {
                        if (!path || path.length < 1) {
                            return;
                        }
                        this.ismove = false;
                        this._cc = 0;
                        this._map = map;
                        //存储一条路线
                        this._path = path;
                        //移动到当前点的索引
                        this.i = 0;
                        //控制暂停后开始移动的队列的数组
                        this._setTimeoutQuene = [];
                        //进行坐标转换的类
                        // this._projection = this._map.getMapType().getProjection();
                        this._opts = {
                            icon: null,
                            //默认速度 米/秒
                            speed: 400,
                            defaultContent: ''
                        };
                        this._setOptions(opts);
                        this._rotation = 0; //小车转动的角度

                        //如果不是默认实例,则使用默认的icon  instanceof BMap.Icon
                        if (!this._opts.icon) {
                            this._opts.icon = "http://webapi.amap.com/images/car.png";
                        }

                    }
            /**
            * 根据用户输入的opts,修改默认参数_opts
            * @param {Json Object} opts 用户输入的修改参数.
            * @return 无返回值.
            */
            lu_track.prototype._setOptions = function(opts) {
                if (!opts) {
                    return;
                }
                for (var p in opts) {
                    if (opts.hasOwnProperty(p)) {
                        this._opts[p] = opts[p];
                    }
                }
            }

            /**
            * @description 开始运动
            * @param none
            * @return 无返回值.
            *
            * @example <b>参考示例:</b><br />
            * lu_track.start();
            */
            lu_track.prototype.start = function() {
                this.ismove = true;
                var me = this, len = me._path.length;

                //不是第一次点击开始,并且小车还没到达终点
                if (me.i && me.i < len - 1) {
                    //没按pause再按start不做处理
                    if (!me._fromPause) {
                        return;
                    } else if (!me._fromStop) {
                        //按了pause按钮,并且再按start,直接移动到下一点
                        //并且此过程中,没有按stop按钮
                        //防止先stop,再pause,然后连续不停的start的异常
                        me._moveNext(++me.i);

                    }
                } else {
                    //第一次点击开始,或者点了stop之后点开始
                    me._addMarker();
                    //等待marker动画完毕再加载infowindow
                    me._timeoutFlag = setTimeout(function() {
                        //弹出窗口
                        //me._addInfoWin();
                        if (me._opts.defaultContent == "") {
                            //  me.hideInfoWindow();
                        }
                        me._moveNext(me.i);
                    }, 400);
                }
                //重置状态
                this._fromPause = false;
                this._fromStop = false;
            },
            /**
            * 结束运动
            * @return 无返回值.
            *
            * @example <b>参考示例:</b><br />
            * lu_track.stop();
            */
                    lu_track.prototype.stop = function() {
                        this.ismove = false;
                        this.i = 0;
                        this._fromStop = true;
                        clearInterval(this._intervalFlag);
                        this._clearTimeout();
                        //重置landmark里边的poi为未显示状态
                        /*  for (var i = 0, t = this._opts.landmarkPois, len = t.length; i < len; i++) {
                        t[i].bShow = false;
                        }*/
                    };
            /**
            * 暂停运动
            * @return 无返回值.
            */
            lu_track.prototype.pause = function() {

                clearInterval(this._intervalFlag);

                //标识是否是按过pause按钮
                this._fromPause = true;
                this._clearTimeout();
            };
            /**
            * 隐藏上方overlay
            * @return 无返回值.
            *
            * @example <b>参考示例:</b><br />
            * lu_track.hideInfoWindow();
            */
            lu_track.prototype.hideInfoWindow = function() {
                this._overlay._div.style.visibility = 'hidden';
            };
            /**
            * 显示上方overlay
            * @return 无返回值.
            *
            * @example <b>参考示例:</b><br />
            * lu_track.showInfoWindow();
            */

            lu_track.prototype.showInfoWindow = function() {
                this._overlay._div.style.visibility = 'visible';
            };


            //lu_track私有方法
          
            /**
            * 添加marker到地图上
            * @param {Function} 回调函数.
            * @return 无返回值.
            */
            lu_track.prototype._addMarker = function(callback) {
                if (this._marker) {
                    this.stop();
                    this._marker.setMap(null);

                    clearTimeout(this._timeoutFlag);
                }
                //移除之前的overlay
                this._overlay && this._overlay.setMap(null);
                var marker = new TYCar(this._path[0], this._opts);
                //this._opts.icon && marker.setIcon(this._opts.icon);


                // this._opts.icon && marker.setIcon(this._opts.icon);
                _map.addOverlay(marker);
               
                //if (this._opts.defaultContent && this._opts.defaultContent != "")
                this._marker = marker;


                // var adiv = this._marker.getIcon().containerDiv;
                //adiv.innerHTML = adiv.innerHTML + "<br/>" + this._opts.defaultContent;


            },
            /**
            * 添加上方overlay
            * @return 无返回值. 暂时无用
            */
                    lu_track.prototype._addInfoWin = function() {
                        var me = this;
                        //if(me._opts.defaultContent!== ""){
                        var overlay = new CustomOverlay(me._marker.getLngLat(), me._opts.defaultContent);

                        //将当前类的引用传给overlay。
                        overlay.setRelatedClass(this);
                        this._overlay = overlay;
                        this._map.TYaddOverLay(overlay);

                        //}

                    },

            /**
            * 计算两点间的距离
            * @param {Point} poi 经纬度坐标A点.
            * @param {Point} poi 经纬度坐标B点.
            * @return 无返回值.
            */
                    lu_track.prototype._getDistance = function(pxA, pxB) {
                        return formatLength([pxA, pxB])
                    },
            //目标点的  当前的步长,position,总的步长,动画效果,回调
            /**
            * 移动小车
            * @param {Number} poi 当前的步长.
            * @param {Point} initPos 经纬度坐标初始点.
            * @param {Point} targetPos 经纬度坐标目标点.
            * @param {Function} effect 缓动效果.
            * @return 无返回值.
            */
                    lu_track.prototype._move = function(initPos, targetPos, effect, currentCount) {
                        var me = this;
                        me.ismove = true;
                        //当前的帧数
                        if (!currentCount)
                            currentCount = 0;
                        //步长,米/秒
                        var timer = 10,
                                step = this._opts.speed / (1000 / timer),
                        //初始坐标
                                init_pos = this._map.getPixelFromCoordinate(initPos),
                        //获取结束点的(x,y)坐标
                                target_pos = this._map.getPixelFromCoordinate(targetPos),
                        //总的步长
                                count = Math.round(me._getDistance(init_pos, target_pos) / step);

                        //如果小于1直接移动到下一点
                        if (count < 1) {
                            me._moveNext(++me.i);
                            return;
                        }
                        //两点之间匀速移动 setInterval
                        me._intervalFlag = setInterval(function() {
                            //两点之间当前帧数大于总帧数的时候,则说明已经完成移动
                            if (currentCount >= count) {
                                clearInterval(me._intervalFlag);
                                //移动的点已经超过总的长度
                                if (me.i > me._path.length) {
                                    return;
                                }
                                //运行下一个点
                                me._moveNext(++me.i);
                            } else {
                                currentCount++;
                                me._cc = currentCount;
                                var x = effect(init_pos[0], target_pos[0], currentCount, count),
                                        y = effect(init_pos[1], target_pos[1], currentCount, count),
                                        pos = me._map.getCoordinateFromPixel([x, y]);
                                //console.log(pos);
                                //设置marker
                                if (currentCount == 1) {
                                    var proPos = null;
                                    if (me.i - 1 >= 0) {
                                        proPos = me._path[me.i - 1];
                                    }
                                    if (me._opts.enableRotation == true) {
                                        me.setRotation(proPos, initPos, targetPos);
                                    }
                                    if (me._opts.autoView) {

                                    }
                                }

                                var extent = _map.getView().calculateExtent(_map.getSize());
                                var bl = ol.extent.getBottomLeft(extent);
                                var tr = ol.extent.getTopRight(extent);
                                var bb = ol.extent.containsCoordinate([bl[0], bl[1], tr[0], tr[1]], pos);

                                //移动中的label
                                var overs = _map.getOverlayById("_ty_lj_key_title");
                                overs.setPosition(pos);

                                if (!bb) {
                                    if (me._opts.autoView) {
                                        clearInterval(me._intervalFlag);
                                        _map.getView().setCenter(pos);
                                        me._move(initPos, targetPos, me._tween.linear);
                                    } else {
                                        me._marker.setPosition(pos);
                                    }
                                } else {
                                    me._marker.setPosition(pos);
                                }
                            }
                        }, timer);
                    },

            /**
            *在每个点的真实步骤中设置小车转动的角度
            */
                    lu_track.prototype.setRotation = function(prePos, curPos, targetPos) {
                        //console.log(prePos);console.log(curPos);

                        var me = this;

                        curPos = me._map.getPixelFromCoordinate(curPos);
                        targetPos = me._map.getPixelFromCoordinate(targetPos);

                        curPos = { x: curPos[0], y: curPos[1] };
                        targetPos = { x: targetPos[0], y: targetPos[1] }

                        var x = Math.abs(targetPos.x - curPos.x);
                        var y = Math.abs(targetPos.y - curPos.y);
                        var z = Math.sqrt(x * x + y * y);
                        var ration = Math.round((Math.asin(y / z) / Math.PI * 180));
                        var a = 0;
                        if (targetPos.y < curPos.y && targetPos.x == curPos.x) {
                            a = 270; // (180 - ration);
                        }
                        else if (targetPos.y > curPos.y && targetPos.x == curPos.x)
                            a = 90///ration;
                        else if (targetPos.y == curPos.y && targetPos.x < curPos.x)
                            a = 180//(180 - ration);
                        else if (targetPos.y == curPos.y && targetPos.x > curPos.x)
                            a = 0//ration;
                        else if (targetPos.y > curPos.y && targetPos.x > curPos.x)
                            a = ration;
                        else if (targetPos.y > curPos.y && targetPos.x < curPos.x)
                            a = 180 - ration;
                        else if (targetPos.y < curPos.y && targetPos.x < curPos.x)
                            a = 180 + ration;
                        else if (targetPos.y < curPos.y && targetPos.x > curPos.x)
                            a = 360 - ration;
                        this._marker.setRotation(a);
                        //console.log(a)
                        return;

                    },

                    lu_track.prototype.linePixellength = function(from, to) {
                        return Math.sqrt(Math.abs(from.x - to.x) * Math.abs(from.x - to.x) + Math.abs(from.y - to.y) * Math.abs(from.y - to.y));

                    },
                    lu_track.prototype.pointToPoint = function(from, to) {
                        return Math.abs(from.x - to.x) * Math.abs(from.x - to.x) + Math.abs(from.y - to.y) * Math.abs(from.y - to.y)
                    },

            /**
            * 移动到下一个点
            * @param {Number} index 当前点的索引.
            * @return 无返回值.
            */
                    lu_track.prototype._moveNext = function(index) {
                        this.ismove = true;
                        if (this._opts.func && this._opts.func != "")
                            _opts.func(index);
                        var me = this;
                        if (index == me._path.length - 1 && me._opts.circlable) {
                            index = 0;
                            me.i = 0;
                        }
                        if (index < this._path.length - 1) {
                            //判断是否需要屏幕暂停,移动中心
                            var ifXYZ1 = me._path[index];
                            var ifXYZ2 = me._path[index + 1];

                            var extent = _map.getView().calculateExtent(_map.getSize());

                            var bl = ol.extent.getBottomLeft(extent);
                            var tr = ol.extent.getTopRight(extent);

                            tr = [_map.getPixelFromCoordinate(tr)[0] - 30, _map.getPixelFromCoordinate(tr)[1] + 30];
                            bl = [_map.getPixelFromCoordinate(bl)[0] + 30, _map.getPixelFromCoordinate(tr)[1] - 30];

                            tr = _map.getCoordinateFromPixel(tr);
                            bl = _map.getCoordinateFromPixel(bl);

                            var extentA = ol.extent.containsCoordinate([bl[0], bl[1], tr[0], tr[1]], ifXYZ1);
                            var extentB = ol.extent.containsCoordinate([bl[0], bl[1], tr[0], tr[1]], ifXYZ2);

                            //console.log(extentA, extentB);
                            if (extentA == false || extentB == false) {
                                if (me._opts.autoView) {
                                    clearInterval(_lu_locus._intervalFlag);

                                    var centerA = (ifXYZ2[0] - ifXYZ1[0]) / 2 + ifXYZ2[0];
                                    var centerB = (ifXYZ2[1] - ifXYZ1[1]) / 2 + ifXYZ2[1];

                                    if (extentA == false && extentB == false) {
                                        _map.getView().setCenter([centerA, centerB]);
                                    }
                                    else if (extentA == false) {
                                        _map.getView().setCenter(ifXYZ1);
                                    }
                                    else if (extentB == false) {
                                        _map.getView().setCenter(ifXYZ2);
                                    } else {
                                        console.log("#1005853");
                                        return;
                                    }
                                    setTimeout(function() {
                                        me._move(me._path[index], me._path[index + 1], me._tween.linear);
                                    }, 100);
                                } else {
                                    me._move(me._path[index], me._path[index + 1], me._tween.linear);
                                }
                            } else {
                                me._move(me._path[index], me._path[index + 1], me._tween.linear);
                            }
                        }
                    },
            /**
            * 设置小车上方infowindow的内容,位置等
            * @param {Point} pos 经纬度坐标点.
            * @return 无返回值.
            */
                    lu_track.prototype._setInfoWin = function(pos) {
                        //设置上方overlay的position
                        var me = this;
                        if (!me._overlay) {
                            return;
                        }
                        me._overlay.setPosition(pos, me._marker.getIcon().size);
                        var index = me._troughPointIndex(pos);
                        if (index != -1) {
                            clearInterval(me._intervalFlag);
                            //  me._overlay.setHtml(me._opts.landmarkPois[index].html);
                            me._overlay.setPosition(pos, me._marker.getIcon().getSize());
                            me._pauseForView(index);
                        } else {
                            me._overlay.setHtml(me._opts.defaultContent);
                        }
                    },
            /**
            * 在某个点暂停的时间
            * @param {Number} index 点的索引.
            * @return 无返回值.
            */
                    lu_track.prototype._pauseForView = function(index) {

                        var me = this;
                        var t = setTimeout(function() {
                            //运行下一个点
                            me._moveNext(++me.i);
                        },
                                me._opts.landmarkPois[index].pauseTime * 1000);
                        me._setTimeoutQuene.push(t);
                    },
            //清除暂停后再开始运行的timeout
                    lu_track.prototype._clearTimeout = function() {
                        for (var i in this._setTimeoutQuene) {
                            clearTimeout(this._setTimeoutQuene[i]);
                        }
                        this._setTimeoutQuene.length = 0;
                    },
            //缓动效果
                    lu_track.prototype._tween = {
                        //初始坐标,目标坐标,当前的步长,总的步长
                        linear: function(initPos, targetPos, currentCount, count) {
                            var b = initPos, c = targetPos - initPos, t = currentCount,
                                    d = count;
                            return c * t / d + b;
                        }
                    },

            /**
            * 否经过某个点的index
            * @param {Point} markerPoi 当前小车的坐标点.
            * @return 无返回值.
            */
                    lu_track.prototype._troughPointIndex = function(markerPoi) {
                        var t = this._opts.landmarkPois, distance;
                        for (var i = 0, len = t.length; i < len; i++) {
                            //landmarkPois中的点没有出现过的话
                            if (!t[i].bShow) {
                                distance = markerPoi.distance(new AMap.LngLat(t[i].lng, t[i].lat));
                                //两点距离小于10米,认为是同一个点
                                if (distance < 10) {
                                    t[i].bShow = true;
                                    return i;
                                }
                            }
                        }
                        return -1;
                    }


        })();



        function LocusStart() {
            if (_lu_locus)
                _lu_locus.start();
        }

        function LocusStop() {
            if (_lu_locus)
                _lu_locus.stop()
        }

        function LocusPause() {
            if (_lu_locus)
                _lu_locus.pause()
        }

        /**
        * 求多点间距离
        * @param hex
        * @param opacity
        * @author luwenjun 2016-9-22
        * @returns
        */
        var formatLength = function(coordinates) {
            var wgs84Sphere = new ol.Sphere(6378137), length = 0;
            var sourceProj = _map.getView().getProjection();
            for (var i = 0, ii = coordinates.length - 1; i < ii; ++i) {
                var c1 = ol.proj.transform(coordinates[i], sourceProj, 'EPSG:4326');
                var c2 = ol.proj.transform(coordinates[i + 1], sourceProj, 'EPSG:4326');
                length += wgs84Sphere.haversineDistance(c1, c2);
            }
            return length;
        };


        _map = new ol.Map({
            layers: [
          new ol.layer.Tile({
              source: new ol.source.OSM()
          })
        ],
            target: 'map',
            controls: ol.control.defaults({
                attributionOptions: /** @type {olx.control.AttributionOptions} */({
                    collapsible: false
                })
            }),
            view: new ol.View({
                center: [0, 0],
                zoom: 2
            })
        });

        //轨迹回放
        //------轨迹回放------//
        var lineArr = new Array();
        var lngX = 116.397428, latY = 39.90923;
        //数组中添加坐标
        lineArr.push(new lu_LngLat(lngX, latY));
        //随机生成坐标点
        for (var i = 1; i < 10; i++) {
            lngX = lngX + Math.random() * 0.1;
            if (i % 2) {
                latY = latY + Math.random() * 0.1;
            } else {
                latY = latY + Math.random() * 0.6;
            }
            lineArr.push(new lu_LngLat(lngX, latY));
        }

        //创建入参方法
        var p = new lu_LocusOption({
            locusData: {
                locusId: 1, //路径点id
                nodeIcon: "http://webapi.amap.com/theme/v1.3/markers/n/mark_b.png", //路径点图标
                label: new Object({//加入label对象
                    offset: [15, 0], //修改label相对于maker的位置 偏移
                    content: "轨迹回放 " //显示内容,也可以为html
                }),
                lnglat: lineArr//路径点数组
            },
            locusState: {
                circlable: true//是否循环播放,false只做一次

            }
        })

        lu_MoveLocus(p); //执行构造函数,接收返回参数lu_MoveLocus
        LocusStart(); //开始动画
        //LocusStop();//停止动画
        //LocusPause();//暂停动画,调用LocusStart()方法继续
        function setvalue1(e) {
            alert("点击成功,触发了回调函数")
        }
    </script>
  </body>
</html>

可以的话给个赞吧

最近使用了下OL3 感觉还是蛮吊,希望共同进步

转载自:https://blog.csdn.net/u012539364/article/details/53385648

You may also like...