| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- /**
- * Closes the floating map.
- */
- function hideMap(){
- document.getElementById('map').innerHTML = "";
- document.getElementById('map_container').style.opacity = 0;
- document.getElementById('map_container').style.display = 'none';
- }
- /**
- * Opens the floating map.
- * Called from {@link #showMapRoute(route, title, format, lat, lon, zoom)} and {@link #showMapPoint(title, lat, lon)}.
- * @param title The title of the map window.
- */
- function showMap(title){
- document.getElementById('map_container').style.display = 'block';
- document.getElementById('map_container').style.opacity = 1;
- document.getElementById('map_title').innerHTML = title;
- }
- /**
- * Draws a route on the map.
- * Calls {@link #showMap(title)}.
- * @param route Route identifier.
- * @param title The title of the map window.
- * @param lat Map center latitude coordinate (default: Downtown Vitoria).
- * @param lon Mat center longitude coordinate (default: Downtown Vitoria).
- * @param zoom Map initial zoom level (default: 15);
- */
- function showMapRoute(route, title, lat = 42.846484, lon = -2.673625, zoom = 15){
- // Show the map window.
- showMap(title);
- // Styles for the route.
- var style = {
- 'Point': new ol.style.Style({
- image: new ol.style.Circle({
- fill: new ol.style.Fill({
- color: 'rgba(255,255,0,0.4)'
- }),
- radius: 25,
- stroke: new ol.style.Stroke({
- color: '#ff0',
- width: 1
- })
- })
- }),
- 'LineString': new ol.style.Style({
- stroke: new ol.style.Stroke({
- color: '#f00',
- width: 3
- })
- }),
- 'MultiLineString': new ol.style.Style({
- stroke: new ol.style.Stroke({
- color: '#00008f',
- width: 8
- })
- })
- };
- // Generate vector from gpx file.
- var vectorSrc = new ol.source.Vector({
- url: "/gpx/" + route + ".gpx",
- format: new ol.format.GPX()
- })
- var vector = new ol.layer.Vector({
- source: vectorSrc,
- style: function(feature) {
- return style[feature.getGeometry().getType()];
- }
- });
- // Initialize map, with background and route.
- var map = new ol.Map({
- layers: [
- new ol.layer.Tile({
- source: new ol.source.OSM()
- }),
- vector
- ],
- target: 'map',
- controls: ol.control.defaults({
- attributionOptions: {
- collapsible: false
- }
- }),
- view: new ol.View({
- center: ol.proj.fromLonLat([lon, lat]),
- zoom: zoom
- })
- });
- // Manually read file to get first and last point.
- var first = [lat, lon];
- var last = [lat, lon];
- var href = "/gpx/" + route + ".gpx";
- xmlhttp = new XMLHttpRequest();
- xmlhttp.onreadystatechange = function(){
- if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
- // Get first and last point.
- out = xmlhttp.responseText;
- out = out.substring(out.indexOf("<trkpt"));
- firstL = out.substring(out.indexOf("<trkpt") + 7, out.indexOf("/>") - 1);
- lastL = out.substring(out.lastIndexOf("<trkpt") + 7, out.lastIndexOf("/>") - 1);
- first = firstL.split(" ");
- first[0] = parseFloat(first[0].substring(5, first[0].length - 1));
- first[1] = parseFloat(first[1].substring(5, first[1].length - 1));
- last = lastL.split(" ");
- last[0] = parseFloat(last[0].substring(5, last[0].length - 1));
- last[1] = parseFloat(last[1].substring(5, last[1].length - 1));
- // Add start and end marker
- var startIcon = new ol.Feature({
- geometry: new ol.geom.Point(ol.proj.fromLonLat([first[1], first[0]])),
- name: title,
- });
- startIcon.setStyle(new ol.style.Style({
- image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
- src: '/img/misc/pinpoint-start.png',
- scale: 0.25
- }))
- }));
- var endIcon = new ol.Feature({
- geometry: new ol.geom.Point(ol.proj.fromLonLat([last[1], last[0]])),
- name: title,
- });
- endIcon.setStyle(new ol.style.Style({
- image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
- src: '/img/misc/pinpoint-end.png',
- scale: 0.25
- }))
- }));
- iconLayer = new ol.layer.Vector({
- source: new ol.source.Vector({
- features: [startIcon, endIcon]
- })
- });
- map.addLayer(iconLayer);
- }
- }
- xmlhttp.open("GET", href, true);
- xmlhttp.send();
- }
- /**
- * Puts a marker on the map.
- * Calls {@link #showMap(title)}.
- * @param title The title of the map window.
- * @param lat Marker latitude coordinate.
- * @param lon Marker longitude coordinate.
- */
- function showMapPoint(title, lat, lon){
- // Show the map window.
- showMap(title);
- // Set marker icon.
- var icon = new ol.Feature({
- geometry: new ol.geom.Point(ol.proj.fromLonLat([lon, lat])),
- name: title,
- });
- icon.setStyle(new ol.style.Style({
- image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
- src: '/img/misc/pinpoint.png',
- scale: 0.28
- }))
- }));
- iconLayer = new ol.layer.Vector({
- source: new ol.source.Vector({
- features: [icon]
- })
- });
- // Configure the map.
- var map = new ol.Map({
- layers: [
- new ol.layer.Tile({
- source: new ol.source.OSM()
- }),
- iconLayer
- ],
- target: 'map',
- controls: ol.control.defaults({
- attributionOptions: {
- collapsible: false
- }
- }),
- view: new ol.View({
- center: ol.proj.fromLonLat([lon, lat]),
- zoom: 15
- })
- });
- }
|