/* * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Ext.define('Traccar.view.map.MapController', { extend: 'Ext.app.ViewController', alias: 'controller.map', config: { listen: { controller: { '*': { reportShow: 'reportShow', reportClear: 'reportClear', selectDevice: 'selectDevice', selectReport: 'selectReport' } } } }, init: function() { this.liveData = {}; this.update(true); }, update: function(first) { Ext.Ajax.request({ scope: this, url: '/api/async', params: { first: first }, success: function(response) { var data = Ext.decode(response.responseText).data; var i; for (i = 0; i < data.length; i++) { // TODO check if exists and update var store = Ext.getStore('LiveData'); var found = store.query('deviceId', data[i].deviceId); if (found.getCount() > 0) { var model = found.first(); model.set(data[i]); //store.commitChanges(); need for update? } else { store.add(Ext.create('Traccar.model.Position', data[i])); } var geometry = new ol.geom.Point(ol.proj.fromLonLat([ data[i].longitude, data[i].latitude ])); if (data[i].deviceId in this.liveData) { this.liveData[data[i].deviceId].setGeometry(geometry); } else { var style = this.getMarkerStyle(styles.map_live_radius, styles.map_live_color); var marker = new ol.Feature({ geometry: geometry, originalStyle: style }); marker.setStyle(style); this.getView().vectorSource.addFeature(marker); this.liveData[data[i].deviceId] = marker; } } this.update(false); }, failure: function() { // TODO: error } }); }, getLineStyle: function() { return new ol.style.Style({ stroke: new ol.style.Stroke({ color: styles.map_stroke_color, width: styles.map_route_width }) }); }, getMarkerStyle: function(radius, color) { /*return new ol.style.Style({ text: new ol.style.Text({ text: '\uf041', font: 'normal 32px FontAwesome', textBaseline: 'Bottom', fill: new ol.style.Fill({ color: color }), stroke: new ol.style.Stroke({ color: 'black', width: 2 }) }) });*/ return new ol.style.Style({ image: new ol.style.Circle({ radius: radius, fill: new ol.style.Fill({ color: color }), stroke: new ol.style.Stroke({ color: styles.map_stroke_color, width: styles.map_marker_stroke }) }) }); }, reportShow: function() { this.reportClear(); var vectorSource = this.getView().vectorSource; var data = Ext.getStore('Positions').getData().clone(); data.sort('fixTime'); var index; var positions = []; this.reportRoutePoints = {}; for (index = 0; index < data.getCount(); index++) { var point = ol.proj.fromLonLat([ data.getAt(index).data.longitude, data.getAt(index).data.latitude ]); positions.push(point); var style = this.getMarkerStyle(styles.map_report_radius, styles.map_report_color); var feature = new ol.Feature({ geometry: new ol.geom.Point(positions[index]), originalStyle: style }); feature.setStyle(style); this.reportRoutePoints[data.getAt(index).get('id')] = feature; } this.reportRoute = new ol.Feature({ geometry: new ol.geom.LineString(positions) }); this.reportRoute.setStyle(this.getLineStyle()); vectorSource.addFeature(this.reportRoute); for (var key in this.reportRoutePoints) { if (this.reportRoutePoints.hasOwnProperty(key)) { vectorSource.addFeature(this.reportRoutePoints[key]); } } }, reportClear: function() { var index; var vectorSource = this.getView().vectorSource; vectorSource.removeFeature(this.reportRoute); for (var key in this.reportRoutePoints) { if (this.reportRoutePoints.hasOwnProperty(key)) { vectorSource.removeFeature(this.reportRoutePoints[key]); } } this.reportRoutePoints = {}; }, selectPosition: function(feature) { if (this.currentFeature !== undefined) { this.currentFeature.setStyle(this.currentFeature.get('originalStyle')); } feature.setStyle(this.getMarkerStyle(styles.map_select_radius, styles.map_select_color)); var pan = ol.animation.pan({ duration: styles.map_delay, source: this.getView().mapView.getCenter() }); this.getView().map.beforeRender(pan); this.getView().mapView.setCenter(feature.getGeometry().getCoordinates()); this.currentFeature = feature; }, selectDevice: function(device) { if (this.liveData[device.get('id')] !== undefined) { this.selectPosition(this.liveData[device.get('id')]); } }, selectReport: function(position) { if (this.reportRoutePoints[position.get('id')] !== undefined) { this.selectPosition(this.reportRoutePoints[position.get('id')]); } } });