From 36a9b295deb646cabdf9fd5cdb945b6c487b9660 Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Wed, 03 May 2017 21:47:54 +0000
Subject: [PATCH] Refactor feature styling
---
map.js | 185 ++++++++++++++++++++++++----------------------
1 files changed, 97 insertions(+), 88 deletions(-)
diff --git a/map.js b/map.js
index 038cfdc..236dac3 100644
--- a/map.js
+++ b/map.js
@@ -15,7 +15,6 @@
var stop_points_layer = null;
var feature_clicked = null;
-var feature_selected = [];
var feature_xhr = null;
var feature_timer = null;
@@ -94,92 +93,102 @@
return new ol.geom.Point(ol.proj.fromLonLat([object.longitude / 3600000.0, object.latitude / 3600000.0]));
}
-function styleVehicle(vehicle, selected) {
- var color_type = 'black';
- if(vehicle.get('vehicle_type')) {
- switch(vehicle.get('vehicle_type').low) {
- case 0:
- color_type = 'orange';
+var Style = {
+ specialSelection: 2,
+ selectedFeatures: [],
+
+ getStyleForVehicle: function(vehicleFeature, isSelected) {
+ var color_type = 'black';
+ if(vehicleFeature.get('vehicle_type')) {
+ switch(vehicleFeature.get('vehicle_type').low) {
+ case 0:
+ color_type = 'orange';
+ break;
+ case 1:
+ color_type = 'blue';
+ break;
+ case 2:
+ color_type = 'green';
+ break;
+ }
+ }
+
+ var fill = (isSelected ? '#a00' : '#3399ff');
+
+ var image = '<svg xmlns="http://www.w3.org/2000/svg" height="30" width="20"><polygon points="10,0 20,23 0,23" style="fill:'+fill+';stroke:'+color_type+';stroke-width:2" /></svg>';
+
+ return new ol.style.Style({
+ image: new ol.style.Icon({
+ src: 'data:image/svg+xml;base64,' + btoa(image),
+ rotation: Math.PI * parseFloat(vehicleFeature.get('heading')) / 180.0,
+ }),
+ text: new ol.style.Text({
+ font: 'bold 10px sans-serif',
+ text: vehicleFeature.get('line'),
+ fill: new ol.style.Fill({color: 'white'}),
+ }),
+ });
+ },
+
+ getStyleForStop: function(stopFeature, isSelected) {
+ var fill = 'orange';
+ var stroke = 'red';
+ var stroke_width = 1;
+ var radius = 3;
+
+ if(isSelected == this.specialSelection) {
+ radius = 5;
+ } else if(isSelected) {
+ fill = 'red';
+ stroke = '#900';
+ stroke_width = 2;
+ radius = 5;
+ }
+
+ return new ol.style.Style({
+ image: new ol.style.Circle({
+ fill: new ol.style.Fill({color: fill}),
+ stroke: new ol.style.Stroke({color: stroke, width: stroke_width}),
+ radius: radius,
+ }),
+ });
+ },
+
+ getStyleForStopPoint: function(stopFeature, isSelected) {
+ return this.getStyleForStop(stopFeature, isSelected);
+ },
+
+ feature: function(feature, isSelected) {
+ if(!feature) return;
+ if(!feature.getId()) return;
+
+ var style = null;
+
+ switch(feature.getId().substr(0, 1)) {
+ case 'v':
+ style = this.getStyleForVehicle(feature, isSelected);
break;
- case 1:
- color_type = 'blue';
+ case 's':
+ style = this.getStyleForStop(feature, isSelected);
break;
- case 2:
- color_type = 'green';
+ case 'p':
+ style = this.getStyleForStopPoint(feature, isSelected);
break;
}
- }
-
- var fill = (selected ? '#a00' : '#3399ff');
-
- var image = '<svg xmlns="http://www.w3.org/2000/svg" height="30" width="20"><polygon points="10,0 20,23 0,23" style="fill:'+fill+';stroke:'+color_type+';stroke-width:2" /></svg>';
-
- return new ol.style.Style({
- image: new ol.style.Icon({
- src: 'data:image/svg+xml;base64,' + btoa(image),
- rotation: Math.PI * parseFloat(vehicle.get('heading')) / 180.0,
- }),
- text: new ol.style.Text({
- font: 'bold 10px sans-serif',
- text: vehicle.get('line'),
- fill: new ol.style.Fill({color: 'white'}),
- }),
- });
-}
-
-function styleStop(stop, selected) {
- var fill = 'orange';
- var stroke = 'red';
- var stroke_width = 1;
- var radius = 3;
-
- if(selected == 2) {
- radius = 5;
- } else if(selected) {
- fill = 'red';
- stroke = '#900';
- stroke_width = 2;
- radius = 5;
- }
-
- return new ol.style.Style({
- image: new ol.style.Circle({
- fill: new ol.style.Fill({color: fill}),
- stroke: new ol.style.Stroke({color: stroke, width: stroke_width}),
- radius: radius,
- }),
- });
-}
-
-function styleFeature(feature, selected) {
- if(!feature) return;
- if(!feature.getId()) return;
-
- var style = null;
-
- switch(feature.getId().substr(0, 1)) {
- case 'v':
- style = styleVehicle(feature, selected);
- break;
- case 's':
- case 'p':
- style = styleStop(feature, selected);
- break;
- }
+ feature.setStyle(style);
+ if(isSelected) {
+ this.selectedFeatures.push(feature);
+ }
+ },
- feature.setStyle(style);
- if(selected) {
- feature_selected.push(feature);
+ unstyleSelected: function() {
+ for(var i = 0; i < this.selectedFeatures.length; i++) {
+ this.feature(this.selectedFeatures[i]);
+ }
+ this.selectedFeatures = [];
}
-}
-
-function unstyleSelectedFeatures() {
- for(var i = 0; i < feature_selected.length; i++) {
- styleFeature(feature_selected[i]);
- }
- feature_selected = [];
-}
+};
function updateVehicles() {
if(vehicles_timer) clearTimeout(vehicles_timer);
@@ -221,7 +230,7 @@
vehicle_feature = new ol.Feature(vehicle);
vehicle_feature.setId('v' + vehicle.id);
- styleFeature(vehicle_feature);
+ Style.feature(vehicle_feature);
vehicles_source.addFeature(vehicle_feature);
} else {
vehicle_feature.setProperties(vehicle);
@@ -249,7 +258,7 @@
var stop_feature = new ol.Feature(stop);
stop_feature.setId(prefix + stop.id);
- styleFeature(stop_feature);
+ Style.feature(stop_feature);
source.addFeature(stop_feature);
}
@@ -303,15 +312,15 @@
table.appendChild(tr);
}
- unstyleSelectedFeatures();
- styleFeature(feature_clicked, true);
+ Style.unstyleSelected();
+ Style.feature(feature_clicked, true);
for(var i = 0, il = data.actual.length; i < il; i++) {
var tr = document.createElement('tr');
addCellWithText(tr, data.actual[i].actualTime || data.actual[i].plannedTime);
addCellWithText(tr, data.actual[i].stop_seq_num + '. ' + data.actual[i].stop.name);
- styleFeature(stops_source.getFeatureById('s' + data.actual[i].stop.id), 2);
+ Style.feature(stops_source.getFeatureById('s' + data.actual[i].stop.id), 2);
if(data.actual[i].status == 'STOPPING') {
tr.className = 'success';
@@ -402,7 +411,7 @@
function featureClicked(feature) {
if(feature && !feature.getId()) return;
- unstyleSelectedFeatures();
+ Style.unstyleSelected();
route_source.clear();
if(!feature) {
@@ -490,7 +499,7 @@
div.appendChild(table);
- styleFeature(feature, true);
+ Style.feature(feature, true);
setTimeout(function () {map.getView().animate({
center: feature.getGeometry().getCoordinates(),
@@ -505,7 +514,7 @@
window.location.hash = '';
feature_clicked = null;
- unstyleSelectedFeatures();
+ Style.unstyleSelected();
route_source.clear();
if(feature_xhr) feature_xhr.abort();
--
Gitblit v1.9.1