| | |
| | | var vehicles_info = {}; |
| | | |
| | | var stops_xhr = null; |
| | | var stops_buses_source = null; |
| | | var stops_buses_layer = null; |
| | | var stops_trams_source = null; |
| | | var stops_trams_layer = null; |
| | | var stop_points_buses_source = null; |
| | | var stop_points_buses_layer = null; |
| | | var stop_points_trams_source = null; |
| | | var stop_points_trams_layer = null; |
| | | var stops_ignored = ['131']; |
| | | var stops_style = { |
| | | 'sb': new ol.style.Style({ |
| | | image: new ol.style.Circle({ |
| | | fill: new ol.style.Fill({color: '#07F'}), |
| | | stroke: new ol.style.Stroke({color: '#05B', width: 2}), |
| | | radius: 3, |
| | | }), |
| | | }), |
| | | 'st': new ol.style.Style({ |
| | | image: new ol.style.Circle({ |
| | | fill: new ol.style.Fill({color: '#FA0'}), |
| | | stroke: new ol.style.Stroke({color: '#B70', width: 2}), |
| | | radius: 3, |
| | | }), |
| | | }), |
| | | 'pb': new ol.style.Style({ |
| | | image: new ol.style.Circle({ |
| | | fill: new ol.style.Fill({color: '#07F'}), |
| | | stroke: new ol.style.Stroke({color: '#05B', width: 1}), |
| | | radius: 3, |
| | | }), |
| | | }), |
| | | 'pt': new ol.style.Style({ |
| | | image: new ol.style.Circle({ |
| | | fill: new ol.style.Fill({color: '#FA0'}), |
| | | stroke: new ol.style.Stroke({color: '#B70', width: 1}), |
| | | radius: 3, |
| | | }), |
| | | }), |
| | | }; |
| | | var stops_type = ['st', 'sb', 'pt', 'pb']; |
| | | var stops_mapping = {}; |
| | | var stops_source = {}; |
| | | var stops_layer = {}; |
| | | |
| | | var stop_selected_source = null; |
| | | var stop_selected_layer = null; |
| | |
| | | function markStops(stops, type, routeStyle) { |
| | | stop_selected_source.clear(); |
| | | |
| | | var style = stops_trams_layer.getStyle(); |
| | | if(type == 'b') { |
| | | style = stops_buses_layer.getStyle(); |
| | | } |
| | | style = style.clone(); |
| | | var style = stops_layer['s'+type].getStyle().clone(); |
| | | |
| | | if(routeStyle) { |
| | | style.getImage().setRadius(5); |
| | |
| | | feature = stops[i]; |
| | | } else { |
| | | prefix = stops[i].substr(0,2); |
| | | feature = null; |
| | | if(prefix == 'sb') { |
| | | feature = stops_buses_source.getFeatureById(stops[i]); |
| | | } else if(prefix == 'st') { |
| | | feature = stops_trams_source.getFeatureById(stops[i]); |
| | | } else if(prefix == 'pb') { |
| | | feature = stop_points_buses_source.getFeatureById(stops[i]); |
| | | } else if(prefix == 'pt') { |
| | | feature = stop_points_trams_source.getFeatureById(stops[i]); |
| | | } |
| | | feature = stops_source[prefix].getFeatureById(stops[i]); |
| | | } |
| | | if(feature) { |
| | | stop_selected_source.addFeature(feature); |
| | |
| | | return buses_xhr; |
| | | } |
| | | |
| | | function updateStopSource(stops, prefix, source) { |
| | | function updateStopSource(stops, prefix) { |
| | | var source = stops_source[prefix]; |
| | | var mapping = stops_mapping[prefix]; |
| | | for(var i = 0; i < stops.length; i++) { |
| | | var stop = stops[i]; |
| | | |
| | | if(stop.category == 'other') continue; |
| | | if(stops_ignored.indexOf(stop.shortName) >= 0) continue; |
| | | |
| | | stop.geometry = getGeometry(stop); |
| | | var stop_feature = new ol.Feature(stop); |
| | | |
| | | if(prefix.startsWith('p')) { |
| | | mapping[stop.stopPoint] = stop_feature; |
| | | } else { |
| | | mapping[stop.shortName] = stop_feature; |
| | | } |
| | | |
| | | stop_feature.setId(prefix + stop.id); |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | function updateStops(base, suffix, source) { |
| | | function updateStops(base, suffix) { |
| | | return $.get( |
| | | base + '/geoserviceDispatcher/services/stopinfo/stops' |
| | | + '?left=-648000000' |
| | |
| | | + '&right=648000000' |
| | | + '&top=324000000' |
| | | ).done(function(data) { |
| | | updateStopSource(data.stops, 's' + suffix, source); |
| | | updateStopSource(data.stops, 's' + suffix); |
| | | }).fail(fail_ajax); |
| | | } |
| | | |
| | | function updateStopPoints(base, suffix, source) { |
| | | function updateStopPoints(base, suffix) { |
| | | return $.get( |
| | | base + '/geoserviceDispatcher/services/stopinfo/stopPoints' |
| | | + '?left=-648000000' |
| | |
| | | + '&right=648000000' |
| | | + '&top=324000000' |
| | | ).done(function(data) { |
| | | updateStopSource(data.stopPoints, 'p' + suffix, source); |
| | | updateStopSource(data.stopPoints, 'p' + suffix); |
| | | }).fail(fail_ajax); |
| | | } |
| | | |
| | |
| | | break; |
| | | case 's': |
| | | type = lang.type_stop_tram; |
| | | var second_type = lang.departures_for_buses; |
| | | var mapping = stops_mapping['sb']; |
| | | if(feature.getId().startsWith('sb')) { |
| | | type = lang.type_stop_bus; |
| | | second_type = lang.departures_for_trams; |
| | | mapping = stops_mapping['st']; |
| | | } |
| | | |
| | | if(mapping[feature.get('shortName')]) { |
| | | additional = document.createElement('p'); |
| | | additional.className = 'small'; |
| | | addElementWithText(additional, 'a', second_type).addEventListener( |
| | | 'click', |
| | | function() { |
| | | featureClicked(mapping[feature.get('shortName')]); |
| | | } |
| | | ); |
| | | } |
| | | |
| | | addElementWithText(thead, 'th', lang.header_line); |
| | |
| | | addElementWithText(additional, 'a', lang.departures_for_stop).addEventListener( |
| | | 'click', |
| | | function() { |
| | | var stops_source = stops_trams_source; |
| | | if(feature.getId().startsWith('pb')) { |
| | | stops_source = stops_buses_source; |
| | | } |
| | | featureClicked(stops_source.forEachFeature(function(stop_feature) { |
| | | if(stop_feature.get('shortName') == feature.get('shortName') && stop_feature.getId().substr(1,1) == feature.getId().substr(1,1)) { |
| | | return stop_feature; |
| | | } |
| | | })); |
| | | var mapping = stops_mapping['s' + feature.getId().substr(1,1)]; |
| | | featureClicked(mapping[feature.get('shortName')]); |
| | | } |
| | | ); |
| | | |
| | |
| | | |
| | | var feature = features[0]; |
| | | if(!feature) { |
| | | if(stops_buses_layer.getVisible()) { |
| | | feature = returnClosest(point, feature, stops_buses_source.getClosestFeatureToCoordinate(point)); |
| | | } |
| | | if(stops_trams_layer.getVisible()) { |
| | | feature = returnClosest(point, feature, stops_trams_source.getClosestFeatureToCoordinate(point)); |
| | | } |
| | | if(stop_points_buses_layer.getVisible()) { |
| | | feature = returnClosest(point, feature, stop_points_buses_source.getClosestFeatureToCoordinate(point)); |
| | | } |
| | | if(stop_points_trams_layer.getVisible()) { |
| | | feature = returnClosest(point, feature, stop_points_trams_source.getClosestFeatureToCoordinate(point)); |
| | | } |
| | | stops_type.forEach(function(type) { |
| | | if(stops_layer[type].getVisible()) { |
| | | feature = returnClosest(point, feature, stops_source[type].getClosestFeatureToCoordinate(point)); |
| | | } |
| | | }); |
| | | if(trams_layer.getVisible()) { |
| | | feature = returnClosest(point, feature, trams_source.getClosestFeatureToCoordinate(point)); |
| | | } |
| | |
| | | feature = trams_source.getFeatureById(vehicleId); |
| | | } |
| | | } else if(stopId) { |
| | | if(stopId.startsWith('st')) { |
| | | feature = stops_trams_source.getFeatureById(stopId); |
| | | } else if(stopId.startsWith('sb')) { |
| | | feature = stops_buses_source.getFeatureById(stopId); |
| | | } else if(stopId.startsWith('pt')) { |
| | | feature = stop_points_trams_source.getFeatureById(stopId); |
| | | } else if(stopId.startsWith('pb')) { |
| | | feature = stop_points_buses_source.getFeatureById(stopId); |
| | | } |
| | | feature = stops_source[stopId.substr(0,2)].getFeatureById(stopId); |
| | | } |
| | | |
| | | featureClicked(feature); |
| | |
| | | if(!f1) return f2; |
| | | if(!f2) return f1; |
| | | |
| | | return (getDistance(point, f1) < getDistance(point, f2)) ? f1 : f2; |
| | | return (getDistance(point, f1) <= getDistance(point, f2)) ? f1 : f2; |
| | | } |
| | | |
| | | function init() { |
| | |
| | | |
| | | panel = new Panel(document.getElementById('panel')); |
| | | |
| | | stops_buses_source = new ol.source.Vector({ |
| | | features: [], |
| | | }); |
| | | stops_buses_layer = new ol.layer.Vector({ |
| | | source: stops_buses_source, |
| | | renderMode: 'image', |
| | | style: new ol.style.Style({ |
| | | image: new ol.style.Circle({ |
| | | fill: new ol.style.Fill({color: '#07F'}), |
| | | stroke: new ol.style.Stroke({color: '#05B', width: 1}), |
| | | radius: 3, |
| | | }), |
| | | }), |
| | | }); |
| | | |
| | | stops_trams_source = new ol.source.Vector({ |
| | | features: [], |
| | | }); |
| | | stops_trams_layer = new ol.layer.Vector({ |
| | | source: stops_trams_source, |
| | | renderMode: 'image', |
| | | style: new ol.style.Style({ |
| | | image: new ol.style.Circle({ |
| | | fill: new ol.style.Fill({color: '#FA0'}), |
| | | stroke: new ol.style.Stroke({color: '#B70', width: 1}), |
| | | radius: 3, |
| | | }), |
| | | }), |
| | | }); |
| | | |
| | | stop_points_buses_source = new ol.source.Vector({ |
| | | features: [], |
| | | }); |
| | | stop_points_buses_layer = new ol.layer.Vector({ |
| | | source: stop_points_buses_source, |
| | | renderMode: 'image', |
| | | visible: false, |
| | | style: new ol.style.Style({ |
| | | image: new ol.style.Circle({ |
| | | fill: new ol.style.Fill({color: '#07F'}), |
| | | stroke: new ol.style.Stroke({color: '#05B', width: 2}), |
| | | radius: 3, |
| | | }), |
| | | }), |
| | | }); |
| | | |
| | | stop_points_trams_source = new ol.source.Vector({ |
| | | features: [], |
| | | }); |
| | | stop_points_trams_layer = new ol.layer.Vector({ |
| | | source: stop_points_trams_source, |
| | | renderMode: 'image', |
| | | visible: false, |
| | | style: new ol.style.Style({ |
| | | image: new ol.style.Circle({ |
| | | fill: new ol.style.Fill({color: '#FA0'}), |
| | | stroke: new ol.style.Stroke({color: '#B70', width: 2}), |
| | | radius: 3, |
| | | }), |
| | | }), |
| | | stops_type.forEach(function(type) { |
| | | stops_source[type] = new ol.source.Vector({ |
| | | features: [], |
| | | }); |
| | | stops_layer[type] = new ol.layer.Vector({ |
| | | source: stops_source[type], |
| | | renderMode: 'image', |
| | | style: stops_style[type], |
| | | }); |
| | | stops_mapping[type] = {}; |
| | | }); |
| | | |
| | | stop_selected_source = new ol.source.Vector({ |
| | |
| | | target: 'map', |
| | | layers: [ |
| | | new ol.layer.Tile({ |
| | | source: new ol.source.OSM() |
| | | source: new ol.source.OSM(), |
| | | }), |
| | | route_layer, |
| | | geolocation_layer, |
| | | stops_buses_layer, |
| | | stops_trams_layer, |
| | | stop_points_buses_layer, |
| | | stop_points_trams_layer, |
| | | stops_layer['st'], |
| | | stops_layer['sb'], |
| | | stops_layer['pt'], |
| | | stops_layer['pb'], |
| | | stop_selected_layer, |
| | | buses_layer, |
| | | trams_layer, |
| | |
| | | }); |
| | | |
| | | // Change layer visibility on zoom |
| | | map.getView().on('change:resolution', function(e) { |
| | | stop_points_buses_layer.setVisible(map.getView().getZoom() >= 16); |
| | | stop_points_trams_layer.setVisible(map.getView().getZoom() >= 16); |
| | | }); |
| | | var change_resolution = function(e) { |
| | | stops_type.forEach(function(type) { |
| | | if(type.startsWith('p')) { |
| | | stops_layer[type].setVisible(map.getView().getZoom() >= 16); |
| | | stops_layer[type].setVisible(map.getView().getZoom() >= 16); |
| | | } |
| | | }); |
| | | }; |
| | | map.getView().on('change:resolution', change_resolution); |
| | | change_resolution(); |
| | | |
| | | $.when( |
| | | updateVehicleInfo(), |
| | | updateTrams(), |
| | | updateBuses(), |
| | | updateStops(ttss_trams_base, 't', stops_trams_source), |
| | | updateStops(ttss_buses_base, 'b', stops_buses_source), |
| | | updateStopPoints(ttss_trams_base, 't', stop_points_trams_source), |
| | | updateStopPoints(ttss_buses_base, 'b', stop_points_buses_source), |
| | | updateStops(ttss_trams_base, 't'), |
| | | updateStops(ttss_buses_base, 'b'), |
| | | updateStopPoints(ttss_trams_base, 't'), |
| | | updateStopPoints(ttss_buses_base, 'b'), |
| | | ).done(function() { |
| | | hash(); |
| | | }); |