|
2 | 2 | <html> |
3 | 3 | <head> |
4 | 4 | <meta charset="UTF-8"> |
5 | | - <title>航班监测-Elasticsearch服务示例</title> |
| 5 | + <title>航班监控</title> |
6 | 6 | <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"> |
7 | | - <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css"> |
| 7 | + <link rel="stylesheet" |
| 8 | + href="http://cdn.bootcss.com/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css"> |
8 | 9 | <link rel="stylesheet" href="http://cdn.bootcss.com/leaflet/1.0.3/leaflet.css"> |
9 | 10 | <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap-select/1.12.2/css/bootstrap-select.min.css"> |
10 | 11 | <style> |
|
26 | 27 | <script type="text/javascript" src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> |
27 | 28 | <script type="text/javascript" src="http://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> |
28 | 29 | <script type="text/javascript" src="http://cdn.bootcss.com/moment.js/2.18.1/moment.min.js"></script> |
29 | | -<script type="text/javascript" src="http://cdn.bootcss.com/bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script> |
| 30 | +<script type="text/javascript" |
| 31 | + src="http://cdn.bootcss.com/bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script> |
30 | 32 | <script type="text/javascript" src="http://cdn.bootcss.com/moment.js/2.18.1/locale/zh-cn.js"></script> |
31 | 33 | <script type="text/javascript" src="http://cdn.bootcss.com/bootstrap-select/1.12.2/js/bootstrap-select.min.js"></script> |
32 | 34 | <script type="text/javascript" src="http://mapv.baidu.com/build/mapv.js"></script> |
|
37 | 39 | <script type="text/javascript"> |
38 | 40 | var map; |
39 | 41 | var timeControl, |
40 | | - liveESService,//实时点查询的ESService |
41 | | - trackESService,//历史轨迹查询的ESService |
42 | | - liveRenderer,//实时点层 |
43 | | - trackRenderer,//历史轨迹层 |
44 | | - liveDataSet,//渲染用实时点数据集 |
45 | | - trackDataSet,//渲染用历史轨迹线数据集 |
46 | | - planeStyles, |
47 | | - planeLabels,//航班信息提示框集合 |
48 | | - geoFenceLabels,//地理围栏信息提示框集合 |
49 | | - geoFenceLayer, |
50 | | - dataUrl = "192.168.13.192:9200"; |
| 42 | + liveESService,//实时点查询的ESService |
| 43 | + trackESService,//历史轨迹查询的ESService |
| 44 | + liveRenderer,//实时点层 |
| 45 | + trackRenderer,//历史轨迹层 |
| 46 | + liveDataSet,//渲染用实时点数据集 |
| 47 | + trackDataSet,//渲染用历史轨迹线数据集 |
| 48 | + planeStyles, |
| 49 | + planeLabels,//航班信息提示框集合 |
| 50 | + geoFenceLabels,//地理围栏信息提示框集合 |
| 51 | + geoFenceLayer, |
| 52 | + dataUrl = "http://117.122.248.69:9200"; |
51 | 53 |
|
52 | 54 | var flightIdens = [ |
53 | 55 | 'CCA4189', 'CCA4187', 'CBJ5531', 'CSC8747', 'TBA9879', |
|
62 | 64 | initMap(); |
63 | 65 | liveESService = new SuperMap.ElasticSearchService(dataUrl, { |
64 | 66 | change: renderLive, |
65 | | - outOfGeoFence: renderOutOfGeoFenceLabel |
| 67 | + outOfGeoFence: renderOutOfGeoFenceLabel, |
| 68 | + openGeoFence: true |
66 | 69 | }); |
67 | 70 | trackESService = new SuperMap.ElasticSearchService(dataUrl, { |
68 | | - change: renderTrack |
| 71 | + change: renderTrack, |
| 72 | + openGeoFence: true |
69 | 73 | }); |
70 | 74 | planeStyles = initPlaneStyles(); |
71 | 75 | } |
|
101 | 105 | loadTrackData(); |
102 | 106 | } |
103 | 107 |
|
104 | | - var datetime = moment(currentTime).format("YYYY-MM-DD HH:mm:ss"); |
| 108 | + var datetime = moment(currentTime).format("YYYY-MM-DDTHH:mm:ss") + "Z"; |
105 | 109 | var options = getServiceParamOptions(); |
106 | 110 | var liveParameters = []; |
107 | 111 | for (var i = 0; i < options.flightIds.length; i++) { |
108 | 112 | var code = options.flightIds[i]; |
109 | 113 | if (code === 'ZUUU') { |
110 | 114 | continue; |
111 | 115 | } |
112 | | - var sParam = new SuperMap.MatchParameter('ident', code); |
113 | | - var filterParam = new SuperMap.MatchParameter('datetime', datetime); |
114 | | - var params = new SuperMap.ElasticSearchParameter({ |
115 | | - index: "aliveflight", |
116 | | - type: "flight", |
117 | | - sort: {datetime: {order: "ASC"}}, |
118 | | - must: sParam, |
119 | | - filter: filterParam |
| 116 | + liveParameters.push({index: "flights", type: "flight_utc"}); |
| 117 | + liveParameters.push({ |
| 118 | + "query": { |
| 119 | + "bool": { |
| 120 | + "must": {"match": {"ident": code}}, |
| 121 | + "filter": {"match": {"datetime": datetime}}, |
| 122 | + } |
| 123 | + }, |
| 124 | + "sort": {"time-ms": {"order": "ASC"}}, |
| 125 | + "from": 0, |
| 126 | + "size": 20 |
120 | 127 | }); |
121 | | - liveParameters.push(params); |
122 | 128 | } |
123 | | - liveESService.msearch(liveParameters); |
| 129 | + liveESService.msearch({body: liveParameters}); |
124 | 130 | updateProgress(datetime); |
125 | 131 | } |
126 | 132 |
|
127 | 133 | //第一次请求先查询历史轨迹数据,只调用一次 |
128 | 134 | function loadTrackData() { |
129 | 135 | var start = timeControl.getStartTime(); |
130 | 136 | var end = timeControl.getEndTime(); |
131 | | - var startTime = moment(start).format("YYYY-MM-DD HH:mm:ss"); |
132 | | - var endTime = moment(end).format("YYYY-MM-DD HH:mm:ss"); |
133 | 137 | var options = getServiceParamOptions(); |
134 | 138 | var trackParameters = []; |
135 | 139 | for (var i = 0; i < options.flightIds.length; i++) { |
136 | 140 | var code = options.flightIds[i]; |
137 | 141 | if (code === 'ZUUU') { |
138 | 142 | continue; |
139 | 143 | } |
140 | | - var sParam = new SuperMap.MatchParameter('ident', code); |
141 | | - var filterParam = new SuperMap.RangeParameter("datetime", null, startTime, null, endTime); |
142 | | - var params = new SuperMap.ElasticSearchParameter({ |
143 | | - index: "aliveflight", |
144 | | - type: "flight", |
145 | | - sort: {datetime: {order: "ASC"}}, |
146 | | - size: 10000, |
147 | | - must: sParam, |
148 | | - filter: filterParam |
| 144 | + trackParameters.push({index: "flights", type: "flight_utc"}); |
| 145 | + trackParameters.push({ |
| 146 | + "query": { |
| 147 | + "bool": { |
| 148 | + "must": {"match": {"ident": code}}, |
| 149 | + "filter": { |
| 150 | + "range": { |
| 151 | + "time-ms": { |
| 152 | + "gte": start, |
| 153 | + "lte": end |
| 154 | + } |
| 155 | + } |
| 156 | + }, |
| 157 | + } |
| 158 | + }, |
| 159 | + "sort": {"time-ms": {"order": "ASC"}}, |
| 160 | + "from": 0, |
| 161 | + "size": 10000 |
149 | 162 | }); |
150 | | - trackParameters.push(params); |
| 163 | + |
151 | 164 | } |
152 | | - trackESService.msearch(trackParameters); |
| 165 | + trackESService.msearch({body: trackParameters}); |
153 | 166 | } |
154 | 167 |
|
155 | 168 |
|
|
264 | 277 | var content = data[i].content; |
265 | 278 | var latlng = L.latLng(content.y, content.x); |
266 | 279 | var labelContent = "航班: " + content.ident + "<br>" + |
267 | | - "始发地: " + content.origin + "/" + content.originLabel + "<br>" + |
268 | | - "目的地: " + content.destination + "/" + content.destinationLabel + "<br>" + |
269 | | - "时间: " + content.datetime; |
| 280 | + "始发地: " + content.origin + "/" + content.originLabel + "<br>" + |
| 281 | + "目的地: " + content.destination + "/" + content.destinationLabel + "<br>" + |
| 282 | + "时间: " + content.datetime; |
270 | 283 | if (!planeLabels[content.ident]) { |
271 | 284 | planeLabels[content.ident] = L.popup({ |
272 | 285 | closeOnClick: false, |
|
385 | 398 |
|
386 | 399 | //默认设置参数 |
387 | 400 | function getDefaultControlOptions() { |
388 | | - var start = "2017-05-03 10:22:31"; |
389 | | - var end = "2017-05-03 17:00:00"; |
| 401 | + var startMs = 1498781767725; |
| 402 | + var endMs = 1498935332876; |
| 403 | + var start = moment(startMs).format("YYYY-MM-DDTHH:mm:ss") + "Z"; |
| 404 | + var end = moment(endMs).format("YYYY-MM-DDTHH:mm:ss") + "Z"; |
390 | 405 | return { |
391 | 406 | startTime: start, |
392 | 407 | endTime: end, |
|
404 | 419 | zoom: 5, |
405 | 420 | crs: L.CRS.EPSG3857 |
406 | 421 | }); |
407 | | - var mbAttr = 'Imagery © <a href="http://mapbox.com">Mapbox</a>', |
408 | | - token = "pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw", |
409 | | - mbUrl = 'https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=' + token; |
| 422 | + var mbAttr = 'Imagery © <a href="http://mapbox.com">Mapbox</a> with ' + |
| 423 | + '<a href="http://iclient.supermapol.com">SuperMap iClient</a> ' + |
| 424 | + 'with <a href="https://www.elastic.co/products/elasticsearch">ElasticSearch</a>', |
| 425 | + token = "pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw", |
| 426 | + mbUrl = 'https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=' + token; |
410 | 427 |
|
411 | 428 | L.tileLayer(mbUrl, {id: 'mapbox.dark', attribution: mbAttr}).addTo(map); |
412 | 429 | } |
|
423 | 440 | me._div = L.DomUtil.create('div', 'panel panel-primary controlPane'); |
424 | 441 | me._div.style.width = "300px"; |
425 | 442 | var titleDiv = $("<div class='panel-heading text-center' id='toggle' style='cursor: pointer'>" + |
426 | | - "<span class='panel-title text-center'>控制台</span> " + |
427 | | - "<span class='glyphicon glyphicon-triangle-top' id='toggleIcon' ></span></div>").appendTo(me._div); |
| 443 | + "<span class='panel-title text-center'>控制台</span> " + |
| 444 | + "<span class='glyphicon glyphicon-triangle-top' id='toggleIcon' ></span></div>").appendTo(me._div); |
428 | 445 |
|
429 | 446 | var contentDiv = $("<div class='panel-body content center-block' style='font-size: 14px'></div>").appendTo(me._div); |
430 | 447 |
|
431 | 448 | var optionsDiv = $("<div class='' id='options'></div>").appendTo(contentDiv); |
432 | 449 |
|
433 | 450 | $("<div class='form-group'><label class='text-right' for='flightIds' >" + |
434 | | - "航班号<span style='color:red'>*</span></label>" + |
435 | | - "<select class='selectpicker ' id='flightIds' multiple data-actions-box='true' title='请选择'>" + |
436 | | - initSelectOpitons() + |
437 | | - "</select></div><hr/>").appendTo(optionsDiv); |
| 451 | + "航班号<span style='color:red'>*</span></label>" + |
| 452 | + "<select class='selectpicker ' id='flightIds' multiple data-actions-box='true' title='请选择'>" + |
| 453 | + initSelectOpitons() + |
| 454 | + "</select></div><hr/>").appendTo(optionsDiv); |
438 | 455 |
|
439 | 456 | function initSelectOpitons() { |
440 | 457 | var str = ''; |
|
452 | 469 | var defaultOption = getDefaultControlOptions(); |
453 | 470 | var defaultGeoFence = getDefaultGeoFence(); |
454 | 471 | $("<div class='form-group form-inline'><label class='text-right' for='geoFence' >地理围栏</label>" + |
455 | | - "<input id='geoFence' type='text' class='form-control input-sm' placeholder='" + JSON.stringify(defaultGeoFence) + |
456 | | - "' value='" + JSON.stringify(defaultGeoFence) + "'/></div></div><hr/>").appendTo(optionsDiv); |
| 472 | + "<input id='geoFence' type='text' class='form-control input-sm' placeholder='" + JSON.stringify(defaultGeoFence) + |
| 473 | + "' value='" + JSON.stringify(defaultGeoFence) + "'/></div></div><hr/>").appendTo(optionsDiv); |
457 | 474 |
|
458 | 475 | $("<div class='form-group form-inline'><label class='text-right' for='startTime' >起始时间<span style='color:red'>*</span></label>" + |
459 | | - "<input id='startTime' type='text' class='form-control input-sm' placeholder='" + defaultOption.startTime + |
460 | | - "' value='" + defaultOption.startTime + "'/></div></div>").appendTo(optionsDiv); |
| 476 | + "<input id='startTime' type='text' class='form-control input-sm' placeholder='" + defaultOption.startTime + |
| 477 | + "' value='" + defaultOption.startTime + "'/></div></div>").appendTo(optionsDiv); |
461 | 478 |
|
462 | 479 | $("<div class='form-group form-inline'><label class='text-right' for='endTime' >终止时间<span style='color:red'>*</span></label>" + |
463 | | - "<input id='endTime' type='text' class='form-control input-sm' placeholder='" + defaultOption.endTime + |
464 | | - "' value='" + defaultOption.endTime + "'/></div></div>").appendTo(optionsDiv); |
| 480 | + "<input id='endTime' type='text' class='form-control input-sm' placeholder='" + defaultOption.endTime + |
| 481 | + "' value='" + defaultOption.endTime + "'/></div></div>").appendTo(optionsDiv); |
465 | 482 |
|
466 | 483 | $("<div class='form-group form-inline'><label class='text-right' for='speed' >刷新步长(ms)</label>" + |
467 | | - "<input id='speed' type='number' min='1' class='form-control input-sm' placeholder='" + defaultOption.speed + |
468 | | - "' value='" + defaultOption.speed + "'/></div></div>").appendTo(optionsDiv); |
| 484 | + "<input id='speed' type='number' min='1' class='form-control input-sm' placeholder='" + defaultOption.speed + |
| 485 | + "' value='" + defaultOption.speed + "'/></div></div>").appendTo(optionsDiv); |
469 | 486 |
|
470 | 487 | $("<div class='form-group form-inline'><label class='text-right' for='frequency' >刷新频率(ms)</label>" + |
471 | | - "<input id='frequency' type='number' min='1' class='form-control input-sm' placeholder='" + defaultOption.frequency + |
472 | | - "' value='" + defaultOption.frequency + "'/></div></div>").appendTo(optionsDiv); |
| 488 | + "<input id='frequency' type='number' min='1' class='form-control input-sm' placeholder='" + defaultOption.frequency + |
| 489 | + "' value='" + defaultOption.frequency + "'/></div></div>").appendTo(optionsDiv); |
473 | 490 |
|
474 | 491 | var progressDiv = $("<div class='form-group'><div class='form-horizontal text-center'><div class='form-group'>" + |
475 | | - "<label for='progress'>当前时间:</label><span class='form-control-static' id='progress'>未开始</span>" + |
476 | | - "</div></div></div>").appendTo(contentDiv); |
| 492 | + "<label for='progress'>当前时间:</label><span class='form-control-static' id='progress'>未开始</span>" + |
| 493 | + "</div></div></div>").appendTo(contentDiv); |
477 | 494 |
|
478 | 495 | var controlDiv = $("<section><div class='form-inline text-center'>" + |
479 | | - "<input id='start' type='button' class='btn btn-default text-center' value='开始'/> " + |
480 | | - "<input id='pause' type='button' class='btn btn-default text-center' value='暂停'/> " + |
481 | | - "<input id='stop' type='button' class='btn btn-default text-center' value='停止'/>" + |
482 | | - "</div></section>").appendTo(contentDiv); |
| 496 | + "<input id='start' type='button' class='btn btn-default text-center' value='开始'/> " + |
| 497 | + "<input id='pause' type='button' class='btn btn-default text-center' value='暂停'/> " + |
| 498 | + "<input id='stop' type='button' class='btn btn-default text-center' value='停止'/>" + |
| 499 | + "</div></section>").appendTo(contentDiv); |
483 | 500 |
|
484 | 501 |
|
485 | 502 | me._div.addEventListener('mouseover', function () { |
|
0 commit comments