Commit a6e5b855b8a7e2f3b03daa44a40a7405dd8c9593
1 parent
20d60a35
update...
Showing
11 changed files
with
728 additions
and
146 deletions
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
| ... | ... | @@ -138,7 +138,7 @@ public class DayOfSchedule implements CommandLineRunner { |
| 138 | 138 | //dataRecovery(); |
| 139 | 139 | |
| 140 | 140 | //翻班线程 |
| 141 | - Application.mainServices.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS); | |
| 141 | +// Application.mainServices.scheduleWithFixedDelay(scheduleRefreshThread, 15, 240, TimeUnit.SECONDS); | |
| 142 | 142 | //入库 |
| 143 | 143 | // Application.mainServices.scheduleWithFixedDelay(schedulePstThread, 60, 30, TimeUnit.SECONDS); |
| 144 | 144 | //班次误点扫描 | ... | ... |
src/main/java/com/bsth/service/gps/GpsServiceImpl.java
| ... | ... | @@ -11,7 +11,10 @@ import com.bsth.entity.realcontrol.ScheduleRealInfo; |
| 11 | 11 | import com.bsth.repository.CarParkRepository; |
| 12 | 12 | import com.bsth.repository.StationRepository; |
| 13 | 13 | import com.bsth.repository.realcontrol.ScheduleRealInfoRepository; |
| 14 | -import com.bsth.service.gps.entity.*; | |
| 14 | +import com.bsth.service.gps.entity.GpsOutbound_DTO; | |
| 15 | +import com.bsth.service.gps.entity.GpsSpeed_DTO; | |
| 16 | +import com.bsth.service.gps.entity.HistoryGps_DTO; | |
| 17 | +import com.bsth.service.gps.entity.Road_DTO; | |
| 15 | 18 | import com.bsth.util.DateUtils; |
| 16 | 19 | import com.bsth.util.TransGPS; |
| 17 | 20 | import com.bsth.util.TransGPS.Location; |
| ... | ... | @@ -28,6 +31,7 @@ import java.lang.reflect.Field; |
| 28 | 31 | import java.sql.Connection; |
| 29 | 32 | import java.sql.PreparedStatement; |
| 30 | 33 | import java.sql.ResultSet; |
| 34 | +import java.text.DecimalFormat; | |
| 31 | 35 | import java.util.*; |
| 32 | 36 | |
| 33 | 37 | @Service |
| ... | ... | @@ -538,11 +542,25 @@ public class GpsServiceImpl implements GpsService { |
| 538 | 542 | List<GpsSpeed_DTO> speedList = speeds(nbbm, st, et); |
| 539 | 543 | //越界数据 |
| 540 | 544 | List<GpsOutbound_DTO> outboundList = outbounds(nbbm, st, et); |
| 545 | + //计算里程 | |
| 546 | + List<HistoryGps_DTO> effList = new ArrayList<>(); | |
| 547 | + for(HistoryGps_DTO gps : list){ | |
| 548 | + if(gps.getLat() != 0 && gps.getLon() != 0) | |
| 549 | + effList.add(gps); | |
| 550 | + } | |
| 551 | + double sum = 0, dist; | |
| 552 | + for (int i = 0; i < effList.size() - 1; i++) { | |
| 553 | + dist = GeoUtils.getDistance(effList.get(i).getPoint(), effList.get(i + 1).getPoint()); | |
| 554 | + //点位相同时,dist会NaN | |
| 555 | + if(String.valueOf(dist).matches("^[0.0-9.0]+$")) | |
| 556 | + sum += dist; | |
| 557 | + } | |
| 541 | 558 | |
| 542 | 559 | rs.put("status", ResponseCode.SUCCESS); |
| 543 | - rs.put("list", removeDuplicate(list)); | |
| 560 | + rs.put("list", removeDuplicate(effList)); | |
| 544 | 561 | rs.put("speedList", speedList); |
| 545 | 562 | rs.put("outboundList", outboundList); |
| 563 | + rs.put("sumMileage", new DecimalFormat(".##").format(sum / 1000)); | |
| 546 | 564 | } catch (Exception e) { |
| 547 | 565 | logger.error("", e); |
| 548 | 566 | rs.put("status", ResponseCode.ERROR); |
| ... | ... | @@ -571,7 +589,7 @@ public class GpsServiceImpl implements GpsService { |
| 571 | 589 | int weekYear = weekCal.get(Calendar.WEEK_OF_YEAR); |
| 572 | 590 | //设备号 |
| 573 | 591 | String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm); |
| 574 | - String sql = "select vehicle,line,up_down,lon,lat,timestamp from bsth_c_outbound where weeks_year="+weekYear+" and vehicle=? and timestamp>? and timestamp<?"; | |
| 592 | + String sql = "select vehicle,line,up_down,lon,lat,timestamp from bsth_c_outbound where weeks_year=" + weekYear + " and vehicle=? and timestamp>? and timestamp<?"; | |
| 575 | 593 | return GpsOutbound_DTO.create(new JdbcTemplate(DBUtils_MS.getDataSource()).queryForList(sql, deviceId, st, et)); |
| 576 | 594 | } |
| 577 | 595 | ... | ... |
src/main/java/com/bsth/service/gps/entity/HistoryGps_DTO.java
| ... | ... | @@ -29,8 +29,8 @@ public class HistoryGps_DTO { |
| 29 | 29 | return list; |
| 30 | 30 | } |
| 31 | 31 | |
| 32 | - private double gcj_lon; | |
| 33 | - private double gcj_lat; | |
| 32 | + //private double gcj_lon; | |
| 33 | + //private double gcj_lat; | |
| 34 | 34 | |
| 35 | 35 | private double bd_lon; |
| 36 | 36 | private double bd_lat; |
| ... | ... | @@ -82,7 +82,7 @@ public class HistoryGps_DTO { |
| 82 | 82 | return (this.getDeviceId() + "_" + (inout_stop_info==null?this.getStopNo():inout_stop_info.getStopName()) + "_" + this.getTs() + "_" + this.getLon() + "_" + this.getLat()); |
| 83 | 83 | } |
| 84 | 84 | |
| 85 | - public double getGcj_lon() { | |
| 85 | +/* public double getGcj_lon() { | |
| 86 | 86 | return gcj_lon; |
| 87 | 87 | } |
| 88 | 88 | |
| ... | ... | @@ -96,7 +96,7 @@ public class HistoryGps_DTO { |
| 96 | 96 | |
| 97 | 97 | public void setGcj_lat(double gcj_lat) { |
| 98 | 98 | this.gcj_lat = gcj_lat; |
| 99 | - } | |
| 99 | + }*/ | |
| 100 | 100 | |
| 101 | 101 | public double getBd_lon() { |
| 102 | 102 | return bd_lon; | ... | ... |
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/lj_zrw.html
| ... | ... | @@ -97,6 +97,8 @@ |
| 97 | 97 | <span class="uk-badge uk-badge-danger">直放</span> |
| 98 | 98 | {{else if sch.bcType == "major"}} |
| 99 | 99 | <span class="uk-badge uk-badge-danger">放站</span> |
| 100 | + {{else if sch.bcType == "region"}} | |
| 101 | + <span class="uk-badge">区间</span> | |
| 100 | 102 | {{/if}} |
| 101 | 103 | {{if sch.sflj}} |
| 102 | 104 | <span class="uk-badge uk-badge-danger">临加</span> | ... | ... |
src/main/resources/static/real_control_v2/fragments/line_schedule/sch_table.html
| ... | ... | @@ -72,6 +72,8 @@ |
| 72 | 72 | <span class="uk-badge uk-badge-danger">直放</span> |
| 73 | 73 | {{else if sch.bcType == "major"}} |
| 74 | 74 | <span class="uk-badge uk-badge-danger">放站</span> |
| 75 | + {{else if sch.bcType == "region"}} | |
| 76 | + <span class="uk-badge">区间</span> | |
| 75 | 77 | {{/if}} |
| 76 | 78 | {{if sch.sflj}} |
| 77 | 79 | <span class="uk-badge uk-badge-danger">临加</span> |
| ... | ... | @@ -119,6 +121,8 @@ |
| 119 | 121 | <span class="uk-badge uk-badge-danger">直放</span> |
| 120 | 122 | {{else if bcType == "major"}} |
| 121 | 123 | <span class="uk-badge uk-badge-danger">放站</span> |
| 124 | + {{else if bcType == "region"}} | |
| 125 | + <span class="uk-badge">区间</span> | |
| 122 | 126 | {{/if}} |
| 123 | 127 | {{if sflj}} |
| 124 | 128 | <span class="uk-badge uk-badge-danger">临加</span> | ... | ... |
src/main/resources/static/real_control_v2/mapmonitor/css/real.css
| ... | ... | @@ -818,8 +818,17 @@ input[type=checkbox].disabled{ |
| 818 | 818 | height: 100%; |
| 819 | 819 | } |
| 820 | 820 | |
| 821 | +.map-container.show_tools{ | |
| 822 | + height: calc(100% - 63px); | |
| 823 | + margin-top: 63px; | |
| 824 | +} | |
| 825 | + | |
| 821 | 826 | #map-playback2-modal .uk-modal-close{ |
| 822 | 827 | z-index: 11; |
| 828 | + background: #ff3333; | |
| 829 | + opacity: 1; | |
| 830 | + border-radius: 15px; | |
| 831 | + color: white; | |
| 823 | 832 | } |
| 824 | 833 | |
| 825 | 834 | .map-wrap-tools .ct-progress-bar{ |
| ... | ... | @@ -828,6 +837,7 @@ input[type=checkbox].disabled{ |
| 828 | 837 | width: 100%; |
| 829 | 838 | bottom: 0; |
| 830 | 839 | cursor: pointer; |
| 840 | + overflow: hidden; | |
| 831 | 841 | /*border-top: 5px solid white;*/ |
| 832 | 842 | } |
| 833 | 843 | |
| ... | ... | @@ -866,7 +876,7 @@ input[type=checkbox].disabled{ |
| 866 | 876 | .map-wrap-tools .btns>.multi-items{ |
| 867 | 877 | display: inline-block; |
| 868 | 878 | vertical-align: top; |
| 869 | - background: #e7e4e4; | |
| 879 | + background: #f1f1f1; | |
| 870 | 880 | padding: 7px 15px; |
| 871 | 881 | margin: 12px 5px; |
| 872 | 882 | border-radius: 5px; |
| ... | ... | @@ -899,4 +909,16 @@ input[type=checkbox].disabled{ |
| 899 | 909 | font-size: 22px; |
| 900 | 910 | color: #8b8686; |
| 901 | 911 | margin-right: 10px; |
| 912 | +} | |
| 913 | + | |
| 914 | +.play_back_form_shade{ | |
| 915 | + background: rgb(196, 194, 194); | |
| 916 | + position: absolute; | |
| 917 | + width: 98%; | |
| 918 | + height: 205px; | |
| 919 | + left: 2%; | |
| 920 | + z-index: 99; | |
| 921 | + top: 0; | |
| 922 | + opacity: .2; | |
| 923 | + display: none; | |
| 902 | 924 | } |
| 903 | 925 | \ No newline at end of file | ... | ... |
src/main/resources/static/real_control_v2/mapmonitor/fragments/playback_v2/main.html
| ... | ... | @@ -10,7 +10,8 @@ |
| 10 | 10 | </div> |
| 11 | 11 | |
| 12 | 12 | </div> |
| 13 | - <div class="uk-width-medium-2-10 uk-height-viewport z-depth-viewport "> | |
| 13 | + <div class="uk-width-medium-2-10 uk-height-viewport z-depth-viewport " style="position: relative;"> | |
| 14 | + <div class="play_back_form_shade uk-animation-scale"></div> | |
| 14 | 15 | <form class="uk-form uk-form-horizontal playBackForm"> |
| 15 | 16 | <div class="uk-grid"> |
| 16 | 17 | <div class="uk-width-1-1"> |
| ... | ... | @@ -18,7 +19,9 @@ |
| 18 | 19 | <label class="uk-form-label">车辆编码</label> |
| 19 | 20 | <div class="uk-form-controls"> |
| 20 | 21 | <div class="uk-autocomplete uk-form autocomplete-nbbm"> |
| 21 | - <input name="nbbm" required/> | |
| 22 | + <div class="uk-autocomplete uk-form autocomplete-nbbm"> | |
| 23 | + <input name="nbbm" required/> | |
| 24 | + </div> | |
| 22 | 25 | </div> |
| 23 | 26 | </div> |
| 24 | 27 | </div> |
| ... | ... | @@ -137,35 +140,33 @@ |
| 137 | 140 | <div class="map-wrap-tools uk-animation-slide-top"> |
| 138 | 141 | <div class="btns"> |
| 139 | 142 | <span class="ct_btn play_btn"></span> |
| 140 | - <span class="ct_btn clock"> | |
| 141 | - 08:20.10 | |
| 142 | - </span> | |
| 143 | + <span class="ct_btn clock"></span> | |
| 143 | 144 | <div class="multi-items"> |
| 144 | - <form class="uk-form"> | |
| 145 | + <form class="uk-form speed_form"> | |
| 145 | 146 | <label> |
| 146 | - <input type="radio" name="playSpeed"> x1 | |
| 147 | + <input type="radio" name="playSpeed" value="1"> x1 | |
| 147 | 148 | </label> |
| 148 | 149 | <label> |
| 149 | - <input type="radio" name="playSpeed"> x5 | |
| 150 | + <input type="radio" name="playSpeed" value="5"> x5 | |
| 150 | 151 | </label> |
| 151 | 152 | <label> |
| 152 | - <input type="radio" name="playSpeed"> x10 | |
| 153 | + <input type="radio" name="playSpeed" value="10"> x10 | |
| 153 | 154 | </label> |
| 154 | 155 | <label> |
| 155 | - <input type="radio" name="playSpeed"> x20 | |
| 156 | + <input type="radio" name="playSpeed" value="20"> x20 | |
| 156 | 157 | </label> |
| 157 | 158 | </form> |
| 158 | 159 | </div> |
| 159 | 160 | <div class="multi-items"> |
| 160 | - <form class="uk-form"> | |
| 161 | + <form class="uk-form buffer_area_form"> | |
| 161 | 162 | <label> |
| 162 | - <input type="checkbox"> 站点 | |
| 163 | + <input type="checkbox" name="drawPoint"> 站点 | |
| 163 | 164 | </label> |
| 164 | 165 | <label> |
| 165 | - <input type="checkbox"> 缓冲区 | |
| 166 | + <input type="checkbox" name="drawBuffArea"> 缓冲区 | |
| 166 | 167 | </label> |
| 167 | 168 | <label> |
| 168 | - <input type="checkbox"> 站点名称 | |
| 169 | + <input type="checkbox" name="stationName"> 站点名称 | |
| 169 | 170 | </label> |
| 170 | 171 | <label> |
| 171 | 172 | 停车场 <i class="uk-icon-angle-down"></i> |
| ... | ... | @@ -173,7 +174,7 @@ |
| 173 | 174 | </form> |
| 174 | 175 | </div> |
| 175 | 176 | <span class="ct_btn text-panel"> |
| 176 | - <span>约12.58公里,1258个GPS点</span><br> | |
| 177 | + <span>共约 <span class="sum_mileage"></span> 公里,<span class="count_point"></span> 个GPS点</span><br> | |
| 177 | 178 | <a class="export-excel"><i class="uk-icon-file-excel-o"></i> 导出轨迹</a> |
| 178 | 179 | </span> |
| 179 | 180 | </div> |
| ... | ... | @@ -211,7 +212,7 @@ |
| 211 | 212 | |
| 212 | 213 | <script id="multi_inout_info_cont_temp" type="text/html"> |
| 213 | 214 | {{each list as item i}} |
| 214 | - <dl> | |
| 215 | + <dl data-id="{{item.id}}"> | |
| 215 | 216 | <dd>{{item.stopName}}</dd> |
| 216 | 217 | <dd>{{item.in_time_str}}</dd> |
| 217 | 218 | <dd>{{item.out_time_str}}</dd> |
| ... | ... | @@ -221,6 +222,17 @@ |
| 221 | 222 | {{/each}} |
| 222 | 223 | </script> |
| 223 | 224 | |
| 225 | + <script id="inout_info_cont_temp" type="text/html"> | |
| 226 | + <dl data-id="{{id}}"> | |
| 227 | + <dd>{{stopName}}</dd> | |
| 228 | + <dd>{{in_time_str}}</dd> | |
| 229 | + <dd></dd> | |
| 230 | + <dd></dd> | |
| 231 | + <dd></dd> | |
| 232 | + </dl> | |
| 233 | + </script> | |
| 234 | + | |
| 235 | + | |
| 224 | 236 | <script id="abnormal_table_cont_temp" type="text/html"> |
| 225 | 237 | {{each array as item i}} |
| 226 | 238 | <dl> |
| ... | ... | @@ -242,15 +254,8 @@ |
| 242 | 254 | var modal = '#map-playback2-modal', gpsArray; |
| 243 | 255 | |
| 244 | 256 | $(modal).on('init', function (e, data) { |
| 245 | - try { | |
| 246 | - //初始化地图 | |
| 247 | - map = new BMap.Map($('.map-container', modal)[0]); | |
| 248 | - //中心点和缩放级别 | |
| 249 | - map.centerAndZoom(new BMap.Point(gb_map_consts.center_point.lng, gb_map_consts.center_point.lat), 16); | |
| 250 | - map.enableScrollWheelZoom(); | |
| 251 | - } catch (e) { | |
| 252 | - console.log(e); | |
| 253 | - } | |
| 257 | + //初始化地图 | |
| 258 | + mapObj.initMap(); | |
| 254 | 259 | |
| 255 | 260 | //固定表头 |
| 256 | 261 | gb_ct_table.fixedHead($('.road_table_wrap', modal)); |
| ... | ... | @@ -261,6 +266,11 @@ |
| 261 | 266 | |
| 262 | 267 | //表单初始值 |
| 263 | 268 | searchForm.init(data); |
| 269 | + | |
| 270 | + //车辆 autocomplete | |
| 271 | + $.get('/basic/cars', function (rs) { | |
| 272 | + gb_common.carAutocomplete($('.autocomplete-nbbm', modal), rs); | |
| 273 | + }); | |
| 264 | 274 | }); |
| 265 | 275 | |
| 266 | 276 | /** |
| ... | ... | @@ -306,95 +316,122 @@ |
| 306 | 316 | */ |
| 307 | 317 | var searchForm = (function () { |
| 308 | 318 | |
| 309 | - var f = $('.playBackForm', modal); | |
| 310 | - | |
| 311 | - var init = function (data) { | |
| 312 | - //设置初始值 | |
| 313 | - /*if (data.nbbm) | |
| 314 | - $('[name=nbbm]', f).val(data.nbbm); | |
| 315 | - var st = moment().subtract(2, 'hour'); | |
| 316 | - if (data.st) | |
| 317 | - st = moment(data.st, 'YYYY-MM-DD HH:mm'); | |
| 318 | - $('[name=sDate]', f).val(st.format('YYYY-MM-DD')); | |
| 319 | - $('[name=sTime]', f).val(st.format('HH:mm')); | |
| 320 | - var et = moment(); | |
| 321 | - if (data.et) | |
| 322 | - et = moment(data.et, 'YYYY-MM-DD HH:mm'); | |
| 323 | - $('[name=eDate]', f).val(et.format('YYYY-MM-DD')); | |
| 324 | - $('[name=eTime]', f).val(et.format('HH:mm'));*/ | |
| 325 | - | |
| 326 | - | |
| 327 | - $('[name=nbbm]', f).val('W0A-018'); | |
| 328 | - $('[name=sDate]', f).val('2017-04-06'); | |
| 329 | - $('[name=sTime]', f).val('04:49'); | |
| 330 | - | |
| 331 | - $('[name=eDate]', f).val('2017-04-06'); | |
| 332 | - $('[name=eTime]', f).val('09:49'); | |
| 333 | - //搜索事件 | |
| 334 | - $('button[type=submit]', f).on('click', search); | |
| 335 | - }; | |
| 336 | - | |
| 337 | - var setNbbm = function (v) { | |
| 338 | - $('[name=nbbm]', f).val(v); | |
| 339 | - }; | |
| 340 | - | |
| 341 | - var ONE_DAY = 60 * 60 * 24; | |
| 342 | - var MIN_SPACE = 60; | |
| 343 | - var search = function (e) { | |
| 344 | - e.stopPropagation(); | |
| 345 | - var data = f.serializeJSON(); | |
| 346 | - | |
| 347 | - //校验时间间隔 | |
| 348 | - var fs = 'YYYY-MM-DDHH:mm'; | |
| 349 | - var st = parseInt(moment(data.sDate + data.sTime, fs).format('X')); | |
| 350 | - var et = parseInt(moment(data.eDate + data.eTime, fs).format('X')); | |
| 351 | - | |
| 352 | - if (et < st) | |
| 353 | - notify_err('结束时间不能小于开始时间'); | |
| 354 | - else if ((et - st) > ONE_DAY) | |
| 355 | - notify_err('最大间隔24小时!'); | |
| 356 | - else if ((et - st) < MIN_SPACE) | |
| 357 | - notify_err('最小间隔1分钟!'); | |
| 358 | - else { | |
| 359 | - $.ajax({ | |
| 360 | - url: '/gps/history_v2/' + data.nbbm, | |
| 361 | - traditional: true, | |
| 362 | - data: {st: st, et: et}, | |
| 363 | - success: function (rs) { | |
| 364 | - gpsArray = rs.list; | |
| 365 | - if (!rs || rs.length == 0) { | |
| 366 | - notify_err('没有搜索到轨迹数据!'); | |
| 367 | - return; | |
| 368 | - } | |
| 369 | - | |
| 370 | - //排序 | |
| 371 | - gpsArray.sort(function (a, b) { | |
| 372 | - return parseInt((a.ts - b.ts) + '' + (a.stop_no - b.stop_no)); | |
| 373 | - }); | |
| 374 | - //行车轨迹 | |
| 375 | - trailTableObj.showInitData(gpsArray); | |
| 376 | - //到离站信息 | |
| 377 | - inOutStationTableObj.showInitData(gpsArray); | |
| 378 | - //异常信息 | |
| 379 | - abnormalTableObj.showInitData(rs['outboundList'], rs['speedList']); | |
| 380 | - //show 工具条 | |
| 381 | - mapTools.show(); | |
| 382 | - } | |
| 319 | + var f = $('.playBackForm', modal); | |
| 320 | + | |
| 321 | + var init = function (data) { | |
| 322 | + //设置初始值 | |
| 323 | + if (data.nbbm) | |
| 324 | + $('[name=nbbm]', f).val(data.nbbm); | |
| 325 | + var st = moment().subtract(2, 'hour'); | |
| 326 | + if (data.st) | |
| 327 | + st = moment(data.st, 'YYYY-MM-DD HH:mm'); | |
| 328 | + $('[name=sDate]', f).val(st.format('YYYY-MM-DD')); | |
| 329 | + $('[name=sTime]', f).val(st.format('HH:mm')); | |
| 330 | + var et = moment(); | |
| 331 | + if (data.et) | |
| 332 | + et = moment(data.et, 'YYYY-MM-DD HH:mm'); | |
| 333 | + $('[name=eDate]', f).val(et.format('YYYY-MM-DD')); | |
| 334 | + $('[name=eTime]', f).val(et.format('HH:mm')); | |
| 335 | + | |
| 336 | + | |
| 337 | + /*$('[name=nbbm]', f).val('W0A-018'); | |
| 338 | + $('[name=sDate]', f).val('2017-04-06'); | |
| 339 | + $('[name=sTime]', f).val('04:49'); | |
| 340 | + | |
| 341 | + $('[name=eDate]', f).val('2017-04-06'); | |
| 342 | + $('[name=eTime]', f).val('09:49');*/ | |
| 343 | + //搜索事件 | |
| 344 | + $('button[type=submit]', f).on('click', search); | |
| 345 | + }; | |
| 346 | + | |
| 347 | + var setNbbm = function (v) { | |
| 348 | + $('[name=nbbm]', f).val(v); | |
| 349 | + }; | |
| 350 | + | |
| 351 | + var ONE_DAY = 60 * 60 * 24; | |
| 352 | + var MIN_SPACE = 60; | |
| 353 | + var search = function (e) { | |
| 354 | + e.stopPropagation(); | |
| 355 | + var data = f.serializeJSON(); | |
| 356 | + | |
| 357 | + //校验时间间隔 | |
| 358 | + var fs = 'YYYY-MM-DDHH:mm'; | |
| 359 | + var st = parseInt(moment(data.sDate + data.sTime, fs).format('X')); | |
| 360 | + var et = parseInt(moment(data.eDate + data.eTime, fs).format('X')); | |
| 361 | + | |
| 362 | + if (et < st) | |
| 363 | + notify_err('结束时间不能小于开始时间'); | |
| 364 | + else if ((et - st) > ONE_DAY) | |
| 365 | + notify_err('最大间隔24小时!'); | |
| 366 | + else if ((et - st) < MIN_SPACE) | |
| 367 | + notify_err('最小间隔1分钟!'); | |
| 368 | + else { | |
| 369 | + show_wait_modal('搜索数据...'); | |
| 370 | + $.ajax({ | |
| 371 | + url: '/gps/history_v2/' + data.nbbm, | |
| 372 | + traditional: true, | |
| 373 | + data: {st: st, et: et}, | |
| 374 | + success: function (rs) { | |
| 375 | + hide_wait_modal(); | |
| 376 | + //重置相关对象 | |
| 377 | + playObj.reset(); | |
| 378 | + mapObj.reset(); | |
| 379 | + | |
| 380 | + gpsArray = rs.list; | |
| 381 | + if (!gpsArray || gpsArray.length == 0) { | |
| 382 | + notify_err('没有搜索到轨迹数据!'); | |
| 383 | + return; | |
| 384 | + } | |
| 385 | + | |
| 386 | + //排序 | |
| 387 | + gpsArray.sort(function (a, b) { | |
| 388 | + return parseInt((a.ts - b.ts) + '' + (a.stop_no - b.stop_no)); | |
| 383 | 389 | }); |
| 390 | + //行车轨迹 | |
| 391 | + trailTableObj.showInitData(gpsArray); | |
| 392 | + //到离站信息 | |
| 393 | + inOutStationTableObj.showInitData(gpsArray); | |
| 394 | + //异常信息 | |
| 395 | + abnormalTableObj.showInitData(rs['outboundList'], rs['speedList']); | |
| 396 | + //show 工具条 | |
| 397 | + mapTools.show(rs); | |
| 398 | + //地图 | |
| 399 | + mapObj.initData(rs); | |
| 400 | + //play 对象 | |
| 401 | + playObj.init(rs); | |
| 402 | + //设置导出文件名称 | |
| 403 | + mapTools.setExcelName(); | |
| 384 | 404 | } |
| 385 | - return false; | |
| 386 | - }; | |
| 387 | - return { | |
| 388 | - init: init, | |
| 389 | - setNbbm: setNbbm | |
| 390 | - }; | |
| 391 | - })(); | |
| 405 | + }); | |
| 406 | + } | |
| 407 | + return false; | |
| 408 | + }; | |
| 409 | + | |
| 410 | + //遮罩 | |
| 411 | + var shade = $('.play_back_form_shade', modal); | |
| 412 | + var showShade = function () { | |
| 413 | + shade.show(); | |
| 414 | + }; | |
| 415 | + var hideShade = function () { | |
| 416 | + shade.hide(); | |
| 417 | + }; | |
| 418 | + | |
| 419 | + return { | |
| 420 | + init: init, | |
| 421 | + setNbbm: setNbbm, | |
| 422 | + showShade: showShade, | |
| 423 | + hideShade: hideShade | |
| 424 | + }; | |
| 425 | + })(); | |
| 392 | 426 | |
| 393 | 427 | /** |
| 394 | 428 | * 行车轨迹表格 |
| 395 | 429 | */ |
| 396 | 430 | var trailTableObj = (function () { |
| 397 | 431 | |
| 432 | + var $tbody = $('.gps-road-info .ct_table_body', modal); | |
| 433 | + var $wrap = $('.road_table_wrap', modal); | |
| 434 | + var initFlag, gpsArray; | |
| 398 | 435 | var showInitData = function (list) { |
| 399 | 436 | var array = []; |
| 400 | 437 | for (var i = 0, gps; gps = list[i++];) { |
| ... | ... | @@ -412,11 +449,41 @@ |
| 412 | 449 | } |
| 413 | 450 | |
| 414 | 451 | var htmlStr = template('gps_road_info_cont_temp', {array: array}); |
| 415 | - $('.gps-road-info .ct_table_body', modal).html(htmlStr); | |
| 452 | + $tbody.html(htmlStr); | |
| 453 | + initFlag = true; | |
| 454 | + gpsArray = list; | |
| 455 | + }; | |
| 456 | + | |
| 457 | + var prev; | |
| 458 | + var add = function (gps, i) { | |
| 459 | + if(i == 0) | |
| 460 | + return; | |
| 461 | + if(initFlag){ | |
| 462 | + //清理初始化的数据 | |
| 463 | + $tbody.html(''); | |
| 464 | + initFlag = false; | |
| 465 | + } | |
| 466 | + if (!gps.road) | |
| 467 | + return; | |
| 468 | + var code = gps.road.road_CODE; | |
| 469 | + if (!prev || code != prev.road.road_CODE) { | |
| 470 | + $tbody.append(template('gps_road_info_cont_temp', {array: [gps]})); | |
| 471 | + } | |
| 472 | + else{ | |
| 473 | + var dds = $tbody.find('dl[data-code=' + code + ']').last().find('dd'); | |
| 474 | + $(dds[0]).text(gps.timeStr); | |
| 475 | + $(dds[1]).text(gps.speed); | |
| 476 | + } | |
| 477 | + prev = gps; | |
| 478 | + $wrap.scrollTop($wrap[0].scrollHeight); | |
| 416 | 479 | }; |
| 417 | 480 | |
| 418 | 481 | return { |
| 419 | - showInitData: showInitData | |
| 482 | + showInitData: showInitData, | |
| 483 | + add : add, | |
| 484 | + gpsArray : function () { | |
| 485 | + return gpsArray; | |
| 486 | + } | |
| 420 | 487 | }; |
| 421 | 488 | })(); |
| 422 | 489 | |
| ... | ... | @@ -426,17 +493,16 @@ |
| 426 | 493 | */ |
| 427 | 494 | var inOutStationTableObj = (function () { |
| 428 | 495 | |
| 429 | - var data, f, prev; | |
| 496 | + var data, f, prev, initFlag; | |
| 497 | + var $wrap = $('.inout_table_wrap', modal); | |
| 498 | + var $tbody = $('.ct_table_body', $wrap); | |
| 430 | 499 | var showInitData = function (list) { |
| 431 | 500 | clear(); |
| 432 | 501 | data = []; |
| 433 | - | |
| 434 | 502 | $.each(list, function (i, gps) { |
| 435 | - | |
| 436 | 503 | prev = data[data.length - 1]; |
| 437 | 504 | if (gps['inout_stop'] == -1) |
| 438 | 505 | return true; |
| 439 | - | |
| 440 | 506 | if (gps['inout_stop'] == 0) { |
| 441 | 507 | //连续进站信号,取第一个 |
| 442 | 508 | if(prev && prev['out_ts'] == null |
| ... | ... | @@ -451,37 +517,62 @@ |
| 451 | 517 | data.push(f); |
| 452 | 518 | } |
| 453 | 519 | }); |
| 454 | - | |
| 455 | 520 | //格式化时间 |
| 456 | - $.each(data, function () { | |
| 521 | + $.each(data, function (i) { | |
| 457 | 522 | if (this.in_ts) |
| 458 | 523 | this.in_time_str = moment(this.in_ts).format('HH:mm.ss'); |
| 459 | 524 | if (this.out_ts) |
| 460 | 525 | this.out_time_str = moment(this.out_ts).format('HH:mm.ss'); |
| 526 | + //id | |
| 527 | + this.id = 'in_out_' + i; | |
| 461 | 528 | }); |
| 462 | - | |
| 463 | 529 | var htmlStr = template('multi_inout_info_cont_temp', {list: data}); |
| 464 | - $('.inout_table_wrap .ct_table_body', modal).html(htmlStr); | |
| 530 | + $tbody.html(htmlStr); | |
| 531 | + initFlag = true; | |
| 532 | + len = data.length; | |
| 465 | 533 | }; |
| 466 | 534 | |
| 467 | - var add = function (gps) { | |
| 535 | + var inoutIndex=0, len, item; | |
| 536 | + var add = function (gps, i) { | |
| 537 | + if(i == 0) | |
| 538 | + return; | |
| 539 | + if(initFlag) | |
| 540 | + clear(); | |
| 541 | + | |
| 542 | + var $dl; | |
| 543 | + for(j = inoutIndex; j < len; j++){ | |
| 544 | + item = data[j]; | |
| 545 | + $dl = $tbody.find('dl[data-id='+item.id+']'); | |
| 546 | + if(gps.ts >= item.in_ts && $dl.length==0){ | |
| 547 | + $tbody.append(template('inout_info_cont_temp', item)); | |
| 548 | + inoutIndex = j; | |
| 549 | + } | |
| 468 | 550 | |
| 551 | + if(gps.ts >= item.out_ts){ | |
| 552 | + var dds = $dl.find('dd'); | |
| 553 | + if($dl.length==0) | |
| 554 | + $tbody.append(template('inout_info_cont_temp', item)); | |
| 555 | + else | |
| 556 | + $(dds[2]).text(item.out_time_str); | |
| 557 | + inoutIndex = j; | |
| 558 | + } | |
| 559 | + else { | |
| 560 | + break; | |
| 561 | + } | |
| 562 | + } | |
| 563 | + $wrap.scrollTop($wrap[0].scrollHeight); | |
| 469 | 564 | }; |
| 470 | 565 | |
| 471 | 566 | var clear = function () { |
| 472 | - | |
| 567 | + $tbody.html(''); | |
| 568 | + initFlag = false; | |
| 473 | 569 | }; |
| 474 | 570 | |
| 475 | 571 | var createIn = function (gps) { |
| 476 | 572 | var info = gps['inout_stop_info']; |
| 477 | - return { | |
| 478 | - in_ts: info.ts, | |
| 479 | - stopNo: info.stopNo, | |
| 480 | - stopName: info.stopName | |
| 481 | - } | |
| 573 | + return {in_ts: info.ts, stopNo: info.stopNo, stopName: info.stopName} | |
| 482 | 574 | }; |
| 483 | 575 | |
| 484 | - | |
| 485 | 576 | var matchOut = function (prevInfo, gps) { |
| 486 | 577 | var oi = gps['inout_stop_info']; |
| 487 | 578 | if(prevInfo && prevInfo.stopName == oi.stopName){ |
| ... | ... | @@ -489,16 +580,13 @@ |
| 489 | 580 | return null; |
| 490 | 581 | } |
| 491 | 582 | else { |
| 492 | - return { | |
| 493 | - out_ts: oi.ts, | |
| 494 | - stopNo: oi.stopNo, | |
| 495 | - stopName: oi.stopName | |
| 496 | - } | |
| 583 | + return {out_ts: oi.ts,stopNo: oi.stopNo,stopName: oi.stopName} | |
| 497 | 584 | } |
| 498 | 585 | }; |
| 499 | 586 | |
| 500 | 587 | return { |
| 501 | - showInitData: showInitData | |
| 588 | + showInitData: showInitData, | |
| 589 | + add: add | |
| 502 | 590 | }; |
| 503 | 591 | })(); |
| 504 | 592 | |
| ... | ... | @@ -521,6 +609,11 @@ |
| 521 | 609 | this.et_str = moment(this.et).format('HH:mm.ss'); |
| 522 | 610 | }); |
| 523 | 611 | |
| 612 | + //排序 | |
| 613 | + array.sort(function (a, b) { | |
| 614 | + return a.st - b.st; | |
| 615 | + }); | |
| 616 | + | |
| 524 | 617 | var htmlStr = template('abnormal_table_cont_temp', {array: array}); |
| 525 | 618 | $('.abnormal_table .ct_table_body', modal).html(htmlStr); |
| 526 | 619 | }; |
| ... | ... | @@ -539,19 +632,381 @@ |
| 539 | 632 | if($(this).hasClass('play')){ |
| 540 | 633 | //暂停 |
| 541 | 634 | $(this).removeClass('play'); |
| 635 | + playObj.pause(); | |
| 636 | + searchForm.hideShade(); | |
| 542 | 637 | } |
| 543 | 638 | else { |
| 544 | 639 | //播放 |
| 545 | 640 | $(this).addClass('play'); |
| 641 | + playObj.play(); | |
| 642 | + playObj.fixedToCenter(); | |
| 643 | + searchForm.showShade(); | |
| 546 | 644 | } |
| 547 | 645 | }); |
| 548 | 646 | |
| 549 | - var show = function () { | |
| 647 | + //播放速度 | |
| 648 | + $('.speed_form input[name=playSpeed]', modal).on('click', function () { | |
| 649 | + playObj.setConf('playSpeed', $(this).val()); | |
| 650 | + }); | |
| 651 | + | |
| 652 | + //空间数据 | |
| 653 | + $('.buffer_area_form input[type=checkbox]', modal).on('click', function () { | |
| 654 | + playObj.setConf($(this).attr('name'), $(this)[0].checked); | |
| 655 | + mapObj.refreshOverlay(); | |
| 656 | + }); | |
| 657 | + | |
| 658 | + //进度条 | |
| 659 | + var step, $scale = $('.ct-progress-bar .scale', modal); | |
| 660 | + var upProgressBar = function (i) { | |
| 661 | + $scale.css('width', step * (i + 1)); | |
| 662 | + }; | |
| 663 | + | |
| 664 | + //导出 | |
| 665 | + $('.export-excel', modal).on('click', function () { | |
| 666 | + var base64Str = gb_map_play_back.listToExcel(trailTableObj.gpsArray()); | |
| 667 | + $(this).attr('href', base64Str); | |
| 668 | + }); | |
| 669 | + | |
| 670 | + var setExcelName = function () { | |
| 671 | + var f = $('.playBackForm', modal); | |
| 672 | + var fileName = ($('[name=nbbm]', f).val() + '轨迹数据' + $('[name=sDate]', f).val() + $('[name=sTime]', f).val() + '至' + $('[name=eDate]', f).val() + $('[name=eTime]', f).val() + '.xls').replace(new RegExp(/-/g),'').replace(new RegExp(/:/g),''); | |
| 673 | + $('.export-excel', modal).attr('download', fileName); | |
| 674 | + }; | |
| 675 | + | |
| 676 | + var gpsArray; | |
| 677 | + var show = function (rs) { | |
| 550 | 678 | $('.map-wrap-tools').show(); |
| 679 | + $('.map-container', modal).addClass('show_tools'); | |
| 680 | + //总里程 | |
| 681 | + $('.text-panel .sum_mileage', modal).text(rs.sumMileage); | |
| 682 | + | |
| 683 | + var size = rs.list.length; | |
| 684 | + $('.text-panel .count_point', modal).text(size); | |
| 685 | + step = $('.ct-progress-bar', modal).width() / size; | |
| 686 | + | |
| 687 | + //console.log('stepstep', step); | |
| 688 | + }; | |
| 689 | + | |
| 690 | + return { | |
| 691 | + show: show, | |
| 692 | + upProgressBar: upProgressBar, | |
| 693 | + setExcelName: setExcelName | |
| 694 | + } | |
| 695 | + })(); | |
| 696 | + | |
| 697 | + /** | |
| 698 | + * 地图相关 | |
| 699 | + */ | |
| 700 | + var mapObj = (function () { | |
| 701 | + var map; | |
| 702 | + var initMap = function () { | |
| 703 | + //初始化地图 | |
| 704 | + map = new BMap.Map($('.map-container', modal)[0]); | |
| 705 | + //中心点和缩放级别 | |
| 706 | + map.centerAndZoom(new BMap.Point(gb_map_consts.center_point.lng, gb_map_consts.center_point.lat), 16); | |
| 707 | + map.enableScrollWheelZoom(); | |
| 708 | + } | |
| 709 | + | |
| 710 | + var storage = window.localStorage; | |
| 711 | + var routes;//路段 | |
| 712 | + var stations;//站点 | |
| 713 | + var parks;//停车场 | |
| 714 | + | |
| 715 | + var initData = function (rs) { | |
| 716 | + var gpsArray = rs.list; | |
| 717 | + if(!gpsArray || gpsArray.length==0) | |
| 718 | + return; | |
| 719 | + var lineCode = gpsArray[0].lineId; | |
| 720 | + //从地图模块获取站点数据 | |
| 721 | + stations = gb_map_spatial_data.getStationArray(lineCode); | |
| 722 | + //从地图模块获取停车场数据 | |
| 723 | + parks = gb_map_spatial_data.carparkArray(); | |
| 724 | + //从localStorage 获取路段 | |
| 725 | + routes = JSON.parse(storage.getItem(lineCode + '_route')); | |
| 726 | + routes = [routes.up_bd, routes.down_bd]; | |
| 727 | + }; | |
| 728 | + | |
| 729 | + | |
| 730 | + /** | |
| 731 | + * 更新车辆位置 | |
| 732 | + */ | |
| 733 | + var gpsMarker; | |
| 734 | + var updateCar = function (gps) { | |
| 735 | + if(!gpsMarker){ | |
| 736 | + gpsMarker = new BMap.Marker(new BMap.Point(gps.bd_lon, gps.bd_lat)); | |
| 737 | + var width = gb_map_imap.calcGpsMarkerWidth(gps.nbbm); | |
| 738 | + gpsMarker.setIcon(new BMap.Icon(gb_map_imap.createCarIconRotation(gps, width), new BMap.Size(width, 75))); | |
| 739 | + gpsMarker.disableMassClear();//禁止marker被清除 | |
| 740 | + gpsMarker.setTop(true); | |
| 741 | + map.addOverlay(gpsMarker); | |
| 742 | + //居中 | |
| 743 | + map.panTo(gpsMarker.getPosition()); | |
| 744 | + } | |
| 745 | + else{ | |
| 746 | + gpsMarker.setPosition(new BMap.Point(gps.bd_lon, gps.bd_lat)); | |
| 747 | + var width = gb_map_imap.calcGpsMarkerWidth(gps.nbbm); | |
| 748 | + gpsMarker.setIcon(new BMap.Icon(gb_map_imap.createCarIconRotation(gps, width), new BMap.Size(width, 75))); | |
| 749 | + } | |
| 750 | + | |
| 751 | + //更新路段底图 | |
| 752 | + if(gps.upDown!=roadUpdown){ | |
| 753 | + switchPolyline(gps.upDown); | |
| 754 | + //清除轨迹线 | |
| 755 | + trailArray = []; | |
| 756 | + } | |
| 757 | + }; | |
| 758 | + | |
| 759 | + /** | |
| 760 | + * 绘制轨迹线 | |
| 761 | + */ | |
| 762 | + var trailArray=[], trailPolyline; | |
| 763 | + var updateTrailLine = function () { | |
| 764 | + trailArray.push(gpsMarker.getPosition()); | |
| 765 | + if(!trailPolyline){ | |
| 766 | + trailPolyline = new BMap.Polyline(trailArray, {strokeWeight: 3, strokeColor: '#000000'}); | |
| 767 | + trailPolyline.disableMassClear();//禁止trailPolyline被清除 | |
| 768 | + map.addOverlay(trailPolyline); | |
| 769 | + } | |
| 770 | + else{ | |
| 771 | + trailPolyline.setPath(trailArray); | |
| 772 | + } | |
| 773 | + }; | |
| 774 | + | |
| 775 | + /** | |
| 776 | + * 绘制路段底图(包括站点) | |
| 777 | + */ | |
| 778 | + var roadUpdown=-1; | |
| 779 | + var switchPolyline = function (upDown) { | |
| 780 | + if(typeof(upDown) == "undefined") | |
| 781 | + upDown = roadUpdown; | |
| 782 | + | |
| 783 | + map.clearOverlays(); | |
| 784 | + //路段 | |
| 785 | + drawRoadPolyline(upDown); | |
| 786 | + //站点 | |
| 787 | + if(playObj.getConf().drawPoint) | |
| 788 | + drawStationPoint(upDown); | |
| 789 | + //缓冲区 | |
| 790 | + if(playObj.getConf().drawBuffArea) | |
| 791 | + drawStationBfArea(upDown); | |
| 792 | + //站点名称 | |
| 793 | + if(playObj.getConf().stationName) | |
| 794 | + drawStationName(upDown); | |
| 795 | + roadUpdown = upDown; | |
| 796 | + }; | |
| 797 | + | |
| 798 | + /** | |
| 799 | + * 根据走向绘制路段 | |
| 800 | + */ | |
| 801 | + var drawRoadPolyline = function (upDown) { | |
| 802 | + var colour = gb_map_config.getConfig().section.color; | |
| 803 | + var plConfig = {strokeWeight: 12, strokeColor: upDown?colour.down:colour.up, strokeOpacity: .4}, pos; | |
| 804 | + $.each(routes[upDown], function (i, item) { | |
| 805 | + pos = []; | |
| 806 | + $.each(item.split(','), function () { | |
| 807 | + temps = this.split(' '); | |
| 808 | + pos.push(new BMap.Point(temps[0], temps[1])); | |
| 809 | + }); | |
| 810 | + map.addOverlay(new BMap.Polyline(pos, plConfig)); | |
| 811 | + }); | |
| 812 | + }; | |
| 813 | + | |
| 814 | + /** | |
| 815 | + * 根据走向绘制站点点位 | |
| 816 | + */ | |
| 817 | + var drawStationPoint = function (upDown) { | |
| 818 | + var array = stations[upDown], psm; | |
| 819 | + $.each(array, function () { | |
| 820 | + //坐标转换 | |
| 821 | + var coord = TransGPS.wgsToBD(this.lat, this.lon); | |
| 822 | + this.bd_lat = coord.lat; | |
| 823 | + this.bd_lon = coord.lng; | |
| 824 | + psm = new BMap.Marker(new BMap.Point(this.bd_lon, this.bd_lat)); | |
| 825 | + psm.setTitle(this.stationName); | |
| 826 | + map.addOverlay(psm); | |
| 827 | + psm.setIcon(new BMap.Icon(gb_map_imap.createStationPointIcon(), new BMap.Size(12, 12))); | |
| 828 | + }); | |
| 829 | + }; | |
| 830 | + | |
| 831 | + /** | |
| 832 | + * 为站点绘制缓冲区 | |
| 833 | + */ | |
| 834 | + var drawStationBfArea = function (upDown) { | |
| 835 | + var array = stations[upDown]; | |
| 836 | + $.each(array, function () { | |
| 837 | + if(this.shapesType=='r') | |
| 838 | + drawCircle(new BMap.Point(this.bd_lon, this.bd_lat), this.radius); | |
| 839 | + else if(this.shapesType=='d') | |
| 840 | + drawPolygon(this); | |
| 841 | + }); | |
| 551 | 842 | }; |
| 552 | 843 | |
| 844 | + /** | |
| 845 | + * 绘制站点名称 | |
| 846 | + */ | |
| 847 | + var drawStationName = function (upDown) { | |
| 848 | + var style = {backgroundColor: "rgba(255, 255, 255, 0.69)",color : "black", borderColor: "black", fontSize : "12px", height : "16px", lineHeight : "16px", fontFamily:"微软雅黑"} | |
| 849 | + var array = stations[upDown]; | |
| 850 | + $.each(array, function () { | |
| 851 | + var width = this.stationName.length * 12; | |
| 852 | + var label = new BMap.Label(this.stationName, { | |
| 853 | + position:new BMap.Point(this.bd_lon, this.bd_lat), | |
| 854 | + offset: new BMap.Size(-(width / 2), -27) | |
| 855 | + }); | |
| 856 | + label.setStyle(style); | |
| 857 | + map.addOverlay(label); | |
| 858 | + }); | |
| 859 | + }; | |
| 860 | + var drawCircle = function (point, radius) { | |
| 861 | + var circle = new BMap.Circle(point, radius); | |
| 862 | + circle.setStrokeColor('#000000'); | |
| 863 | + circle.setStrokeWeight(1); | |
| 864 | + map.addOverlay(circle); | |
| 865 | + }; | |
| 866 | + | |
| 867 | + var drawPolygon = function () { | |
| 868 | + | |
| 869 | + }; | |
| 870 | + | |
| 871 | + /** | |
| 872 | + * 重置 | |
| 873 | + */ | |
| 874 | + var reset = function () { | |
| 875 | + if(trailPolyline) | |
| 876 | + trailPolyline.enableMassClear(); | |
| 877 | + if(gpsMarker) | |
| 878 | + gpsMarker.enableMassClear(); | |
| 879 | + map.clearOverlays(); | |
| 880 | + roadUpdown = -1; | |
| 881 | + trailArray=[]; | |
| 882 | + trailPolyline = null; | |
| 883 | + gpsMarker = null; | |
| 884 | + }; | |
| 885 | + | |
| 886 | + /** | |
| 887 | + * 居中车辆,超出边界时 | |
| 888 | + */ | |
| 889 | + var toCenterByBounds = function () { | |
| 890 | + var markerIsVisible = BMapLib.GeoUtils.isPointInRect(gpsMarker.getPosition(),map.getBounds()); | |
| 891 | + if(!markerIsVisible) | |
| 892 | + map.panTo(gpsMarker.getPosition()); | |
| 893 | + }; | |
| 894 | + return { | |
| 895 | + initData: initData, | |
| 896 | + updateCar: updateCar, | |
| 897 | + initMap: initMap, | |
| 898 | + updateTrailLine: updateTrailLine, | |
| 899 | + refreshOverlay: switchPolyline, | |
| 900 | + toCenterByBounds: toCenterByBounds, | |
| 901 | + reset: reset | |
| 902 | + } | |
| 903 | + })(); | |
| 904 | + | |
| 905 | + /** | |
| 906 | + * 播放相关 | |
| 907 | + * @type {{}} | |
| 908 | + */ | |
| 909 | + var playObj = (function () { | |
| 910 | + var conf = { | |
| 911 | + playSpeed: 1,//播放速度 | |
| 912 | + drawPoint: 1,//绘制站点 | |
| 913 | + drawBuffArea: 1 ,//缓冲区 | |
| 914 | + stationName: 0, //站点名称 | |
| 915 | + carPark: [] //停车场 | |
| 916 | + }; | |
| 917 | + | |
| 918 | + var gpsArray;//gps点位集合 | |
| 919 | + var init = function (rs) { | |
| 920 | + gpsArray = rs.list; | |
| 921 | + if(!gpsArray || gpsArray.length==0) | |
| 922 | + return; | |
| 923 | + | |
| 924 | + len = gpsArray.length; | |
| 925 | + //渲染配置信息 | |
| 926 | + renderConfig(); | |
| 927 | + //播放第一个点 | |
| 928 | + run(); | |
| 929 | + }; | |
| 930 | + | |
| 931 | + var renderConfig = function () { | |
| 932 | + $('.speed_form [name=playSpeed][value='+conf.playSpeed+']', modal)[0].checked = true; | |
| 933 | + $('.buffer_area_form input[type=checkbox]', modal).each(function () { | |
| 934 | + var name = $(this).attr('name'); | |
| 935 | + $(this)[0].checked = conf[name]; | |
| 936 | + }); | |
| 937 | + }; | |
| 938 | + | |
| 939 | + /** | |
| 940 | + * 播放函数 | |
| 941 | + */ | |
| 942 | + var runTimer; //播放定时器 | |
| 943 | + var toCenterTimer;//居中定时器 | |
| 944 | + var index = 0; //gps下标 | |
| 945 | + var play = function () { | |
| 946 | + if(!run()) | |
| 947 | + runTimer = setTimeout(play, 1000 / conf.playSpeed); | |
| 948 | + }; | |
| 949 | + | |
| 950 | + /** | |
| 951 | + * 定时居中 | |
| 952 | + */ | |
| 953 | + var fixedToCenter = function () { | |
| 954 | + toCenterTimer = setInterval(function () { | |
| 955 | + mapObj.toCenterByBounds(); | |
| 956 | + }, 500); | |
| 957 | + }; | |
| 958 | + | |
| 959 | + var pause = function () { | |
| 960 | + clearInterval(runTimer); | |
| 961 | + runTimer = null; | |
| 962 | + clearInterval(toCenterTimer); | |
| 963 | + toCenterTimer = null; | |
| 964 | + }; | |
| 965 | + | |
| 966 | + var clock = $('.ct_btn.clock', modal), gps, len; | |
| 967 | + var run = function () { | |
| 968 | + if(index == len){ | |
| 969 | + $('.map-wrap-tools .play_btn', modal).removeClass('play'); | |
| 970 | + pause(); | |
| 971 | + notify_succ('本次轨迹回放已结束!'); | |
| 972 | + return true; | |
| 973 | + } | |
| 974 | + gps = gpsArray[index]; | |
| 975 | + //更新GPS点位 | |
| 976 | + mapObj.updateCar(gps); | |
| 977 | + //绘制轨迹线 | |
| 978 | + mapObj.updateTrailLine(); | |
| 979 | + //时间文本 | |
| 980 | + clock.text(gps.timeStr); | |
| 981 | + //输出行车轨迹 | |
| 982 | + trailTableObj.add(gps, index); | |
| 983 | + //输出到离站信息 | |
| 984 | + inOutStationTableObj.add(gps, index); | |
| 985 | + //进度条 | |
| 986 | + mapTools.upProgressBar(index); | |
| 987 | + index ++; | |
| 988 | + }; | |
| 989 | + | |
| 990 | + /** | |
| 991 | + * 重置 | |
| 992 | + */ | |
| 993 | + var reset = function () { | |
| 994 | + index = 0; | |
| 995 | + gpsArray = null; | |
| 996 | + pause(); | |
| 997 | + }; | |
| 553 | 998 | return { |
| 554 | - show: show | |
| 999 | + init: init, | |
| 1000 | + getConf: function () { | |
| 1001 | + return conf; | |
| 1002 | + }, | |
| 1003 | + setConf: function (k, v) { | |
| 1004 | + conf[k] = v; | |
| 1005 | + }, | |
| 1006 | + play: play, | |
| 1007 | + fixedToCenter: fixedToCenter, | |
| 1008 | + pause: pause, | |
| 1009 | + reset: reset | |
| 555 | 1010 | } |
| 556 | 1011 | })(); |
| 557 | 1012 | })(); | ... | ... |
src/main/resources/static/real_control_v2/mapmonitor/js/gps_tree.js
src/main/resources/static/real_control_v2/mapmonitor/js/map/iMap.js
| ... | ... | @@ -34,6 +34,7 @@ var gb_map_imap = (function () { |
| 34 | 34 | busIcon: '/real_control_v2/assets/imgs/bus1-R.png', |
| 35 | 35 | _color: color, |
| 36 | 36 | createCarIconRotation: createCarIconRotation, |
| 37 | + createStationPointIcon: createStationPointIcon, | |
| 37 | 38 | createStationIcon: createStationIcon, |
| 38 | 39 | call: function (f, opts) { |
| 39 | 40 | var instance = maps[currentMap].instance; |
| ... | ... | @@ -86,7 +87,7 @@ var gb_map_imap = (function () { |
| 86 | 87 | |
| 87 | 88 | |
| 88 | 89 | //绘制车辆icon 带角度标示 |
| 89 | - function createCarIconRotation(gps, w) { | |
| 90 | +/* function createCarIconRotation(gps, w) { | |
| 90 | 91 | if (!w) |
| 91 | 92 | w = 70; |
| 92 | 93 | |
| ... | ... | @@ -119,6 +120,81 @@ var gb_map_imap = (function () { |
| 119 | 120 | ctx.restore(); |
| 120 | 121 | |
| 121 | 122 | return canvas.toDataURL(); |
| 123 | + }*/ | |
| 124 | + | |
| 125 | + function createCarIconRotation(gps, w) { | |
| 126 | + if (!w) | |
| 127 | + w = 70; | |
| 128 | + | |
| 129 | + var canvas = $('<canvas></canvas>')[0]; | |
| 130 | + canvas.width = w; | |
| 131 | + canvas.height = 64; | |
| 132 | + var ctx = canvas.getContext('2d'); | |
| 133 | + | |
| 134 | + var colours = color(gps); | |
| 135 | + | |
| 136 | + ctx.roundRect(0, 0, w, 19, 4).stroke(); | |
| 137 | + ctx.fillStyle = colours.bgColor; | |
| 138 | + ctx.fill(); | |
| 139 | + //文字 | |
| 140 | + ctx.font = "14px arial"; | |
| 141 | + ctx.fillStyle = "#fff"; | |
| 142 | + ctx.fillText(gps.nbbm, 2, 14); | |
| 143 | + | |
| 144 | + //角度图标 | |
| 145 | + //var img = new Image(); | |
| 146 | + //img.src = rotationIcon(colours.bgColor); | |
| 147 | + ctx.save(); | |
| 148 | + ctx.translate(canvas.width / 2, canvas.height / 2); | |
| 149 | + ctx.rotate(gps.direction * Math.PI / 180); | |
| 150 | + //ctx.drawImage(img, -img.width / 2, -img.width / 2); | |
| 151 | + /** | |
| 152 | + * 绘制角度图标 | |
| 153 | + */ | |
| 154 | + ctx.beginPath(); | |
| 155 | + ctx.strokeStyle = colours.bgColor; | |
| 156 | + var circle = { | |
| 157 | + x: 0, //圆心的x轴坐标值 | |
| 158 | + y: 0, //圆心的y轴坐标值 | |
| 159 | + r: 12 //圆的半径 | |
| 160 | + }; | |
| 161 | + var d = 12.5; | |
| 162 | + //绘制圆形 | |
| 163 | + ctx.arc(circle.x, circle.y, circle.r, 0, Math.PI * 2, true); | |
| 164 | + //按照指定的路径绘制弧线 | |
| 165 | + ctx.stroke(); | |
| 166 | + ctx.fillStyle = "#ffffff"; | |
| 167 | + ctx.fill(); | |
| 168 | + //下方矩形 | |
| 169 | + ctx.beginPath(); | |
| 170 | + ctx.fillStyle = colours.bgColor; | |
| 171 | + ctx.fillRect(5 - d, 16 - d, 15, 4); | |
| 172 | + ctx.rect(5 - d, 11 - d, 7.5, 8); | |
| 173 | + ctx.rect(12.5 - d, 11 - d, 7.5, 8); | |
| 174 | + ctx.strokeStyle = colours.bgColor; | |
| 175 | + ctx.stroke(); | |
| 176 | + //上方三角形 | |
| 177 | + ctx.beginPath(); | |
| 178 | + ctx.fillStyle = "#111111"; | |
| 179 | + ctx.moveTo(12.5 - d, 3 - d); | |
| 180 | + ctx.lineTo(6.5 - d, 7.5 - d); | |
| 181 | + ctx.lineTo(18.5 - d, 7.5 - d); | |
| 182 | + ctx.closePath(); | |
| 183 | + ctx.fill(); | |
| 184 | + | |
| 185 | + ctx.restore(); | |
| 186 | + return canvas.toDataURL(); | |
| 187 | + } | |
| 188 | + | |
| 189 | + //绘制站点点位icon | |
| 190 | + function createStationPointIcon() { | |
| 191 | + var canvas = $('<canvas></canvas>')[0]; | |
| 192 | + var ctx = canvas.getContext('2d'); | |
| 193 | + ctx.beginPath(); | |
| 194 | + ctx.arc(6,6,6,0,2*Math.PI); | |
| 195 | + ctx.fillStyle = '#000000'; | |
| 196 | + ctx.fill(); | |
| 197 | + return canvas.toDataURL(); | |
| 122 | 198 | } |
| 123 | 199 | |
| 124 | 200 | |
| ... | ... | @@ -136,7 +212,7 @@ var gb_map_imap = (function () { |
| 136 | 212 | y: 12.5, //圆心的y轴坐标值 |
| 137 | 213 | r: 12 //圆的半径 |
| 138 | 214 | }; |
| 139 | - //以canvas中的坐标点(100,100)为圆心,绘制一个半径为50px的圆形 | |
| 215 | + //绘制圆形 | |
| 140 | 216 | ctx.arc(circle.x, circle.y, circle.r, 0, Math.PI * 2, true); |
| 141 | 217 | //按照指定的路径绘制弧线 |
| 142 | 218 | ctx.stroke(); | ... | ... |
src/main/resources/static/real_control_v2/mapmonitor/js/playback.js
| ... | ... | @@ -29,7 +29,7 @@ var gb_map_play_back = (function () { |
| 29 | 29 | ' <table border="1">' + |
| 30 | 30 | ' <tr><th>序号</th><th>车辆</th><th>所在道路</th><th>经度</th><th>纬度</th><th>时间</th><th>速度</th></tr>' + |
| 31 | 31 | ' {{each list as gps i}}' + |
| 32 | - ' <tr><td>{{i+1}}</td><td>{{gps.nbbm}}</td><td>{{gps.road.ROAD_NAME}}</td><td>{{gps.bd_lon}}</td><td>{{gps.bd_lat}}</td><td>{{gps.timeStr2}}</td><td>{{gps.speed}}</td></tr>' + | |
| 32 | + ' <tr><td>{{i+1}}</td><td>{{gps.nbbm}}</td><td>{{gps.road.road_NAME}}</td><td>{{gps.bd_lon}}</td><td>{{gps.bd_lat}}</td><td>{{gps.timeStr}}</td><td>{{gps.speed}}</td></tr>' + | |
| 33 | 33 | ' {{/each}}' + |
| 34 | 34 | ' </table>' + |
| 35 | 35 | ' </body>' + | ... | ... |
src/main/resources/static/real_control_v2/mapmonitor/js/spatial_data.js
| ... | ... | @@ -328,6 +328,12 @@ var gb_map_spatial_data = (function () { |
| 328 | 328 | refresh: refresh, |
| 329 | 329 | init: init, |
| 330 | 330 | getCheckedStation:getCheckedStation, |
| 331 | - gteCheckedCarpark: gteCheckedCarpark | |
| 331 | + gteCheckedCarpark: gteCheckedCarpark, | |
| 332 | + getStationArray: function (lineCode) { | |
| 333 | + return lineStationArr[lineCode]; | |
| 334 | + }, | |
| 335 | + carparkArray: function () { | |
| 336 | + return carparkArr; | |
| 337 | + } | |
| 332 | 338 | }; |
| 333 | 339 | })(); |
| 334 | 340 | \ No newline at end of file | ... | ... |