Commit 2c82f8207247834f6f5b0a435fc31a5b2be44d72

Authored by 潘钊
1 parent 41b11750

update

Showing 22 changed files with 882 additions and 114 deletions
src/main/java/com/bsth/controller/realcontrol/LineConfigController.java
1 1 package com.bsth.controller.realcontrol;
2 2  
3   -import java.util.Map;
4   -
5   -import org.springframework.beans.factory.annotation.Autowired;
6   -import org.springframework.web.bind.annotation.PathVariable;
7   -import org.springframework.web.bind.annotation.RequestMapping;
8   -import org.springframework.web.bind.annotation.RequestMethod;
9   -import org.springframework.web.bind.annotation.RequestParam;
10   -import org.springframework.web.bind.annotation.RestController;
11   -
12 3 import com.bsth.controller.BaseController;
13 4 import com.bsth.entity.realcontrol.LineConfig;
14 5 import com.bsth.service.realcontrol.LineConfigService;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.web.bind.annotation.*;
  8 +
  9 +import java.util.Map;
15 10  
16 11 @RestController
17 12 @RequestMapping("/lineConfig")
... ... @@ -39,4 +34,9 @@ public class LineConfigController extends BaseController<LineConfig, Integer>{
39 34 public Map<String, Object> editOutTimeType(@RequestParam String lineCode, @RequestParam int type){
40 35 return lineConfigService.editOutTimeType(lineCode, type);
41 36 }
  37 +
  38 + @RequestMapping(value = "/getByLineCode")
  39 + public LineConfig getByLineCode(@RequestParam String lineCode){
  40 + return lineConfigService.getByLineCode(lineCode);
  41 + }
42 42 }
... ...
src/main/java/com/bsth/controller/realcontrol/RealMapController.java
... ... @@ -26,4 +26,13 @@ public class RealMapController {
26 26 public Map<String, Object> stationSpatialData(@RequestParam String idx){
27 27 return realMapService.stationSpatialData(idx);
28 28 }
  29 +
  30 + /**
  31 + * 停车场
  32 + * @return
  33 + */
  34 + @RequestMapping(value = "/carParkSpatialData")
  35 + public Map<String, Object> carParkSpatialData(){
  36 + return realMapService.carParkSpatialData();
  37 + }
29 38 }
... ...
src/main/java/com/bsth/data/gpsdata/GpsRealData.java
... ... @@ -2,6 +2,7 @@ package com.bsth.data.gpsdata;
2 2  
3 3 import com.alibaba.fastjson.JSON;
4 4 import com.alibaba.fastjson.JSONObject;
  5 +import com.bsth.Application;
5 6 import com.bsth.data.BasicData;
6 7 import com.bsth.data.forecast.ForecastRealServer;
7 8 import com.bsth.data.schedule.DayOfSchedule;
... ... @@ -23,6 +24,7 @@ import org.springframework.stereotype.Component;
23 24 import java.io.BufferedReader;
24 25 import java.io.InputStreamReader;
25 26 import java.util.*;
  27 +import java.util.concurrent.TimeUnit;
26 28  
27 29 /**
28 30 *
... ... @@ -65,7 +67,7 @@ public class GpsRealData implements CommandLineRunner{
65 67 @Override
66 68 public void run(String... arg0) throws Exception {
67 69 logger.info("gpsDataLoader,20,6");
68   - //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 5, TimeUnit.SECONDS);
  70 + Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 5, TimeUnit.SECONDS);
69 71 }
70 72  
71 73 public GpsEntity add(GpsEntity gps) {
... ...
src/main/java/com/bsth/service/realcontrol/LineConfigService.java
1 1 package com.bsth.service.realcontrol;
2 2  
3   -import java.util.Map;
4   -
5 3 import com.bsth.entity.realcontrol.LineConfig;
6 4 import com.bsth.service.BaseService;
7 5  
  6 +import java.util.Map;
  7 +
8 8 public interface LineConfigService extends BaseService<LineConfig, Integer>{
9 9  
10 10 Map<String, Object> check(String[] codeArray);
... ... @@ -15,4 +15,5 @@ public interface LineConfigService extends BaseService&lt;LineConfig, Integer&gt;{
15 15  
16 16 Map<String, Object> editOutTimeType(String lineCode, int type);
17 17  
  18 + LineConfig getByLineCode(String lineCode);
18 19 }
... ...
src/main/java/com/bsth/service/realcontrol/RealMapService.java
... ... @@ -7,4 +7,6 @@ import java.util.Map;
7 7 */
8 8 public interface RealMapService {
9 9 Map<String, Object> stationSpatialData(String idx);
  10 +
  11 + Map<String,Object> carParkSpatialData();
10 12 }
... ...
src/main/java/com/bsth/service/realcontrol/impl/LineConfigServiceImpl.java
1 1 package com.bsth.service.realcontrol.impl;
2 2  
3   -import java.util.ArrayList;
4   -import java.util.HashMap;
5   -import java.util.List;
6   -import java.util.Map;
7   -
8   -import org.springframework.beans.factory.annotation.Autowired;
9   -import org.springframework.stereotype.Service;
10   -
11 3 import com.bsth.common.ResponseCode;
12 4 import com.bsth.data.LineConfigData;
13 5 import com.bsth.entity.realcontrol.LineConfig;
14 6 import com.bsth.repository.realcontrol.LineConfigRepository;
15 7 import com.bsth.service.impl.BaseServiceImpl;
16 8 import com.bsth.service.realcontrol.LineConfigService;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Service;
  11 +
  12 +import java.util.ArrayList;
  13 +import java.util.HashMap;
  14 +import java.util.List;
  15 +import java.util.Map;
17 16  
18 17 @Service
19 18 public class LineConfigServiceImpl extends BaseServiceImpl<LineConfig, Integer> implements LineConfigService{
... ... @@ -78,4 +77,9 @@ public class LineConfigServiceImpl extends BaseServiceImpl&lt;LineConfig, Integer&gt;
78 77 rs.put("type", type);
79 78 return rs;
80 79 }
  80 +
  81 + @Override
  82 + public LineConfig getByLineCode(String lineCode) {
  83 + return lineConfigData.get(lineCode);
  84 + }
81 85 }
... ...
src/main/java/com/bsth/service/realcontrol/impl/RealMapServiceImpl.java
... ... @@ -2,6 +2,7 @@ package com.bsth.service.realcontrol.impl;
2 2  
3 3 import com.bsth.common.ResponseCode;
4 4 import com.bsth.controller.realcontrol.dto.StationSpatialData;
  5 +import com.bsth.entity.CarPark;
5 6 import com.bsth.service.realcontrol.RealMapService;
6 7 import com.google.common.base.Splitter;
7 8 import org.slf4j.Logger;
... ... @@ -52,4 +53,22 @@ public class RealMapServiceImpl implements RealMapService {
52 53  
53 54 return rs;
54 55 }
  56 +
  57 + @Override
  58 + public Map<String, Object> carParkSpatialData() {
  59 + Map<String, Object> rs = new HashMap();
  60 +
  61 + try {
  62 + String sql = "select ID, AREA,PARK_CODE,PARK_NAME,ST_AsText(G_PARK_POINT) as G_PARK_POINT,G_CENTER_POINT,RADIUS,SHAPES_TYPE from bsth_c_car_park WHERE destroy=0";
  63 +
  64 + List<CarPark> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper(CarPark.class));
  65 + rs.put("status", ResponseCode.SUCCESS);
  66 + rs.put("list", list);
  67 + } catch (Exception e) {
  68 + logger.error("", e);
  69 + rs.put("status", ResponseCode.ERROR);
  70 + rs.put("msg", "查询停车场空间数据出现异常!");
  71 + }
  72 + return rs;
  73 + }
55 74 }
... ...
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
... ... @@ -276,8 +276,8 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
276 276 return rs;
277 277 }
278 278 //截取工号
279   - if(t.getsGh().indexOf("-") != -1){
280   - t.setsGh(t.getsGh().split("-")[1]);
  279 + if(t.getjGh().indexOf("-") != -1){
  280 + t.setjGh(t.getjGh().split("-")[1]);
281 281 }
282 282  
283 283 t.setScheduleDateStr(schDate);
... ... @@ -1631,7 +1631,8 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1631 1631 */
1632 1632 @Override
1633 1633 public Map<String, Object> multi_dftz(List<DfsjChange> dfsjcs) {
1634   - Map<String, Object> rs = new HashMap<>();
  1634 + Map<String, Object> rs = new HashMap<>()
  1635 + ,tempMap = new HashMap<>();
1635 1636 List<ScheduleRealInfo> list = new ArrayList<>();
1636 1637  
1637 1638 ScheduleRealInfo sch,next;
... ... @@ -1639,20 +1640,24 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1639 1640 if(StringUtils.isEmpty(dc.getOld_dfsj()) || StringUtils.isEmpty(dc.getNew_dfsj()))
1640 1641 continue;
1641 1642  
1642   - sch = dayOfSchedule.get(dc.getSchId());
  1643 + /*sch = dayOfSchedule.get(dc.getSchId());
1643 1644 if(sch==null)
1644 1645 continue;
1645 1646  
1646 1647 sch.setDfsjAll(dc.getNew_dfsj());
1647 1648 //重新计算终点时间
1648 1649 sch.calcEndTime();
1649   - list.add(sch);
  1650 + list.add(sch);*/
  1651 + tempMap = outgoAdjust(dc.getSchId(),"", dc.getNew_dfsj());
1650 1652  
1651   - next=dayOfSchedule.next(sch);
1652   - if(next.getQdzName().equals(sch.getZdzName())){
  1653 + if(tempMap.get("status").equals(ResponseCode.SUCCESS)){
  1654 + list.addAll((Collection<? extends ScheduleRealInfo>) tempMap.get("ts"));
  1655 + }
  1656 + //next=dayOfSchedule.next(sch);
  1657 + /*if(next.getQdzName().equals(sch.getZdzName())){
1653 1658 next.setQdzArrDateJH(sch.getZdsj());
1654 1659 list.add(next);
1655   - }
  1660 + }*/
1656 1661 }
1657 1662  
1658 1663 rs.put("status", ResponseCode.SUCCESS);
... ...
src/main/resources/static/real_control_v2/assets/js/GeoUtils_min.js 0 → 100644
  1 +var BMapLib=window.BMapLib=BMapLib||{};(function(){var a=6370996.81;var b=BMapLib.GeoUtils=function(){};b.isPointInRect=function(f,g){if(!(f instanceof BMap.Point)||!(g instanceof BMap.Bounds)){return false}var e=g.getSouthWest();var h=g.getNorthEast();return(f.lng>=e.lng&&f.lng<=h.lng&&f.lat>=e.lat&&f.lat<=h.lat)};b.isPointInCircle=function(e,h){if(!(e instanceof BMap.Point)||!(h instanceof BMap.Circle)){return false}var i=h.getCenter();var g=h.getRadius();var f=b.getDistance(e,i);if(f<=g){return true}else{return false}};b.isPointOnPolyline=function(f,h){if(!(f instanceof BMap.Point)||!(h instanceof BMap.Polyline)){return false}var e=h.getBounds();if(!this.isPointInRect(f,e)){return false}var m=h.getPath();for(var k=0;k<m.length-1;k++){var l=m[k];var j=m[k+1];if(f.lng>=Math.min(l.lng,j.lng)&&f.lng<=Math.max(l.lng,j.lng)&&f.lat>=Math.min(l.lat,j.lat)&&f.lat<=Math.max(l.lat,j.lat)){var g=(l.lng-f.lng)*(j.lat-f.lat)-(j.lng-f.lng)*(l.lat-f.lat);if(g<2e-10&&g>-2e-10){return true}}}return false};b.isPointInPolygon=function(o,l){if(!(o instanceof BMap.Point)||!(l instanceof BMap.Polygon)){return false}var k=l.getBounds();if(!this.isPointInRect(o,k)){return false}var t=l.getPath();var h=t.length;var n=true;var j=0;var g=2e-10;var s,q;var e=o;s=t[0];for(var f=1;f<=h;++f){if(e.equals(s)){return n}q=t[f%h];if(e.lat<Math.min(s.lat,q.lat)||e.lat>Math.max(s.lat,q.lat)){s=q;continue}if(e.lat>Math.min(s.lat,q.lat)&&e.lat<Math.max(s.lat,q.lat)){if(e.lng<=Math.max(s.lng,q.lng)){if(s.lat==q.lat&&e.lng>=Math.min(s.lng,q.lng)){return n}if(s.lng==q.lng){if(s.lng==e.lng){return n}else{++j}}else{var r=(e.lat-s.lat)*(q.lng-s.lng)/(q.lat-s.lat)+s.lng;if(Math.abs(e.lng-r)<g){return n}if(e.lng<r){++j}}}}else{if(e.lat==q.lat&&e.lng<=q.lng){var m=t[(f+1)%h];if(e.lat>=Math.min(s.lat,m.lat)&&e.lat<=Math.max(s.lat,m.lat)){++j}else{j+=2}}}s=q}if(j%2==0){return false}else{return true}};b.degreeToRad=function(e){return Math.PI*e/180};b.radToDegree=function(e){return(180*e)/Math.PI};function d(g,f,e){if(f!=null){g=Math.max(g,f)}if(e!=null){g=Math.min(g,e)}return g}function c(g,f,e){while(g>e){g-=e-f}while(g<f){g+=e-f}return g}b.getDistance=function(j,h){if(!(j instanceof BMap.Point)||!(h instanceof BMap.Point)){return 0}j.lng=c(j.lng,-180,180);j.lat=d(j.lat,-74,74);h.lng=c(h.lng,-180,180);h.lat=d(h.lat,-74,74);var f,e,i,g;f=b.degreeToRad(j.lng);i=b.degreeToRad(j.lat);e=b.degreeToRad(h.lng);g=b.degreeToRad(h.lat);return a*Math.acos((Math.sin(i)*Math.sin(g)+Math.cos(i)*Math.cos(g)*Math.cos(e-f)))};b.getPolylineDistance=function(f){if(f instanceof BMap.Polyline||f instanceof Array){var l;if(f instanceof BMap.Polyline){l=f.getPath()}else{l=f}if(l.length<2){return 0}var j=0;for(var h=0;h<l.length-1;h++){var k=l[h];var g=l[h+1];var e=b.getDistance(k,g);j+=e}return j}else{return 0}};b.getPolygonArea=function(t){if(!(t instanceof BMap.Polygon)&&!(t instanceof Array)){return 0}var R;if(t instanceof BMap.Polygon){R=t.getPath()}else{R=t}if(R.length<3){return 0}var w=0;var D=0;var C=0;var L=0;var J=0;var F=0;var E=0;var S=0;var H=0;var p=0;var T=0;var I=0;var q=0;var e=0;var M=0;var v=0;var K=0;var N=0;var s=0;var O=0;var l=0;var g=0;var z=0;var Q=0;var G=0;var j=0;var A=0;var o=0;var m=0;var y=0;var x=0;var h=0;var k=0;var f=0;var n=a;var B=R.length;for(var P=0;P<B;P++){if(P==0){D=R[B-1].lng*Math.PI/180;C=R[B-1].lat*Math.PI/180;L=R[0].lng*Math.PI/180;J=R[0].lat*Math.PI/180;F=R[1].lng*Math.PI/180;E=R[1].lat*Math.PI/180}else{if(P==B-1){D=R[B-2].lng*Math.PI/180;C=R[B-2].lat*Math.PI/180;L=R[B-1].lng*Math.PI/180;J=R[B-1].lat*Math.PI/180;F=R[0].lng*Math.PI/180;E=R[0].lat*Math.PI/180}else{D=R[P-1].lng*Math.PI/180;C=R[P-1].lat*Math.PI/180;L=R[P].lng*Math.PI/180;J=R[P].lat*Math.PI/180;F=R[P+1].lng*Math.PI/180;E=R[P+1].lat*Math.PI/180}}S=Math.cos(J)*Math.cos(L);H=Math.cos(J)*Math.sin(L);p=Math.sin(J);T=Math.cos(C)*Math.cos(D);I=Math.cos(C)*Math.sin(D);q=Math.sin(C);e=Math.cos(E)*Math.cos(F);M=Math.cos(E)*Math.sin(F);v=Math.sin(E);K=(S*S+H*H+p*p)/(S*T+H*I+p*q);N=(S*S+H*H+p*p)/(S*e+H*M+p*v);s=K*T-S;O=K*I-H;l=K*q-p;g=N*e-S;z=N*M-H;Q=N*v-p;m=(g*s+z*O+Q*l)/(Math.sqrt(g*g+z*z+Q*Q)*Math.sqrt(s*s+O*O+l*l));m=Math.acos(m);G=z*l-Q*O;j=0-(g*l-Q*s);A=g*O-z*s;if(S!=0){o=G/S}else{if(H!=0){o=j/H}else{o=A/p}}if(o>0){y+=m;k++}else{x+=m;h++}}var u,r;u=y+(2*Math.PI*h-x);r=(2*Math.PI*k-y)+x;if(y>x){if((u-(B-2)*Math.PI)<1){f=u}else{f=r}}else{if((r-(B-2)*Math.PI)<1){f=r}else{f=u}}w=(f-(B-2)*Math.PI)*n*n;return w}})();
0 2 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/css/main.css
... ... @@ -11,6 +11,7 @@ audio, canvas, img, svg, video {
11 11 html, body {
12 12 width: 100%;
13 13 height: 100%;
  14 + overflow: hidden;
14 15 }
15 16  
16 17 .main-container {
... ...
src/main/resources/static/real_control_v2/css/north.css
... ... @@ -38,7 +38,7 @@
38 38 }
39 39  
40 40 .north-toolbar {
41   - width: 590px;
  41 + width: 595px;
42 42 position: absolute;
43 43 right: 10px;
44 44 }
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/multi_dftz.html
... ... @@ -48,7 +48,17 @@
48 48 <script>
49 49 (function() {
50 50 var modal = '#schedule-multi-dftz-modal';
  51 + var lineConfig;
  52 + var dateStr = moment().format('YYYY-MM-DD');
  53 +
51 54 $(modal).on('init', function(e, data) {
  55 + var firstSch = data.list[0];
  56 + //获取线路配置信息
  57 + $.get('/lineConfig/getByLineCode', {lineCode: firstSch.xlBm}, function (config) {
  58 + //console.log('线路配置', config);
  59 + lineConfig=config;
  60 + });
  61 +
52 62 var bodyHtml = template('schedule-multi-dftz-table-temp', data);
53 63 $('.multi-dftz-table .ct_table_body', modal).html(bodyHtml);
54 64  
... ... @@ -93,8 +103,8 @@
93 103 });
94 104  
95 105 var valChange = function() {
96   - var old = moment($(this).data('old'), "HH:mm"),
97   - now = moment($(this).val(), "HH:mm"),
  106 + var old = correctDate(moment(dateStr+$(this).data('old'), "YYYY-MM-DDHH:mm")),
  107 + now = correctDate(moment(dateStr+$(this).val(), "YYYY-MM-DDHH:mm")),
98 108 diff = now.diff(old) / 1000 / 60,
99 109 span = $(this).next('.modify-num');
100 110  
... ... @@ -104,6 +114,17 @@
104 114 span.text('');
105 115 } else
106 116 span.addClass('negative').text('-' + Math.abs(diff));
  117 + };
  118 +
  119 +
  120 + function correctDate(d){
  121 + //小于线路运营开始时间,加一天
  122 + if(lineConfig){
  123 + var time = d.format('HH:mm');
  124 + if(time < lineConfig.startOpt)
  125 + d.add(1, 'days');
  126 + }
  127 + return d;
107 128 }
108 129  
109 130 //drag....
... ...
src/main/resources/static/real_control_v2/mapmonitor/css/real.css
... ... @@ -320,10 +320,56 @@
320 320 background: rgba(255, 255, 255, 0.98);
321 321 box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
322 322 display: none;
  323 +
  324 + padding-top: 10px;
323 325 }
324 326  
325 327 .station-route-tree{
  328 + height: 100%;
  329 + overflow: auto;
  330 + padding: 0 0 0 9px;
  331 +}
  332 +
  333 +.top-right-toggle{
  334 + position: absolute;
  335 + right: 2px;
  336 + top: 2px;
  337 +}
  338 +
  339 +.top-right-toggle ul.uk-subnav{
  340 + display: none;
  341 +}
  342 +
  343 +.top-right-toggle ul.uk-subnav>li{
  344 + padding-left: 0;
  345 +}
  346 +
  347 +.top-right-toggle ul.uk-subnav>li>a{
  348 + padding: 0 3px;
  349 + font-size: 13px;
  350 +}
  351 +
  352 +.real_spatial_body{
326 353 width: 100%;
327 354 height: 100%;
  355 + transition: all .3s ease;
  356 +}
  357 +
  358 +.real_spatial_body.show-tab{
  359 + height: calc(100% - 28px);
  360 + margin-top: 28px;
  361 +}
  362 +
  363 +.real_spatial_body #spatial-tree-content{
  364 + height: 100%;
  365 +}
  366 +
  367 +.real_spatial_body #spatial-tree-content li.car-park-item,
  368 +.real_spatial_body #spatial-tree-content li.station-route-item{
  369 + height: 100%;
328 370 overflow: auto;
  371 +}
  372 +
  373 +#spatial-tree-content .jstree-default .jstree-anchor{
  374 + font-size: 13px;
329 375 }
330 376 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/mapmonitor/fragments/map_config.html
... ... @@ -14,8 +14,8 @@
14 14 <span class="uk-form-label">空间数据</span>
15 15 <div class="uk-form-controls">
16 16 <label><input type="checkbox" name="spatial_data_station" {{if spatialData.station}}checked{{/if}}> 站点</label>
17   - <label><input type="checkbox" {{if spatialData.electronicFence}}checked{{/if}}> 电子围栏</label>
18   - <label><input type="checkbox" {{if spatialData.carPark}}checked{{/if}}> 停车场</label>
  17 + <label><input type="checkbox" name="spatial_electronicFence" {{if spatialData.electronicFence}}checked{{/if}}> 电子围栏</label>
  18 + <label><input type="checkbox" name="spatial_data_carPark" {{if spatialData.carPark}}checked{{/if}}> 停车场</label>
19 19 </div>
20 20 </div>
21 21  
... ...
src/main/resources/static/real_control_v2/mapmonitor/fragments/map_infowindow.html
1 1 <div>
2 2 <script id="map-win-gps-detail-temp" type="text/html">
3   - <div class="gps_info_win" >
  3 + <div class="gps_info_win">
4 4 <h4>{{nbbm}}</h4>
5 5 <h5>
6 6 {{lineName}}
... ... @@ -23,5 +23,64 @@
23 23 <a href="javascript:;" style="float: right;">轨迹回放</a>
24 24 </div>
25 25 </script>
26   -</div>
27   -<!-- 2222 -->
28 26 \ No newline at end of file
  27 +
  28 + <script id="map-win-station-detail-temp" type="text/html">
  29 + <div class="gps_info_win">
  30 + <h4>{{stationName}}</h4>
  31 + <p>方向:
  32 + {{if directions==0}}
  33 + 上行
  34 + {{else if directions==1}}
  35 + 下行
  36 + {{/if}}
  37 + </p>
  38 + <p>站点编码: {{stationCode}}</p>
  39 + <p>站点类型:
  40 + {{if stationMark=='B'}}
  41 + 起点站
  42 + {{else if stationMark=='E'}}
  43 + 终点站
  44 + {{else if stationMark=='Z'}}
  45 + 中途站
  46 + {{/if}}
  47 + </p>
  48 + <p>
  49 + 经度: {{lon}}
  50 + </p>
  51 + <p>纬度: {{lat}}</p>
  52 + {{if distances > 0}}
  53 + <p>到站距离: {{distances}} 公里</p>
  54 + {{/if}}
  55 + <p>
  56 + 电子围栏类型:
  57 + {{if shapesType=='r'}}
  58 + 圆形
  59 + {{else if shapesType=='d'}}
  60 + 多边形
  61 + {{/if}}
  62 + </p>
  63 + <p>
  64 + {{if shapesType=='r'}}
  65 + 半径:{{radius}}
  66 + {{else if shapesType=='d'}}
  67 + 面积:{{_polygonArea}} 平方米
  68 + {{/if}}
  69 + </p>
  70 + </div>
  71 + </script>
  72 +
  73 + <script id="map-win-carpark-detail-temp" type="text/html">
  74 + <div class="gps_info_win">
  75 + <h4>{{parkName}}</h4>
  76 + <p>停车场编码: {{parkCode}}</p>
  77 + <p>面积:{{area}}</p>
  78 + <p>
  79 + {{if shapesType=='r'}}
  80 + 电子围栏半径:{{radius}}
  81 + {{else if shapesType=='d'}}
  82 + 电子围栏面积:{{_polygonArea}} 平方米
  83 + {{/if}}
  84 + </p>
  85 + </div>
  86 + </script>
  87 +</div>
29 88 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/mapmonitor/js/config.js
... ... @@ -84,7 +84,9 @@ var gb_map_config = (function () {
84 84 var handler = {
85 85 map_type: changeMapType,
86 86 traffic: trafficSwitch,
87   - spatial_data_station: spatial_data_station
  87 + spatial_data_station: spatial_data_station,
  88 + spatial_data_carPark: spatial_data_carPark,
  89 + spatial_electronicFence: spatial_electronicFence
88 90 };
89 91  
90 92 //切换地图类型
... ... @@ -113,7 +115,26 @@ var gb_map_config = (function () {
113 115 //空间数据 站点
114 116 function spatial_data_station(val) {
115 117 defaultConfig.spatialData.station=this.checked;
116   - gb_map_spatial_data.refresh();
  118 + if(!this.checked)
  119 + gb_map_imap.call('hideAllStationMarker');
  120 + gb_map_spatial_data.refresh('station', this.checked);
  121 + }
  122 +
  123 + //空间数据 停车场
  124 + function spatial_data_carPark(val) {
  125 + defaultConfig.spatialData.carPark=this.checked;
  126 + if(!this.checked)
  127 + gb_map_imap.call('hideDrawCarpark');
  128 + gb_map_spatial_data.refresh('carPark', this.checked);
  129 + }
  130 +
  131 + //空间数据 电子围栏
  132 + function spatial_electronicFence(val) {
  133 + defaultConfig.spatialData.electronicFence=this.checked;
  134 + if(this.checked)
  135 + gb_map_overlay_mge.drawElectronicFence();
  136 + else
  137 + gb_map_imap.call('hideAllCircles');
117 138 }
118 139  
119 140 function recursion_get_attr(data, attr) {
... ...
src/main/resources/static/real_control_v2/mapmonitor/js/gps_tree.js
... ... @@ -24,8 +24,9 @@ var gb_map_gps_tree = (function () {
24 24 cb && cb();
25 25 })
26 26 .on('activate_node.jstree', function (e, n) {
  27 + //console.log('activate_node.jstree', e, n);
27 28 var node = n.node;
28   - if(node.a_attr && node.a_attr.type=='device'){
  29 + if(node.a_attr && node.a_attr.type=='device' && node.state.checked){
29 30 var device = node.a_attr.device;
30 31 gb_map_overlay_mge._focus(device);
31 32 }
... ... @@ -55,6 +56,10 @@ var gb_map_gps_tree = (function () {
55 56 }
56 57 }
57 58 },
  59 + //local storage里的key
  60 + 'state':{
  61 + 'key': 'jstree_map_devices'
  62 + },
58 63 'plugins': ['checkbox', 'contextmenu', 'state']
59 64 });
60 65 };
... ...
src/main/resources/static/real_control_v2/mapmonitor/js/map/iMap.js
... ... @@ -34,6 +34,7 @@ var gb_map_imap = (function () {
34 34 alertErr('不存在的地图实例' + mapName);
35 35 },
36 36 createCarIcon: createCarIcon,
  37 + createStationIcon: createStationIcon,
37 38 call: function (f, opts) {
38 39 var instance = maps[currentMap].instance;
39 40 if (instance[f])
... ... @@ -66,11 +67,50 @@ var gb_map_imap = (function () {
66 67 //文字
67 68 ctx.font = "14px arial";
68 69 ctx.fillStyle = "#fff";
69   - ctx.fillText(gps.nbbm, 8, 18);
  70 + ctx.fillText(gps.nbbm, 4, 18);
70 71  
71 72 return canvas.toDataURL();
72 73 }
73 74  
  75 + //绘制站点icon
  76 + function createStationIcon(station, w) {
  77 + var canvas = $('<canvas></canvas>')[0];
  78 + var ctx = canvas.getContext('2d');
  79 +
  80 +/* var color=station.directions==0?'#125688':'#fb1804'
  81 + ,bg='rgba(255, 255, 255, 0.87)';*/
  82 +
  83 + var color='#fff',
  84 + bg=station.directions==0?'#125688':'#fb1804';
  85 + //矩形
  86 + //ctx.roundRect(0, 0, w, 17, 1).stroke();
  87 + ctx.rect(-1,-1,w,17);
  88 + ctx.fillStyle = bg;
  89 + ctx.fill();
  90 + //ctx.lineWidth = 1;
  91 + //ctx.strokeStyle=color;
  92 + //ctx.stroke();
  93 +
  94 + //文字
  95 + ctx.font = "12px arial";
  96 + ctx.fillStyle = color;
  97 + ctx.fillText(station.stationName, 2, 12);
  98 +
  99 + //角
  100 + var c=w/2;
  101 + ctx.beginPath();
  102 + ctx.moveTo(c - 7,16);
  103 + ctx.lineTo(c,24);
  104 + ctx.lineTo(c + 7,16);
  105 + ctx.closePath();
  106 +
  107 + ctx.fillStyle = bg;
  108 + ctx.fill();
  109 + ctx.strokeStyle='#fff';
  110 + ctx.stroke();
  111 + return canvas.toDataURL();
  112 + }
  113 +
74 114 function color(g) {
75 115 var colours = {};
76 116 switch (g.state) {
... ...
src/main/resources/static/real_control_v2/mapmonitor/js/map/platform/baidu.js
... ... @@ -2,15 +2,20 @@
2 2 var gb_map_baidu = (function(){
3 3  
4 4 var map;
5   - var realMarkers = {};
6 5 var topMarker;
7 6 //实时路况是否打开
8   - var traffVisible;
9   - //线路 Polyline
10   - var linePolyline;
11   -
  7 + //var traffVisible;
  8 + var realMarkers = {};
  9 + //路段对照
12 10 var polylines={};
13   - var buffAreas = {};
  11 + //站点merker
  12 + var stationMarkers = {};
  13 + //电子围栏对照
  14 + var electronicFences = {};
  15 + //停车场对照
  16 + var carparks = {};
  17 + //var buffAreas = {};
  18 +
14 19  
15 20 var ctrl;
16 21 var baiduInstance = {
... ... @@ -51,15 +56,17 @@ var gb_map_baidu = (function(){
51 56  
52 57 //$('#tcWrap.maplibTc').addClass('animated bounceInLeft');
53 58 //$('.maplibTcBtn_deskTop.anchorTR').remove();
  59 +/* //缩放事件
  60 + map.addEventListener("zoomend", function(type, target){
  61 + //console.log('zoomend', type, target, map.getZoom());
  62 + //刷新站点marker
  63 + refreshStation();
  64 + });*/
54 65 },
55 66 destroy: function(){
56 67 realMarkers = {};
57   - linePolyline = [];
58   - }/*,
59   - clear: function(){
60   - realMarkers = {};
61   - map.clearOverlays();
62   - }*/,
  68 + //linePolyline = [];
  69 + },
63 70 //画线路图层
64 71 drawLine: function(opt){
65 72 if(polylines[opt.id])
... ... @@ -105,15 +112,7 @@ var gb_map_baidu = (function(){
105 112 var pos=polylines[opt.id].getPath();
106 113 console.log('定位到中心,,,', pos[parseInt(pos.length / 2)]);
107 114 map.setCenter(pos[parseInt(pos.length / 2)]);
108   - }/*,
109   - removeLine: function(opts){
110   - var polyline=polylines[opts.key];
111   - if(polyline){
112   - map.removeOverlay(polyline);
113   - polylines[opts.key]=null;
114   - delete polylines[opts.key];
115   - }
116   - }*/,
  115 + },
117 116 //绘制GPS信号
118 117 drawRealGpsMarker: function(opts){
119 118 var gpsArray = opts.gpsList;
... ... @@ -139,6 +138,65 @@ var gb_map_baidu = (function(){
139 138 }
140 139 });
141 140 },
  141 + //绘制站点marker
  142 + drawStationMarker: function (opt) {
  143 + this.hideAllStationMarker();
  144 +
  145 + var array=opt.list, marker;
  146 + $.each(array, function () {
  147 + if(stationMarkers[this.stationCode]){
  148 + stationMarkers[this.stationCode].show();
  149 + return true;
  150 + }
  151 +
  152 + transCoord(this);
  153 + marker=createStationMark(this);
  154 + map.addOverlay(marker);
  155 + stationMarkers[this.stationCode]=marker;
  156 + });
  157 + },
  158 + hideAllStationMarker: function () {
  159 + for(var code in stationMarkers){
  160 + stationMarkers[code].hide();
  161 + }
  162 + },
  163 + //绘制停车场
  164 + drawCarpark: function (opt) {
  165 + var list = opt.list;
  166 + var config = gb_map_config.getConfig()
  167 + ,color = config.section.color.up;
  168 +
  169 + this.hideDrawCarpark();
  170 + $.each(list, function () {
  171 + if(carparks[this.parkCode]){
  172 + carparks[this.parkCode].show();
  173 + return true;
  174 + }
  175 +
  176 + transMultiWGSToBd(this);
  177 + var polygon = new BMap.Polygon(this.bdPoints, {strokeColor: color, strokeWeight: 1});
  178 + map.addOverlay(polygon);
  179 + carparks[this.parkCode]=polygon;
  180 +
  181 + //中心点
  182 + var ts = this.gCenterPoint.split(' ')
  183 + ,coord = TransGPS.wgsToBD(parseFloat(ts[1]), parseFloat(ts[0]));
  184 + polygon._centerPoint = new BMap.Point(coord.lng, coord.lat);
  185 +
  186 + //info window
  187 + polygon.infoWin = new BMap.InfoWindow(gb_map_overlay_mge.map_carpark_win_temp(this), {});
  188 + polygon.addEventListener('click', function(){
  189 + console.log('aaa', this);
  190 + map.openInfoWindow(this.infoWin, this._centerPoint);
  191 + });
  192 + });
  193 + },
  194 + //隐藏停车场
  195 + hideDrawCarpark: function () {
  196 + for(var code in carparks){
  197 + carparks[code].hide();
  198 + }
  199 + },
142 200 clearAll: function () {
143 201 //清除所有覆盖物
144 202 realMarkers = {};
... ... @@ -165,45 +223,86 @@ var gb_map_baidu = (function(){
165 223 }
166 224 });
167 225 },
168   - //定位到marker
  226 + //定位到车辆 marker
169 227 goToMarker: function(opts){
170 228 var deviceId = opts.deviceId
171 229 ,m = realMarkers[deviceId];
172 230 if(m){
173   - map.panTo(m.point);
174   - setTop(m);
  231 + map.panTo(m.point, {noAnimation: true});
  232 + //setTop(m);
  233 + }
  234 + },
  235 + //定位到站点
  236 + goToStation: function (stationCode) {
  237 + var m = stationMarkers[stationCode];
  238 + if(m){
  239 + map.panTo(m.point, {noAnimation: true});
  240 + map.openInfoWindow(m.infoWin, m.point);
  241 + }
  242 + },
  243 + //定位到停车场
  244 + goToCarpark: function (parkCode) {
  245 + var polygon = carparks[parkCode];
  246 + if(polygon){
  247 + map.panTo(polygon._centerPoint, {noAnimation: true});
  248 + map.openInfoWindow(polygon.infoWin, polygon._centerPoint);
175 249 }
176 250 },
177   - //打开信息窗口
  251 + //打开车辆信息窗口
178 252 openWindow: function(opts){
179 253 var deviceId = opts.deviceId
180 254 ,m = realMarkers[deviceId];
181 255 bdOpenWindow(m);
182 256 },
  257 + //打开站点信息窗口
  258 + openStationWin: function (opt) {
  259 +
  260 + },
183 261 //绘制圆形
184   - drawCircle: function(opts){
185   - var coord = TransGPS.wgsToBD(opts.lat, opts.lon);
186   - var circle = new BMap.Circle(new BMap.Point(coord.lng, coord.lat), opts.radius);
187   - if(opts.color)
188   - circle.setStrokeColor(opts.color);
189   - if(opts.weight)
190   - circle.setStrokeWeight(opts.weight);
  262 + drawCircle: function(opt){
  263 + if(electronicFences[opt.id]){
  264 + electronicFences[opt.id].show();
  265 + return;
  266 + }
  267 +
  268 + var coord = TransGPS.wgsToBD(opt.lat, opt.lon);
  269 + var circle = new BMap.Circle(new BMap.Point(coord.lng, coord.lat), opt.radius);
  270 + circle.setStrokeColor(opt.color);
  271 + circle.setStrokeWeight(opt.weight);
191 272  
192 273 map.addOverlay(circle);
193   - buffAreas[opts.id] = circle;
  274 + electronicFences[opt.id] = circle;
  275 + },
  276 + hideAllCircles: function () {
  277 + for(var code in electronicFences){
  278 + electronicFences[code].hide();
  279 + }
194 280 },
195 281 //绘制多边形
196   - drawPolygon: function(opts){
197   - var wgs,coord, points = [];
198   - $.each(opts.cds, function(){
199   - wgs = this.split(' ');
200   - coord = TransGPS.wgsToBD(parseFloat(wgs[1]), parseFloat(wgs[0]));
201   - points.push(new BMap.Point(coord.lng, coord.lat));
202   - });
  282 + drawPolygon: function(opt){
  283 + var station = opt.station
  284 + ,code = station.stationCode;
  285 + if(electronicFences[code]){
  286 + electronicFences[code].show();
  287 + return;
  288 + }
203 289  
204   - var polygon = new BMap.Polygon(points, {strokeColor: opts.color, strokeWeight: opts.weight, strokeOpacity: 0.7});
  290 + transMultiWGSToBd(station);
  291 + var polygon = new BMap.Polygon(station.bdPoints, {strokeColor: opt.color, strokeWeight: opt.weight});
205 292 map.addOverlay(polygon);
206   - buffAreas[opts.id] = polygon;
  293 + electronicFences[code]=polygon;
  294 +
  295 +/*
  296 + //计算多边形面积
  297 + var area=BMapLib.GeoUtils.getPolygonArea(polygon);
  298 + if(!isNaN(area))
  299 + polygon._polygonArea=area+'米';
  300 + else
  301 + polygon._polygonArea='计算失败';
  302 +
  303 + polygon.addEventListener('click', function(){
  304 + map.openInfoWindow(this.infoWin, marker.point);
  305 + });*/
207 306 },
208 307 //删除缓冲区
209 308 clearBuffArea: function(code){
... ... @@ -214,6 +313,65 @@ var gb_map_baidu = (function(){
214 313 }
215 314 };
216 315  
  316 + function transMultiWGSToBd(obj) {
  317 + if(!obj._gPoints)
  318 + return;
  319 + var bdPoints = [],coord;
  320 + $.each(obj._gPoints, function () {
  321 + coord = TransGPS.wgsToBD(this.lat, this.lng);
  322 + bdPoints.push(new BMap.Point(coord.lng, coord.lat));
  323 + });
  324 +
  325 + obj.bdPoints=bdPoints;
  326 + }
  327 +
  328 +/* function transCoordCarpark(carpark) {
  329 + var pStr = carpark.gParkPoint.substring(9, carpark.gParkPoint.length - 2);
  330 + var pArr = filterPolygonCoords(pStr.split(',')), coord, points=[];
  331 +
  332 + $.each(pArr, function (i, str) {
  333 + var c = str.split(' ');
  334 + coord = TransGPS.wgsToBD(parseFloat(c[1]), parseFloat(c[0]));
  335 + points.push(new BMap.Point(coord.lng, coord.lat));
  336 + });
  337 + carpark.bdPoints=points;
  338 + }
  339 +
  340 + function transPolygonStation(opt) {
  341 + var pStr = opt.polygon.substring(9, opt.polygon.length - 2);
  342 + var pArr = filterPolygonCoords(pStr.split(',')), coord, points=[];
  343 +
  344 + $.each(pArr, function (i, str) {
  345 + var c = str.split(' ');
  346 + coord = TransGPS.wgsToBD(parseFloat(c[1]), parseFloat(c[0]));
  347 + points.push(new BMap.Point(coord.lng, coord.lat));
  348 + });
  349 + opt.bdPoints=points;
  350 + }*/
  351 +
  352 +/* //处理多边形点数组
  353 + function filterPolygonCoords(pArr) {
  354 + var newArr=[];
  355 + //去掉已闭合的尾
  356 + var end=pArr.length - 1;
  357 + if(pArr.length > 1 && pArr[0] == pArr[end])
  358 + pArr = pArr.slice(0, end);
  359 +
  360 + //去掉连续的重复点
  361 + var last;
  362 + $.each(pArr, function (i, str) {
  363 + if(last){
  364 + if(last != str)
  365 + newArr.push(str);
  366 + }
  367 + else
  368 + newArr.push(str);
  369 + last = str;
  370 + });
  371 +
  372 + return newArr;
  373 + }*/
  374 +
217 375 function transCoord(gps) {
218 376 var coord = TransGPS.wgsToBD(gps.lat, gps.lon);
219 377 gps.bd_lat = coord.lat;
... ... @@ -231,9 +389,10 @@ var gb_map_baidu = (function(){
231 389 var marker = new BMap.Marker(point);
232 390  
233 391 //根据编码长度 计算marker 宽度
234   - var w = gpsData.nbbm.length * 10;
  392 + var w = calcGpsMarkerWidth(gpsData.nbbm);//gpsData.nbbm.length * 10;
235 393 marker.setIcon(new BMap.Icon(gb_map_imap.createCarIcon(gpsData, w), new BMap.Size(w,25)));
236 394  
  395 + marker._icon_width=w;
237 396 marker.infoWindow = new BMap.InfoWindow(bd_gps_info_win_opts);
238 397 marker.gpsData = gpsData;
239 398 //click
... ... @@ -241,8 +400,52 @@ var gb_map_baidu = (function(){
241 400 bdOpenWindow(this);
242 401 });
243 402 //mouseover
244   - marker.addEventListener('mouseover', function(){
  403 + /*marker.addEventListener('mouseover', function(){
245 404 setTop(this);
  405 + });*/
  406 + marker.setTop(true);
  407 + return marker;
  408 + }
  409 +
  410 + //为每个数字定义宽度
  411 +/* var icon_num_width=[
  412 + 7,6,7,7,7,7,7,7,7,7
  413 + ];*/
  414 + function calcGpsMarkerWidth(nbbm) {
  415 + var width=0;
  416 + $.each(nbbm.split(''), function () {
  417 + if(!isNaN(this))
  418 + width += 7;//icon_num_width[this];
  419 + else if(this=='-')
  420 + width += 10;
  421 + else
  422 + width += 16;
  423 + });
  424 + return width;
  425 + }
  426 +
  427 + function createStationMark(statio) {
  428 + var point = new BMap.Point(statio.bd_lon, statio.bd_lat);
  429 + var marker = new BMap.Marker(point);
  430 +
  431 + //根据编码长度 计算marker 宽度
  432 + var w = statio.stationName.length * 12 + 4
  433 + ,iw=w-2;
  434 + var icon = new BMap.Icon(gb_map_imap.createStationIcon(statio, w), new BMap.Size(iw,24), {anchor: new BMap.Size(iw/2,24)})
  435 + marker.setIcon(icon);
  436 +
  437 + //信息窗口
  438 + marker.infoWin=new BMap.InfoWindow(gb_map_overlay_mge.map_station_win_temp(statio), {});
  439 + marker.addEventListener('click', function(){
  440 + map.openInfoWindow(this.infoWin, this.point);
  441 + });
  442 +
  443 + //mouseover
  444 + marker.addEventListener('mouseover', function(){
  445 + this.setTop(true);
  446 + });
  447 + marker.addEventListener('mouseout', function () {
  448 + this.setTop(false);
246 449 });
247 450 return marker;
248 451 }
... ... @@ -269,12 +472,18 @@ var gb_map_baidu = (function(){
269 472 });
270 473 }*/
271 474  
  475 +/* function refreshStation() {
  476 + //console.log('refreshStation', map.getZoom());
  477 + var zoom=map.getZoom();
  478 +
  479 + }*/
  480 +
272 481 function moveMarker(m, gps){
273 482 m.setPosition(new BMap.Point(gps.bd_lon, gps.bd_lat));
274 483 m.gpsData = gps;
275 484 //重新设置icon
276 485 //根据编码长度 计算marker 宽度
277   - var w = gps.nbbm.length * 10;
  486 + var w = m._icon_width;//calcGpsMarkerWidth(gps.nbbm);//gps.nbbm.length * 10;
278 487 m.setIcon(new BMap.Icon(gb_map_imap.createCarIcon(gps, w), new BMap.Size(w,25)));
279 488  
280 489 //更新 infoWindow
... ...
src/main/resources/static/real_control_v2/mapmonitor/js/map_overlay_manager.js
... ... @@ -106,18 +106,105 @@ var gb_map_overlay_mge = (function () {
106 106 //打开信息窗口
107 107 gb_map_imap.call('openWindow',{deviceId: deviceId});
108 108 };
  109 +
  110 + //站点获得焦点
  111 + var _focus_station = function (station) {
  112 + gb_map_imap.call('goToStation', station.stationCode);
  113 + }
  114 +
  115 + //停车场获得焦点
  116 + var _focus_carpark = function (carpark) {
  117 + //console.log('_focus_carpark', carpark);
  118 + gb_map_imap.call('goToCarpark', carpark.parkCode);
  119 + }
109 120  
110 121 function getCheckedDevice() {
111 122 return gb_map_gps_tree.getChecked().filter(deviceFilter);
112 123 }
  124 +
  125 + //绘制站点
  126 + var drawStation = function () {
  127 + var list = gb_map_spatial_data.getCheckedStation();
  128 + //绘制站点
  129 + gb_map_imap.call('drawStationMarker', {list: list});
  130 + //绘制电子围栏
  131 + drawElectronicFence(list);
  132 + }
  133 +
  134 + //绘制电子围栏
  135 + var drawElectronicFence = function (list) {
  136 + var config = gb_map_config.getConfig().spatialData;
  137 + if(!config.electronicFence)
  138 + return;
  139 +
  140 + if(!list){
  141 + list = gb_map_spatial_data.getCheckedStation();
  142 + }
  143 +
  144 +
  145 + gb_map_imap.call('hideAllCircles');
  146 + $.each(list, function () {
  147 + fun=this.shapesType=='r'?drawCircle:drawPolygon;
  148 + fun(this);
  149 + });
  150 + }
  151 +
  152 + //绘制停车场
  153 + var drawCarpark = function () {
  154 + var list = gb_map_spatial_data.gteCheckedCarpark();
  155 + gb_map_imap.call('drawCarpark', {list: list});
  156 + }
  157 +
  158 + var drawCircle=function (data) {
  159 + var config = gb_map_config.getConfig().section.color;
  160 + var color = data.directions==0?config.up:config.down;
  161 +
  162 + var opt = {
  163 + lon: data.lon,
  164 + lat: data.lat,
  165 + text: data.stationName,
  166 + color: color,
  167 + weight: 2,
  168 + radius: parseFloat(data.radius),
  169 + id: data.stationCode
  170 + };
  171 +
  172 + gb_map_imap.call('drawCircle', opt);
  173 + }
  174 +
  175 + var drawPolygon=function (data) {
  176 + var config = gb_map_config.getConfig().section.color;
  177 + var color = data.directions==0?config.up:config.down;
  178 +
  179 + var opt = {
  180 + //id:data.stationCode,
  181 + color: color,
  182 + weight: 2,
  183 + station: data
  184 + };
  185 +
  186 + gb_map_imap.call('drawPolygon', opt);
  187 + }
  188 +
113 189 return {
114 190 init: init,
115 191 refresh: showOverlayByChecks,
116 192 _focus: _focus,
  193 + _focus_station: _focus_station,
  194 + _focus_carpark: _focus_carpark,
117 195 map_gps_win_temp: function (data) {
118 196 return temps['map-win-gps-detail-temp'](data);
119 197 },
  198 + map_station_win_temp: function (data) {
  199 + return temps['map-win-station-detail-temp'](data);
  200 + },
  201 + map_carpark_win_temp: function (data) {
  202 + return temps['map-win-carpark-detail-temp'](data);
  203 + },
120 204 reDraw: reDraw,
121   - getCheckedDevice: getCheckedDevice
  205 + getCheckedDevice: getCheckedDevice,
  206 + drawStation: drawStation,
  207 + drawElectronicFence: drawElectronicFence,
  208 + drawCarpark: drawCarpark
122 209 };
123 210 })();
124 211 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/mapmonitor/js/spatial_data.js
... ... @@ -13,13 +13,28 @@ var gb_map_spatial_data = (function () {
13 13 return str.substr(1);
14 14 })();
15 15  
  16 + var cont = '#spatial-tree-content';
16 17 //线路站点路由数据
17 18 var lineStationArr;
18 19  
  20 + //停车场数据
  21 + var carparkArr;
19 22  
20 23 var init = function () {
  24 + //加载站点路由数据
21 25 gb_common.$get('/realMap/stationSpatialData', {idx: line_idx}, function (rs) {
22 26 var list = rs.list;
  27 + $.each(list, function () {
  28 + this.lat = this.gLaty;
  29 + this.lon = this.gLonx;
  30 + delete this.gLaty;
  31 + delete this.gLonx;
  32 + if(this.shapesType=='d'){
  33 + var calcRs = calcPolygonArea(this.gPolygonGrid);
  34 + this._polygonArea = calcRs._polygonArea;
  35 + this._gPoints = calcRs._gPoints;
  36 + }
  37 + });
23 38 //排序
24 39 list.sort(function (a, b) {
25 40 return a.stationRouteCode - b.stationRouteCode;
... ... @@ -31,42 +46,232 @@ var gb_map_spatial_data = (function () {
31 46 lineStationArr[lineCode] = gb_common.groupBy(lineStationArr[lineCode], 'directions');
32 47 }
33 48  
  49 + ep.emitLater('station');
  50 + });
  51 +
  52 + //加载停车场数据
  53 + gb_common.$get('/realMap/carParkSpatialData', {}, function (rs) {
  54 + carparkArr = rs.list;
  55 + $.each(carparkArr, function () {
  56 + if(this.shapesType=='d'){
  57 + var calcRs = calcPolygonArea(this.gParkPoint);
  58 + this._polygonArea = calcRs._polygonArea;
  59 + this._gPoints = calcRs._gPoints;
  60 + }
  61 + });
  62 + ep.emitLater('carpark');
  63 + });
  64 +
  65 + var ep = EventProxy.create('station', 'carpark', function () {
  66 + $(".real_spatial_panel").resizable({
  67 + maxHeight: '100%',
  68 + minHeight: 18
  69 + });
  70 +
  71 + //绘制站点路由树
  72 + $('.station-route-tree', cont)
  73 + //state插件 状态恢复完成
  74 + .on('state_ready.jstree', function () {
  75 + //绑定checkbox状态切换事件
  76 + $(this).on('check_node.jstree uncheck_node.jstree', gb_map_overlay_mge.drawStation);
  77 + })
  78 + .on('activate_node.jstree', function (e, n) {
  79 + var node = n.node;
  80 + if(node.state.checked)
  81 + gb_map_overlay_mge._focus_station(node.data);
  82 + })
  83 + .jstree({
  84 + 'core': {
  85 + 'data': get_st_route_tree_data()
  86 + },
  87 + 'checkbox': {
  88 + 'keep_selected_style': false,
  89 + 'whole_node': false,
  90 + 'tie_selection': false
  91 + },
  92 + //local storage里的key
  93 + 'state': {
  94 + 'key': 'jstree_map_station_route'
  95 + },
  96 + 'plugins': ['checkbox', 'state']
  97 + });
  98 +
  99 +
  100 + //停车场
  101 + $('.carpark-panel', cont)
  102 + .on('state_ready.jstree', function () {
  103 + //绑定checkbox状态切换事件
  104 + $(this).on('check_node.jstree uncheck_node.jstree', gb_map_overlay_mge.drawCarpark);
  105 + })
  106 + .on('activate_node.jstree', function (e, n) {
  107 + var node = n.node;
  108 + if(node.state.checked)
  109 + gb_map_overlay_mge._focus_carpark(node.data);
  110 + })
  111 + .jstree({
  112 + 'core': {
  113 + 'data': get_st_carpark_tree_data()
  114 + },
  115 + 'checkbox': {
  116 + 'keep_selected_style': false,
  117 + 'whole_node': false,
  118 + 'tie_selection': false
  119 + },
  120 + //local storage里的key
  121 + 'state': {
  122 + 'key': 'jstree_map_carpark'
  123 + },
  124 + 'plugins': ['checkbox', 'state']
  125 + });
  126 +
34 127 refresh();
35 128 });
36 129 }
37 130  
38   - var refresh = function () {
  131 + //计算多边形面积
  132 + function calcPolygonArea(polygonStr) {
  133 + var pStr = polygonStr.substring(9, polygonStr.length - 2);
  134 + var array = pStr.split(',');
  135 + var newArr=[];
  136 +
  137 + //递归去掉闭合的尾
  138 + (function () {
  139 + var f = arguments.callee;
  140 + var end=array.length - 1;
  141 + if(array.length > 1 && array[0] == array[end]){
  142 + array = array.slice(0, end);
  143 + f();
  144 + }
  145 + })();
  146 +
  147 + //去掉连续的重复点
  148 + var last;
  149 + $.each(array, function (i, str) {
  150 + if(last){
  151 + if(last != str)
  152 + newArr.push(str);
  153 + }
  154 + else
  155 + newArr.push(str);
  156 + last = str;
  157 + });
  158 +
  159 + var gPoints=[],ts;
  160 + $.each(newArr, function (i, c) {
  161 + ts=c.split(' ');
  162 + gPoints.push({
  163 + lat: parseFloat(ts[1]),
  164 + lng: parseFloat(ts[0])
  165 + });
  166 + });
  167 +
  168 + //用百度geo工具库计算面积
  169 + var _polygonArea = BMapLib.GeoUtils.getPolygonArea(gPoints);
  170 + return {_polygonArea: _polygonArea.toFixed(2), _gPoints: gPoints};
  171 + }
  172 +
  173 + var refresh = function (type, checked) {
39 174 if (!triggerElem())
40 175 return;
41 176  
42   - //绘制站点路由树
43   - $('.station-route-tree').jstree({
44   - 'core': {
45   - 'data': get_st_route_tree_data()
46   - },
47   - 'checkbox': {
48   - 'keep_selected_style': false,
49   - 'whole_node': false,
50   - 'tie_selection': false
51   - },
52   - 'plugins': ['checkbox', 'state']
53   - });
  177 + if ((type == 'carPark' && checked) || (type == 'station' && !checked)) {
  178 + //显示停车场面板
  179 + $('.car-park-item', cont).addClass('uk-active');
  180 + $('li.cp-tab-btn', '.real_spatial_panel').addClass('uk-active');
  181 + $('.carpark-panel', cont).jstree(true).check_all();
  182 +
  183 + //绘制停车场
  184 + gb_map_overlay_mge.drawCarpark();
  185 + }
  186 + else {
  187 + //显示站点路由面板
  188 + $('.station-route-item', cont).addClass('uk-active');
  189 + $('li.sr-tab-btn', '.real_spatial_panel').addClass('uk-active');
  190 +
  191 + //选中相关站点路由树
  192 + var chs = gb_map_overlay_mge.getCheckedDevice();
  193 + var idx = {};
  194 + $.each(chs, function () {
  195 + idx[this.data.lineId + '_' + this.data.upDown] = 1;
  196 + });
  197 +
  198 + var treeObj = $('.station-route-tree', cont).jstree(true);
  199 + for (var id in idx) {
  200 + treeObj.check_node(treeObj.get_node(id + '_st'));
  201 + }
  202 +
  203 + //drawStation();
  204 + gb_map_overlay_mge.drawStation();
  205 + }
54 206 }
55 207  
56 208 var triggerElem = function () {
57   - var config = gb_map_config.getConfig().spatialData
58   - , elem = $('.real_spatial_panel');
  209 + var config = gb_map_config.getConfig().spatialData;
59 210  
60   - for (var att in config) {
61   - if (config[att]) {
62   - elem.show();
63   - return true;
64   - }
  211 + if(config.station || config.carPark){
  212 + showPanel();
  213 + return true;
65 214 }
66   - elem.hide();
  215 + hidePanel();
  216 + gb_map_imap.call('hideAllStationMarker');
  217 + gb_map_imap.call('hideDrawCarpark');
67 218 return false;
68 219 }
69 220  
  221 + var animationend = 'webkitAnimationEnd animationend';
  222 + var showPanel = function () {
  223 + var elem = $('.real_spatial_panel');
  224 + var config = gb_map_config.getConfig().spatialData;
  225 +
  226 + if (config.station && config.carPark) {
  227 + anim_show($('.uk-subnav', elem), 'uk-animation-scale-up');
  228 + $('.real_spatial_body', elem).addClass('show-tab');
  229 + }
  230 + else {
  231 + $('.uk-subnav', elem).hide();
  232 + $('.real_spatial_body', elem).removeClass('show-tab');
  233 + }
  234 +
  235 + $('li.uk-active', elem).removeClass('uk-active');
  236 +
  237 + if (!elem.is(":hidden"))
  238 + return;
  239 +
  240 + anim_show(elem, 'uk-animation-slide-left');
  241 + }
  242 +
  243 + var hidePanel = function () {
  244 + var elem = $('.real_spatial_panel');
  245 + elem.hide();
  246 + }
  247 +
  248 + function anim_show(e, anim) {
  249 + e.addClass(anim).show().one(animationend, function () {
  250 + $(this).removeClass(anim);
  251 + });
  252 + }
  253 +
  254 + function getCheckedStation() {
  255 + var list = [];
  256 + var chs = $('.station-route-tree', cont).jstree(true).get_checked(true);
  257 + chs = chs.filter(function (item) {
  258 + return item.data;
  259 + });
  260 + $.each(chs, function () {
  261 + list.push(this.data);
  262 + });
  263 + return list;
  264 + }
  265 +
  266 + function gteCheckedCarpark() {
  267 + var list = [];
  268 + var chs = $('.carpark-panel', cont).jstree(true).get_checked(true);
  269 + $.each(chs, function () {
  270 + list.push(this.data);
  271 + });
  272 + return list;
  273 + }
  274 +
70 275 var get_st_route_tree_data = function () {
71 276 var treeData = [];
72 277  
... ... @@ -74,14 +279,17 @@ var gb_map_spatial_data = (function () {
74 279 name = gb_data_basic.codeToLine[lineCode].name;
75 280 treeData.push({
76 281 'text': name,
  282 + 'open': true,
77 283 'children': [
78 284 {
79 285 'text': '上行',
80 286 'children': grabs(lineStationArr[lineCode][0]),
  287 + 'id': lineCode + '_0_st'
81 288 },
82 289 {
83 290 'text': '下行',
84 291 'children': grabs(lineStationArr[lineCode][1]),
  292 + 'id': lineCode + '_1_st'
85 293 }
86 294 ]
87 295 })
... ... @@ -89,6 +297,19 @@ var gb_map_spatial_data = (function () {
89 297 return treeData;
90 298 };
91 299  
  300 + var get_st_carpark_tree_data = function () {
  301 + var treeData = [];
  302 +
  303 + $.each(carparkArr, function () {
  304 + treeData.push({
  305 + 'text': this.parkName,
  306 + 'data': this
  307 + });
  308 + });
  309 +
  310 + return treeData;
  311 + }
  312 +
92 313 var grabs = function (array) {
93 314 if (!array)
94 315 return;
... ... @@ -96,7 +317,7 @@ var gb_map_spatial_data = (function () {
96 317 $.each(array, function () {
97 318 rs.push({
98 319 'text': this.stationName,
99   - 'data': {},
  320 + 'data': this,
100 321 'icon': false
101 322 });
102 323 });
... ... @@ -105,6 +326,8 @@ var gb_map_spatial_data = (function () {
105 326  
106 327 return {
107 328 refresh: refresh,
108   - init: init
  329 + init: init,
  330 + getCheckedStation:getCheckedStation,
  331 + gteCheckedCarpark: gteCheckedCarpark
109 332 };
110 333 })();
111 334 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/mapmonitor/real.html
... ... @@ -25,16 +25,29 @@
25 25 <div class="real_bl_cont">
26 26  
27 27 </div>
28   - <div class="real_br_cont map_config_wrap">
29   - </div>
  28 + <div class="real_br_cont map_config_wrap"></div>
30 29 </div>
31 30  
32   -<div class="real_spatial_panel uk-animation-scale">
33   - <div class="station-route-tree">
34   -
  31 +<div class="real_spatial_panel">
  32 + <div class="top-right-toggle">
  33 + <ul class="uk-subnav uk-subnav-pill" data-uk-switcher="{connect:'#spatial-tree-content'}">
  34 + <li class="sr-tab-btn"><a>站点</a></li>
  35 + <li class="cp-tab-btn"><a>停车场</a></li>
  36 + </ul>
  37 + </div>
  38 + <div class="real_spatial_body">
  39 + <ul id="spatial-tree-content" class="uk-switcher">
  40 + <li class="station-route-item">
  41 + <div class="station-route-tree"></div>
  42 + </li>
  43 + <li class="car-park-item">
  44 + <div class="carpark-panel"></div>
  45 + </li>
  46 + </ul>
35 47 </div>
36 48 </div>
37 49  
  50 +<script src="/real_control_v2/assets/js/GeoUtils_min.js"></script>
38 51 <script src="/real_control_v2/mapmonitor/js/config.js"></script>
39 52 <script src="/real_control_v2/mapmonitor/js/gps_tree.js"></script>
40 53 <script src="/real_control_v2/mapmonitor/js/spatial_data.js"></script>
... ...