Commit c29701fe64d3d27722db2e880cec82bb47df1002

Authored by 娄高锋
2 parents c1dc14d5 92693332

Merge branch 'pudong' of 192.168.168.201:panzhaov5/bsth_control into pudong

src/main/resources/static/real_control_v2/mapmonitor/js/spatial_data.js
1   -/** 空间数据 */
2   -
3   -var gb_map_spatial_data = (function () {
4   -
5   - var storage = window.localStorage;
6   -
7   - var activeLines = JSON.parse(storage.getItem('lineControlItems'));
8   - var line_idx = (function () {
9   - var str = '';
10   - for (var i = 0, item; item = activeLines[i++];) {
11   - str += (',' + item.lineCode);
12   - }
13   - return str.substr(1);
14   - })();
15   -
16   - var cont = '#spatial-tree-content';
17   - //线路站点路由数据
18   - var lineStationArr;
19   -
20   - //停车场数据
21   - var carparkArr;
22   -
23   - var init = function () {
24   - //加载站点路由数据
25   - gb_common.$get('/realMap/stationVersionSpatialData', {idx: line_idx}, function (rs) {
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   - });
38   - //排序
39   - list.sort(function (a, b) {
40   - return a.stationRouteCode - b.stationRouteCode;
41   - });
42   - //按线路分组
43   - lineStationArr = gb_common.groupBy(list, 'lineCode');
44   - //再按上下行分组
45   - for (var lineCode in lineStationArr) {
46   - lineStationArr[lineCode] = gb_common.groupBy(lineStationArr[lineCode], 'directions');
47   - }
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   -
127   - refresh();
128   - });
129   - };
130   -
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) {
174   - if (!triggerElem())
175   - return;
176   -
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   - }
206   - }
207   -
208   - var triggerElem = function () {
209   - var config = gb_map_config.getConfig().spatialData;
210   -
211   - if(config.station || config.carPark){
212   - showPanel();
213   - return true;
214   - }
215   - hidePanel();
216   - //gb_map_imap.call('hideAllStationMarker');
217   - //gb_map_imap.call('hideDrawCarpark');
218   - return false;
219   - }
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   -
275   - var get_st_route_tree_data = function () {
276   - var treeData = [];
277   -
278   - for (var lineCode in lineStationArr) {
279   - name = gb_data_basic.codeToLine[lineCode].name;
280   - treeData.push({
281   - 'text': name,
282   - 'open': true,
283   - 'children': [
284   - {
285   - 'text': '上行',
286   - 'children': grabs(lineStationArr[lineCode][0]),
287   - 'id': lineCode + '_0_st'
288   - },
289   - {
290   - 'text': '下行',
291   - 'children': grabs(lineStationArr[lineCode][1]),
292   - 'id': lineCode + '_1_st'
293   - }
294   - ]
295   - })
296   - }
297   - return treeData;
298   - };
299   - var get_st_route_tree_data_version = function () {
300   - var treeData = [];
301   -
302   - for (var lineCode in lineVersionStationArr) {
303   - name = gb_data_basic.codeToLine[lineCode].name;
304   - treeData.push({
305   - 'text': name,
306   - 'open': true,
307   - 'children': [
308   - {
309   - 'text': '上行',
310   - 'children': grabs(lineVersionStationArr[lineCode][0]),
311   - 'id': lineCode + '_0_st'
312   - },
313   - {
314   - 'text': '下行',
315   - 'children': grabs(lineVersionStationArr[lineCode][1]),
316   - 'id': lineCode + '_1_st'
317   - }
318   - ]
319   - })
320   - }
321   - return treeData;
322   - };
323   - var get_st_carpark_tree_data = function () {
324   - var treeData = [];
325   -
326   - $.each(carparkArr, function () {
327   - treeData.push({
328   - 'text': this.parkName,
329   - 'data': this
330   - });
331   - });
332   -
333   - return treeData;
334   - }
335   -
336   - var grabs = function (array) {
337   - if (!array)
338   - return;
339   - var rs = [];
340   - $.each(array, function () {
341   - rs.push({
342   - 'text': this.stationName,
343   - 'data': this,
344   - 'icon': false
345   - });
346   - });
347   - return rs;
348   - }
349   -
350   - return {
351   - refresh: refresh,
352   - init: init,
353   - getCheckedStation:getCheckedStation,
354   - gteCheckedCarpark: gteCheckedCarpark,
355   - getStationArray: function (lineCode) {
356   - return lineStationArr[lineCode];
357   - },
358   - carparkArray: function () {
359   - return carparkArr;
360   - }
361   - };
  1 +/** 空间数据 */
  2 +
  3 +var gb_map_spatial_data = (function () {
  4 +
  5 + var storage = window.localStorage;
  6 +
  7 + var activeLines = JSON.parse(storage.getItem('lineControlItems'));
  8 + var line_idx = (function () {
  9 + var str = '';
  10 + for (var i = 0, item; item = activeLines[i++];) {
  11 + str += (',' + item.lineCode);
  12 + }
  13 + return str.substr(1);
  14 + })();
  15 +
  16 + var cont = '#spatial-tree-content';
  17 + //线路站点路由数据
  18 + var lineStationArr, currentLineStationArr;
  19 +
  20 + //停车场数据
  21 + var carparkArr;
  22 +
  23 + var init = function () {
  24 +
  25 + //加载各线路当前版本站点路由数据
  26 + gb_common.$get('/realMap/stationSpatialData', {idx: line_idx}, function (rs) {
  27 + var list = rs.list;
  28 + $.each(list, function () {
  29 + this.lat = this.gLaty;
  30 + this.lon = this.gLonx;
  31 + delete this.gLaty;
  32 + delete this.gLonx;
  33 + if(this.shapesType=='d'){
  34 + var calcRs = calcPolygonArea(this.gPolygonGrid);
  35 + this._polygonArea = calcRs._polygonArea;
  36 + this._gPoints = calcRs._gPoints;
  37 + }
  38 + });
  39 + //排序
  40 + list.sort(function (a, b) {
  41 + return a.stationRouteCode - b.stationRouteCode;
  42 + });
  43 + //按线路分组
  44 + currentLineStationArr = gb_common.groupBy(list, 'lineCode');
  45 + //再按上下行分组
  46 + for (var lineCode in currentLineStationArr) {
  47 + currentLineStationArr[lineCode] = gb_common.groupBy(currentLineStationArr[lineCode], 'directions');
  48 + }
  49 +
  50 + ep.emitLater('currentstation');
  51 + });
  52 +
  53 + //加载各线路所有版本站点路由数据(轨迹回放时用)
  54 + gb_common.$get('/realMap/stationVersionSpatialData', {idx: line_idx}, function (rs) {
  55 + var list = rs.list;
  56 + $.each(list, function () {
  57 + this.lat = this.gLaty;
  58 + this.lon = this.gLonx;
  59 + delete this.gLaty;
  60 + delete this.gLonx;
  61 + if(this.shapesType=='d'){
  62 + var calcRs = calcPolygonArea(this.gPolygonGrid);
  63 + this._polygonArea = calcRs._polygonArea;
  64 + this._gPoints = calcRs._gPoints;
  65 + }
  66 + });
  67 + //排序
  68 + list.sort(function (a, b) {
  69 + return a.stationRouteCode - b.stationRouteCode;
  70 + });
  71 + //按线路分组
  72 + lineStationArr = gb_common.groupBy(list, 'lineCode');
  73 + //再按上下行分组
  74 + for (var lineCode in lineStationArr) {
  75 + lineStationArr[lineCode] = gb_common.groupBy(lineStationArr[lineCode], 'directions');
  76 + }
  77 +
  78 + ep.emitLater('station');
  79 + });
  80 +
  81 + //加载停车场数据
  82 + gb_common.$get('/realMap/carParkSpatialData', {}, function (rs) {
  83 + carparkArr = rs.list;
  84 + $.each(carparkArr, function () {
  85 + if(this.shapesType=='d'){
  86 + var calcRs = calcPolygonArea(this.gParkPoint);
  87 + this._polygonArea = calcRs._polygonArea;
  88 + this._gPoints = calcRs._gPoints;
  89 + }
  90 + });
  91 + ep.emitLater('carpark');
  92 + });
  93 +
  94 + var ep = EventProxy.create('currentstation', 'station', 'carpark', function () {
  95 + $(".real_spatial_panel").resizable({
  96 + maxHeight: '100%',
  97 + minHeight: 18
  98 + });
  99 +
  100 + //绘制站点路由树
  101 + $('.station-route-tree', cont)
  102 + //state插件 状态恢复完成
  103 + .on('state_ready.jstree', function () {
  104 + //绑定checkbox状态切换事件
  105 + $(this).on('check_node.jstree uncheck_node.jstree', gb_map_overlay_mge.drawStation);
  106 + })
  107 + .on('activate_node.jstree', function (e, n) {
  108 + var node = n.node;
  109 + if(node.state.checked)
  110 + gb_map_overlay_mge._focus_station(node.data);
  111 + })
  112 + .jstree({
  113 + 'core': {
  114 + 'data': get_st_route_tree_data()
  115 + },
  116 + 'checkbox': {
  117 + 'keep_selected_style': false,
  118 + 'whole_node': false,
  119 + 'tie_selection': false
  120 + },
  121 + //local storage里的key
  122 + 'state': {
  123 + 'key': 'jstree_map_station_route'
  124 + },
  125 + 'plugins': ['checkbox', 'state']
  126 + });
  127 +
  128 +
  129 + //停车场
  130 + $('.carpark-panel', cont)
  131 + .on('state_ready.jstree', function () {
  132 + //绑定checkbox状态切换事件
  133 + $(this).on('check_node.jstree uncheck_node.jstree', gb_map_overlay_mge.drawCarpark);
  134 + })
  135 + .on('activate_node.jstree', function (e, n) {
  136 + var node = n.node;
  137 + if(node.state.checked)
  138 + gb_map_overlay_mge._focus_carpark(node.data);
  139 + })
  140 + .jstree({
  141 + 'core': {
  142 + 'data': get_st_carpark_tree_data()
  143 + },
  144 + 'checkbox': {
  145 + 'keep_selected_style': false,
  146 + 'whole_node': false,
  147 + 'tie_selection': false
  148 + },
  149 + //local storage里的key
  150 + 'state': {
  151 + 'key': 'jstree_map_carpark'
  152 + },
  153 + 'plugins': ['checkbox', 'state']
  154 + });
  155 +
  156 + refresh();
  157 + });
  158 + };
  159 +
  160 + //计算多边形面积
  161 + function calcPolygonArea(polygonStr) {
  162 + var pStr = polygonStr.substring(9, polygonStr.length - 2);
  163 + var array = pStr.split(',');
  164 + var newArr=[];
  165 +
  166 + //递归去掉闭合的尾
  167 + (function () {
  168 + var f = arguments.callee;
  169 + var end=array.length - 1;
  170 + if(array.length > 1 && array[0] == array[end]){
  171 + array = array.slice(0, end);
  172 + f();
  173 + }
  174 + })();
  175 +
  176 + //去掉连续的重复点
  177 + var last;
  178 + $.each(array, function (i, str) {
  179 + if(last){
  180 + if(last != str)
  181 + newArr.push(str);
  182 + }
  183 + else
  184 + newArr.push(str);
  185 + last = str;
  186 + });
  187 +
  188 + var gPoints=[],ts;
  189 + $.each(newArr, function (i, c) {
  190 + ts=c.split(' ');
  191 + gPoints.push({
  192 + lat: parseFloat(ts[1]),
  193 + lng: parseFloat(ts[0])
  194 + });
  195 + });
  196 +
  197 + //用百度geo工具库计算面积
  198 + var _polygonArea = BMapLib.GeoUtils.getPolygonArea(gPoints);
  199 + return {_polygonArea: _polygonArea.toFixed(2), _gPoints: gPoints};
  200 + }
  201 +
  202 + var refresh = function (type, checked) {
  203 + if (!triggerElem())
  204 + return;
  205 +
  206 + if ((type == 'carPark' && checked) || (type == 'station' && !checked)) {
  207 + //显示停车场面板
  208 + $('.car-park-item', cont).addClass('uk-active');
  209 + $('li.cp-tab-btn', '.real_spatial_panel').addClass('uk-active');
  210 + $('.carpark-panel', cont).jstree(true).check_all();
  211 +
  212 + //绘制停车场
  213 + gb_map_overlay_mge.drawCarpark();
  214 + }
  215 + else {
  216 + //显示站点路由面板
  217 + $('.station-route-item', cont).addClass('uk-active');
  218 + $('li.sr-tab-btn', '.real_spatial_panel').addClass('uk-active');
  219 +
  220 + //选中相关站点路由树
  221 + var chs = gb_map_overlay_mge.getCheckedDevice();
  222 + var idx = {};
  223 + $.each(chs, function () {
  224 + idx[this.data.lineId + '_' + this.data.upDown] = 1;
  225 + });
  226 +
  227 + var treeObj = $('.station-route-tree', cont).jstree(true);
  228 + for (var id in idx) {
  229 + treeObj.check_node(treeObj.get_node(id + '_st'));
  230 + }
  231 +
  232 + //drawStation();
  233 + gb_map_overlay_mge.drawStation();
  234 + }
  235 + }
  236 +
  237 + var triggerElem = function () {
  238 + var config = gb_map_config.getConfig().spatialData;
  239 +
  240 + if(config.station || config.carPark){
  241 + showPanel();
  242 + return true;
  243 + }
  244 + hidePanel();
  245 + //gb_map_imap.call('hideAllStationMarker');
  246 + //gb_map_imap.call('hideDrawCarpark');
  247 + return false;
  248 + }
  249 +
  250 + var animationend = 'webkitAnimationEnd animationend';
  251 + var showPanel = function () {
  252 + var elem = $('.real_spatial_panel');
  253 + var config = gb_map_config.getConfig().spatialData;
  254 +
  255 + if (config.station && config.carPark) {
  256 + anim_show($('.uk-subnav', elem), 'uk-animation-scale-up');
  257 + $('.real_spatial_body', elem).addClass('show-tab');
  258 + }
  259 + else {
  260 + $('.uk-subnav', elem).hide();
  261 + $('.real_spatial_body', elem).removeClass('show-tab');
  262 + }
  263 +
  264 + $('li.uk-active', elem).removeClass('uk-active');
  265 +
  266 + if (!elem.is(":hidden"))
  267 + return;
  268 +
  269 + anim_show(elem, 'uk-animation-slide-left');
  270 + }
  271 +
  272 + var hidePanel = function () {
  273 + var elem = $('.real_spatial_panel');
  274 + elem.hide();
  275 + }
  276 +
  277 + function anim_show(e, anim) {
  278 + e.addClass(anim).show().one(animationend, function () {
  279 + $(this).removeClass(anim);
  280 + });
  281 + }
  282 +
  283 + function getCheckedStation() {
  284 + var list = [];
  285 + var chs = $('.station-route-tree', cont).jstree(true).get_checked(true);
  286 + chs = chs.filter(function (item) {
  287 + return item.data;
  288 + });
  289 + $.each(chs, function () {
  290 + list.push(this.data);
  291 + });
  292 + return list;
  293 + }
  294 +
  295 + function gteCheckedCarpark() {
  296 + var list = [];
  297 + var chs = $('.carpark-panel', cont).jstree(true).get_checked(true);
  298 + $.each(chs, function () {
  299 + list.push(this.data);
  300 + });
  301 + return list;
  302 + }
  303 +
  304 + var get_st_route_tree_data = function () {
  305 + var treeData = [];
  306 +
  307 + for (var lineCode in currentLineStationArr) {
  308 + name = gb_data_basic.codeToLine[lineCode].name;
  309 + treeData.push({
  310 + 'text': name,
  311 + 'open': true,
  312 + 'children': [
  313 + {
  314 + 'text': '上行',
  315 + 'children': grabs(currentLineStationArr[lineCode][0]),
  316 + 'id': lineCode + '_0_st'
  317 + },
  318 + {
  319 + 'text': '下行',
  320 + 'children': grabs(currentLineStationArr[lineCode][1]),
  321 + 'id': lineCode + '_1_st'
  322 + }
  323 + ]
  324 + })
  325 + }
  326 + return treeData;
  327 + };
  328 + var get_st_route_tree_data_version = function () {
  329 + var treeData = [];
  330 +
  331 + for (var lineCode in lineVersionStationArr) {
  332 + name = gb_data_basic.codeToLine[lineCode].name;
  333 + treeData.push({
  334 + 'text': name,
  335 + 'open': true,
  336 + 'children': [
  337 + {
  338 + 'text': '上行',
  339 + 'children': grabs(lineVersionStationArr[lineCode][0]),
  340 + 'id': lineCode + '_0_st'
  341 + },
  342 + {
  343 + 'text': '下行',
  344 + 'children': grabs(lineVersionStationArr[lineCode][1]),
  345 + 'id': lineCode + '_1_st'
  346 + }
  347 + ]
  348 + })
  349 + }
  350 + return treeData;
  351 + };
  352 + var get_st_carpark_tree_data = function () {
  353 + var treeData = [];
  354 +
  355 + $.each(carparkArr, function () {
  356 + treeData.push({
  357 + 'text': this.parkName,
  358 + 'data': this
  359 + });
  360 + });
  361 +
  362 + return treeData;
  363 + }
  364 +
  365 + var grabs = function (array) {
  366 + if (!array)
  367 + return;
  368 + var rs = [];
  369 + $.each(array, function () {
  370 + rs.push({
  371 + 'text': this.stationName,
  372 + 'data': this,
  373 + 'icon': false
  374 + });
  375 + });
  376 + return rs;
  377 + }
  378 +
  379 + return {
  380 + refresh: refresh,
  381 + init: init,
  382 + getCheckedStation:getCheckedStation,
  383 + gteCheckedCarpark: gteCheckedCarpark,
  384 + getStationArray: function (lineCode) {
  385 + return lineStationArr[lineCode];
  386 + },
  387 + carparkArray: function () {
  388 + return carparkArr;
  389 + }
  390 + };
362 391 })();
363 392 \ No newline at end of file
... ...