cccreator / GIS

Gis releated
1 stars 0 forks source link

线路运行回放前端实现 #14

Open cccreator opened 5 years ago

cccreator commented 5 years ago

线路运行回放前端实现代码

第一步从后端取完数据后,放进一个三维数组;第二步进行回放(回放的机理就是每秒进行点的clear和打点操作);

第一步

app.showAllBusHistoryData = function (obj) {
                //判断线路范围的初始化值
                var pxmax = 0;
                var pxmin = 180;
                var pymax = 0;
                var pymin = 90;
                $.each(obj,function(index,value){
                    var cardNo = [];  //cardNo
                    var longitude = []; //经度
                    var latitude = []; //纬度
                    var timeDiffer = []; //gps时间与选择开始时间 时间差
                    var actTime = []; //gps时间
                    var playPath = [];
                    for(var i=0;i<value.length;i++){
                        longitude.push(value[i].longitude);
                        latitude.push(value[i].latitude);
                        cardNo.push(value[i].cardNo);
                        /*if($.inArray( value["key" + index][i].cardNo, cardNo) != -1){
                            cardNo.push(value["key" + index][i].cardNo);
                        }*/
                        timeDiffer.push(value[i].timeDiffer);
                        actTime.push(value[i].actTime);
                    }
                    //坐标集合长度
                    var playLength = longitude.length;
                    //遍历坐标点,确定轨迹回放的坐标范围;将经纬度放入路径点集合
                    for (var i = 0; i < playLength; i++) {
                        var pxcenter = longitude[i]; //经
                        var pycenter = latitude[i]; //纬
                        //在XX市范围内,防止地图线路与数据库线路不匹配的异常
                        if (mapConfig.xmin_baseMap < pxcenter && pxcenter < mapConfig.xmax_baseMap &&
                            mapConfig.ymin_baseMap < pycenter && pycenter < mapConfig.ymax_baseMap) {
                            //获取前后2次经度和纬度坐标的差
                            var xgap = longitude[i - 1] - longitude[i];
                            var ygap = latitude[i - 1] - latitude[i];
                            //小数点后保留5位小数,去绝对值
                            xgap = xgap.toFixed(5).replace(new RegExp("-", "g"), "");
                            ygap = ygap.toFixed(5).replace(new RegExp("-", "g"), "");
                            if (i == 0) { //路径点集合的第一个点直接放入数组
                                playPath.push([longitude[i], latitude[i],cardNo[i],timeDiffer[i],actTime[i]]);
                            }
                            //如果前后2次经度坐标或者纬度坐标差的绝对值大于0.00001,则为有效坐标点
                            else if (xgap > 0.00001 || ygap > 0.00001) {
                                playPath.push([longitude[i],latitude[i],cardNo[i],timeDiffer[i],actTime[i]]);
                            }
                            if (pxcenter > pxmax) {
                                pxmax = pxcenter; //线路路径的最大经度
                            } else if (pxcenter < pxmin) {
                                pxmin = pxcenter; //线路路径的最小经度
                            }
                            if (pycenter > pymax) {
                                pymax = pycenter; //线路路径的最大纬度
                            } else if (pycenter < pymin) {
                                pymin = pycenter; //线路路径的最小纬度
                            }
                        }

                    }
                    app.playpathAll.push(playPath);
                });
            }

第二步

      //线路运行回放
    function allBusTrackPlayBack(map, layerOut) {

        var app = document.getElementById('gis').contentWindow.app;
        //轨迹回放
        //app.playpath = []; //路径点集合
        app.playpathAll = []; //路径点集合
        app.startplay = ""; //轨迹回放起始点
        app.endplay = ""; //轨迹回放结束点
        app.angleData = [];
        app.showTimeArr = [];
        app.busPositionMark = [];
        app.playSum =  0;
        app.playTime = [];
        //app.busLayer.hide();
        var play = function () { //播放
            playFlag++;
            if (playFlag == 1) { //第一次点击
                isplay = true; //是否播放:是
                $("#crossBusDataCal").show();
                playAjax(); //画出轨迹,开始运行定位波
                setTimeout(playWave(), 1000);
            } else {
                isplay = true;
                playFlag = 1; //播放标识符设置为1
                playWave(); //运行定位波
            }
        };

        //轨迹回放:功能控制
        function playRev() {
            //历史轨迹回放速度模块控制
            //播放
            $("#playForRouteBusTrailReview").click(function () {
                $("#playForRouteBusTrailReview").hide();
                $("#play1ForRouteBusTrailReview").show();
                $("#pause1ForRouteBusTrailReview").hide();
                $("#pauseForRouteBusTrailReview").show();
                play();
            });
            //暂停
            $("#pauseForRouteBusTrailReview").click(function () {
                $("#pauseForRouteBusTrailReview").hide();
                $("#pause1ForRouteBusTrailReview").show();
                $("#play1ForRouteBusTrailReview").hide();
                $("#playForRouteBusTrailReview").show();
            });
            //取消
           /* $("#pcancelForRouteBusTrailReview").click(function () {
                $("#playForRouteBusTrailReview").show();
                $("#play1ForRouteBusTrailReview").hide();
                $("#pause1ForRouteBusTrailReview").hide();
                $("#pauseForRouteBusTrailReview").show();
                $("#table-scroll").hide();
                //进度重置
                $("#scheduleForRouteBusTrailReview").val(0);
            });*/
            //速度控制中文显示
            $(".spForRouteBusTrailReview").hide();
            $("#spForRouteBusTrailReview3").show(); //默认显示正常
            $("#gpsSpeedForRouteBusTrailReview").change(function () {
                var gpsSpeed = $("#gpsSpeedForRouteBusTrailReview").val();
                for (var i = 1; i < 6; i++) {
                    if (gpsSpeed == i) {
                        $(".spForRouteBusTrailReview").hide();
                        $("#spForRouteBusTrailReview" + i).show(); //显示对应速度的中文
                        break;
                    }
                }
            });

            //速度控制中文显示
            // $("#spForRouteBusTrailReview3").show(); //默认显示正常
            $("#gpsSpeedForRouteBusTrailReview").change(function () { //播放速度
                var speedCtrl = $("#gpsSpeedForRouteBusTrailReview").val();
                for (var i = 1; i < 6; i++) {
                    if (speedCtrl == i) {
                        $(".spForRouteBusTrailReview").hide();
                        $("#spForRouteBusTrailReview" + i).show(); //显示对应速度的中文
                        break;
                    }
                }
                if (speedCtrl == 1) {
                    playCtrl = 2000
                } //最慢,2秒一动
                else if (speedCtrl == 2) {
                    playCtrl = 1500
                } //慢,1.5秒一动
                else if (speedCtrl == 3) {
                    playCtrl = 1000
                } //正常,1秒一动
                else if (speedCtrl == 4) {
                    playCtrl = 650
                } //快,0.65秒一动
                else if (speedCtrl == 5) {
                    playCtrl = 300
                } //最快,0.3秒一动
            });
            $("#pauseForRouteBusTrailReview").click(function () { //暂停
                isplay = false; //是否播放:否
            });
            $("#pcancelForRouteBusTrailReview").click(function () { //取消
               app.clearData();
                /*if(mapConfig.cityCode == "SZ"){
                    app.resetExtentTrailBack(); //点击轨迹回放取消 ,初始化地图
                }*/
            });
        }
        app.clearData = function () {
            playi = 0; //轨迹点坐标集合下标重置
            playFlag = 0; //播放标识符重置
            isplay = false; //是否播放:否
            app.playLayer.clear();
            app.waveLayer.clear();
            app.lineTrailLayer.clear();
            app.stationTrailLayer.clear();
            app.arrowOnLineLayer.clear();
            /*app.lineLayer.clear();
            app.stationLayer.clear();
            app.startAndEndLayer.clear();*/
            app.infowin.style.display = "none";
            app.infowin_pop.style.display = "none";
            app.infowin.style.display = "none";
            app.infowin_pop.style.display = "none";
            app.infowinLeftBottom.style.display = "none";
            app.infoWindowTrail.style.display = "none";
            app.playpathAll = [];
            app.busPositionMark = [];
            app.showTimeArr = [];
            $("#runOperationControl").hide();
            $("#playForRouteBusTrailReview").show();
            $("#play1ForRouteBusTrailReview").hide();
            $("#pause1ForRouteBusTrailReview").hide();
            $("#pauseForRouteBusTrailReview").show();
            $("#table-scroll").hide();
            //进度重置
            $("#scheduleForRouteBusTrailReview").val(0);
            $(".spForRouteBusTrailReview").hide();
            $("#spForRouteBusTrailReview3").show(); //默认显示正常
            $("#gpsSpeedForRouteBusTrailReview").val(3);
            $("#markText").remove();
        }
        $("#routeBusTrailReviewEndTime").on("change",function () {
            app.clearData();
            app.playTime = [];
            //开始时间 结束时间判断 不能为空不能超过24小时
            if ($("#routeBusTrailReviewRouteName").length > 0 && $("#routeBusTrailReviewRouteName").val() != "") {
                var back = checkDate();
                if (back == false) {
                    return;
                }
            }
            var beginTime = $("#routeBusTrailReviewBeginTime").val();
            var endTime = $("#routeBusTrailReviewEndTime").val();
            var beginTimeSec =  app.sumSeconds(beginTime);
            var endTimeSec = app.sumSeconds(endTime);
            app.playSum = (endTimeSec - beginTimeSec)/10 + 1;
            for(var i =0 ;i<app.playSum;i++){
                app.playTime.push(app.getPlayTime(beginTime,i));
                app.showTimeArr.push(app.getShowTimeDate(app.getPlayTime(beginTime,i)));
            }
        })
        //当线路名称发生改变时,初始化回放数据
        $("#routeBusTrailReviewRouteName").on("change",function(){
            app.clearData();
        })
        //当运行方向发生改变时,初始化回放数据
        $("#routeBusTrailReviewRunDirection").on("change",function(){
            app.clearData();
        })
        //当开始时间发生改变时,初始化回放数据
        $("#routeBusTrailReviewBeginTime").on("change",function(){
            app.clearData();
        })

        $("#divhide").on("click",function () {
            isplay = false;
            playi = 0;
        });
        $("#playReview").on("click",function () {
            isplay = false;
            playi = 0;
        });
        //将标准时间字符串解析成秒(s)的总和
        app.sumSeconds = function(time){
            var timeStr = time.split(" ");
            var dayStr = timeStr[0].split("-")[2];
            var hourStr = timeStr[1].split(":")[0];
            var minuteStr = timeStr[1].split(":")[1];
            var seconds = "";
            if(timeStr[1].split(":").length == 3){
                seconds = timeStr[1].split(":")[2];
            }else{
                seconds = '0';
            }

            var dayToMinutes,hourToMinutes,sumMinutes,sumSeconds;
            if(dayStr.split("")[0] == '0'){
                dayToMinutes = parseInt(dayStr.split("")[1])*24*60;
            }else{
                dayToMinutes = parseInt(dayStr)*24*60;
            }
            if(hourStr.split("")[0] == '0'){
                hourToMinutes = parseInt(hourStr.split("")[1])*60;
            }else{
                hourToMinutes = parseInt(hourStr)*60;
            }
            sumMinutes = parseInt(dayToMinutes) + parseInt(hourToMinutes) + parseInt(minuteStr);
            sumSeconds = parseInt(sumMinutes)*60 + parseInt(seconds);
            return sumSeconds;
        }
        //获取每次回放时候的时间值
        app.getPlayTime = function(time,k){
            var date = time+':00';
            date = date.replace(/-/g,'/');
            var timestamp = new Date(date).getTime();
            var d = new Date(timestamp +(10*k)*1000);    //根据时间戳生成的时间对象
            var date =  d.Format('yyyy-MM-dd HH:mm:ss');
            return date;
        }
        //界面上显示的时间
        app.getShowTimeDate = function(time){
            var timeStr = time.split(" ");
           var hour = timeStr[1].split(":")[0];
           var minute = timeStr[1].split(":")[1];
           return hour + ":" + minute;
        }

        //从数据库查询出轨迹回放数据
        function playAjax() {
            var beginTime = $("#routeBusTrailReviewBeginTime").val(); //开始时间
            var endTime = $("#routeBusTrailReviewEndTime").val(); //结束时间
            // var carno = $("#carno_trailReview").val(); //车牌号
            var routeId = $("#routeBusTrailReviewRouteName").val(); //下拉框中的线路ID
            var routeName = $("#routeBusTrailReviewRouteName").find("option:selected").html(); //下拉框中的线路名称
            //var runDirection =  $("#routeBusTrailReviewRunDirection").val();
            var runDirection = $("#routeBusTrailReviewRunDirection option:selected").text();

            app.playLayer.clear(); //清除历史轨迹
            app.waveLayer.clear(); //清除定位波
            app.playLayer.show(); //清除历史轨迹
            app.waveLayer.show(); //清除定位波
            app.playpath = []; //点集合重置
            app.angleData = [];

            //历史轨迹信息查询,并存放在一个三维数组里面
            $.ajax({
                url: getWebRootPath() + "/BusMonitor/GISMonitor/getAllBusTrackData",
                type: "POST",
                data: {"routeId": routeId,
                    "runDirection":runDirection,
                    "beginTime":beginTime,
                    "endTime":endTime},
                dataType: "json",
                async:true,
                success: function (obj) {
                    if (!obj.length > 0) {
                        layerOut.open({
                            title: '提示',
                            content: '未查询到GPS数据!'
                        });
                        /**
                         * 这部分用来修复播放查询不到数据再次选到
                         * 能查询到数据的查询条件不能播放问题
                         * @type {number}
                         */
                        app.clearData();
                    }
                    $("#crossBusDataCal").hide();
                    app.showArrLftStationInfo(obj[1]);//显示到离站信息
                    app.showAllBusHistoryData(obj[0]);//将gps数据封装在app.playpathAll以便回放
                },
                error: function () {
                    layerOut.open({
                        title: '提示',
                        content: '未查询到GPS数据!'
                    });
                    return;
                }
            });
            app.map.addLayer(app.playLayer); //图层添加到地图上
            //播放波运行,延迟1秒执行
            setTimeout(playWave(), 1000);
            app.addArrowOnLine();
        }

        app.showArrLftStationInfo = function (data) {
            $("#idForRemove2").remove();
            var arrLftStationHtmlTab = "";
            var arrLftStationTableHead = "<div id='idForRemove2'><div style='margin-left: 24px;margin-bottom: -6px;' id='fontBusDetail'><p style='font-size: 15px;'>车辆到离站列表:</p></div> " +
                "<div id='titleForCal' style='width:91.8%;height:20px;border: 1px solid;text-align:center;margin-left: 24px;border-bottom:0px;'>" +
                "<div style='width:25%;height:100%;float:left;'>车牌号码</div>" +
                "<div style='width:25%;height:100%;float:left;border-left: 1px solid;'>站点名称</div>" +
                "<div style='width:25%;height:100%;float:left;border-left: 1px solid;'>到站时间</div>" +
                "<div style='width:25%;height:100%;float:left;border-left: 1px solid;'>离站时间</div>" +
                "</div>" +
                "<div id='crossBusSizeSet1' style='overflow-y:scroll;margin-left: 24px';width:100%;> " +
                "<table border='1'  cellpadding='10'  cellspacing='0'>" ;
            $.each(data,function (index,value) {
                $.each(value,function(indexPerBus,valuePerBus){
                    arrLftStationHtmlTab +=
                        "<tr><td width = '25%'>" + "<p style='text-align:center;margin-bottom: 1px;'>" + valuePerBus.carNo + "</p>" + "</td>"+
                        "<td width = '25%'>" + "<p style='text-align:center;margin-bottom: 1px;'>" + valuePerBus.stationName + "</p>" + "</td>"+
                        "<td width = '25%'>" + "<p style='text-align:center;margin-bottom: 1px;'>" + valuePerBus.arriveTime + "</p>" + "</td>"+
                        "<td width = '25%'>" + "<p style='text-align:center;margin-bottom: 1px;'>" + valuePerBus.leftTime + "</p>" + "</td>" + "</tr>";

                })
            })
            var htmlStr = arrLftStationTableHead + arrLftStationHtmlTab + "</table></div></div>";
            $("#arrLftStationInfo").append(htmlStr);
           var height = parseInt($(".ctrlArea_GISMonitor").height())-parseInt($(".yx-left-content-routeBusTrailReview").height()) - parseInt($("#fontBusDetail").height()) - 35 ;
            $("#crossBusSizeSet1").height(height);
        }

        /**
         * 轨迹回放的起始、终止时间判断
         * @param queryTime1
         * @param queryTime2
         * @returns {boolean}
         */
        function timeDeal(queryTime1, queryTime2) {//时间选择控制在一小时,开始时间不能小于结束时间
            var startDate = queryTime1.split("-");      //startDate[0],year; startDate[1], month
            var startYear = startDate[0];               //年
            var startMonth = startDate[1];              //月
            var startDayHourMin = startDate[2].split(" ");     //startDay[0] =〉day
            var startDay = startDayHourMin[0];
            var startHm = startDayHourMin[1].split(":");
            var startHour = startHm[0];                  //开始 小时
            var startMin = startHm[1];                   //开始 分钟

            var endDate = queryTime2.split("-");      //startDate[0],year; startDate[1], month
            var endYear = endDate[0];               //年
            var endMonth = endDate[1];              //月
            var endDayHourMin = endDate[2].split(" ");     //startDay[0] =〉day
            var endDay = endDayHourMin[0];
            var endHm = endDayHourMin[1].split(":");
            var endHour = endHm[0];                  //开始 小时
            var endMin = endHm[1];                   //开始 分钟

            var intervalHour = endHour - startHour;
            var intervalDay = endDay - startDay;
            var intervalMonth = endMonth - startMonth;
            var intervalYear = endYear - startYear;
            var intervalMinutes = parseInt(endHour)*60 + parseInt(endMin) -  parseInt(startHour)*60 - parseInt(startMin);
            if( intervalYear < 0 || intervalMonth < 0 || intervalDay < 0 || intervalHour < 0 || intervalMinutes < 0){
                layerOut.open({
                    title: '提示',
                    content: '开始日期不能大于结束日期!'
                });
                return false;
            }
            if(intervalYear >= 1 || intervalMonth >= 1 || intervalDay >= 1 || intervalHour >= 2 || intervalMinutes > 60){
                layerOut.open({
                    title: '提示',
                    content: '开始时间结束时间不能相差1小时以上!'
                });
                return false;
            }
            return true;
        }

        function checkDate() {

            var beginTime = $("#routeBusTrailReviewBeginTime").val(); //开始时间
            var endTime = $("#routeBusTrailReviewEndTime").val(); //结束时间

            if (beginTime == '' || endTime == '') {
                layerOut.open({
                    title: '提示',
                    content: '开始时间和结束时间不能为空!'
                });
                $("#playForRouteBusTrailReview").show();
                $("#play1ForRouteBusTrailReview").hide();
                return false;
            }
            var result = timeDeal(beginTime, endTime);
            if (result) {
                return true;
            } else {
                $("#play").show();
                $("#play1").hide();
                return false;
            }
        }

        //轨迹回放定位波移动
        function playWave() {
            setTimeout(run, playCtrl); //根据播放速度,延迟加载方法
        }
        //轨迹回放定位波移动方法
        function run() {
            if (playi <  app.playSum && isplay == true && app.playpathAll.length != 0) {
                app.updateRouteBusTrail(app.playTime[playi]);
                //进度:数值向下取整
                //进度 当前点 总共有多少点  乘以100 变成整数
                playi++; //轨迹点坐标集合下标自增长
                var scheduleForRouteBusTrailReview = Math.floor(playi * 100 /  app.playSum);
                $("#scheduleForRouteBusTrailReview").val(scheduleForRouteBusTrailReview);
                $("#markText").remove();
                $("#spForRouteBusTrailReviewTime").append("<p id = 'markText' style='margin-bottom: 0px;'>" + app.showTimeArr[playi-1] + "</p>");
            }
            if (playi == app.playSum-1) {
                isplay = false;
                playi = 0;
                app.busPositionMark = [];
                $("#playForRouteBusTrailReview").show();
                $("#play1ForRouteBusTrailReview").hide();
                playWave();
                return;
            }
            /*else{
             return playi; //返回轨迹坐标集合中的下标位置,为了暂停后继续播放
             }*/
            if (isplay) {
                setTimeout(run, playCtrl); //根据播放速度,延迟加载方法
            }
        }

        /**
         * 进度条改变事件,改变播放的当前进度
         */
        $("#scheduleForRouteBusTrailReview").on("change", function () {
            var scheduleValue = $("#scheduleForRouteBusTrailReview").val();
            playi = Math.floor(scheduleValue * (app.playSum - 1) / 100);
            app.busPositionMark =[];
        });

        //轨迹回放:点击播放
        playRev();//dojo.connect(map, "onLoad", playRev);
    }
cccreator commented 5 years ago

线路运行回放前端实现代码-app.updateRouteBusTrail(app.playTime[playi])

//更新定位点
            app.updateRouteBusTrail = function (time) {
                app.waveLayer.clear(app.graphicw); //清除上一次位置的波元素
                app.map.removeLayer(app.graphicw);

                for (var i = 0; i < app.playpathAll.length; i++) {//遍历每一辆车
                    //记录每辆车的播放位置
                    var j = app.busPositionMark[i] == undefined ? 0 : app.busPositionMark[i];
                    var tempPosiTion;//位置,gps点
                    for (j; j < app.playpathAll[i].length; j++) {//遍历每辆车的每个gps点
                        var item = app.playpathAll[i][j];//每个gps点
                        if (item[4].substring(0,19) <= time) {//如果gps时间小于标准时间
                            tempPosiTion = item;
                        } else {
                            //如果位置j == app.busPositionMark[i]
                            if(j==app.busPositionMark[i]&&j> 0){
                                //如果gps时间大于标准时间,则给tempPosiTion赋值
                                tempPosiTion= app.playpathAll[i][j-1];
                            }
                            app.busPositionMark[i] = j;//更新app.busPositionMark[i]
                            break;//跳出循环
                        }
                    }
                    if (tempPosiTion == undefined)//如果
                        continue
                    // app.waveLayer.clear(app.graphicw); //清除上一次位置的波元素
                    //设置坐标
                    //图片根据划线点的坐标,重新走一下图片。
                    var ppw = new esri.geometry.Point(tempPosiTion[0], tempPosiTion[1]);
                    var symbolw = new esri.symbol.PictureMarkerSymbol(mapConfig.compreshowNoClickBusSZ, mapConfig.routeBusPlayWaveSize, mapConfig.routeBusPlayWaveSize);

                    app.graphicw = new esri.Graphic(ppw, symbolw, {
                        "carNo": tempPosiTion[2],
                        "actTime": tempPosiTion[4]
                    }); //波对象
                    app.waveLayer.add(app.graphicw); //波对象添加到图层
                    // app.map.addLayer(app.waveLayer); //图层添加到地图
                }
                dojo.connect(app.waveLayer,"onMouseOver",mouseOnHisBusLayer);
                dojo.connect(app.waveLayer,"onMouseOut",mouseOutHisBusLayer);
                app.map.addLayer(app.waveLayer); //图层添加到地图
            }