ulogger-server/js/api_openlayers.js

235 lines
7.1 KiB
JavaScript
Raw Normal View History

2017-01-30 21:36:44 +01:00
/* μlogger
2013-06-21 11:15:09 +02:00
*
2017-01-30 21:36:44 +01:00
* Copyright(C) 2017 Bartek Fabiszewski (www.fabiszewski.net)
2013-06-21 11:15:09 +02:00
*
* This is free software; you can redistribute it and/or modify it under
2017-04-07 00:05:28 +02:00
* the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
2013-06-21 11:15:09 +02:00
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
2017-04-07 00:05:28 +02:00
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
2013-06-21 11:15:09 +02:00
*/
2013-06-21 11:15:09 +02:00
// openlayers
var map;
var layerTrack;
var layerMarkers;
var wgs84;
var mercator;
var loadedAPI = 'openlayers';
2013-06-21 11:15:09 +02:00
function init() {
wgs84 = new OpenLayers.Projection('EPSG:4326'); // from WGS 1984
2017-04-09 23:35:55 +02:00
mercator = new OpenLayers.Projection('EPSG:900913'); // to Mercator
var options = {
controls: [
new OpenLayers.Control.ArgParser(), // default
new OpenLayers.Control.Attribution(), // default
new OpenLayers.Control.LayerSwitcher(),
new OpenLayers.Control.Navigation(), // default
new OpenLayers.Control.PanZoomBar(),// do we need it?
new OpenLayers.Control.ScaleLine()
]
};
map = new OpenLayers.Map('map-canvas', options);
// default layer: OpenStreetMap
var osm = new OpenLayers.Layer.OSM();
map.addLayer(osm);
// add extra layers
for (var layerName in ol_layers) {
if (ol_layers.hasOwnProperty(layerName)) {
var layerUrl = ol_layers[layerName];
var ol_layer = new OpenLayers.Layer.OSM(
layerName,
urlFromOL3(layerUrl),
{ tileOptions: { crossOriginKeyword: null } }
);
map.addLayer(ol_layer);
}
}
2017-04-09 23:35:55 +02:00
var position = new OpenLayers.LonLat(init_longitude, init_latitude).transform(wgs84, mercator);
var zoom = 8;
map.setCenter(position, zoom);
2013-06-23 00:17:28 +02:00
// init layers
2013-06-23 23:43:09 +02:00
layerTrack = new OpenLayers.Layer.Vector('Track');
layerMarkers = new OpenLayers.Layer.Markers('Markers');
2013-06-21 11:15:09 +02:00
}
function cleanup() {
map = undefined;
layerTrack = undefined;
layerMarkers = undefined;
wgs84 = undefined;
mercator = undefined;
document.getElementById("map-canvas").innerHTML = '';
}
2017-04-09 23:35:55 +02:00
function displayTrack(xml, update) {
altitudes = {};
2013-06-21 11:15:09 +02:00
var totalMeters = 0;
var totalSeconds = 0;
var points = [];
2013-06-21 11:15:09 +02:00
var latlngbounds = new OpenLayers.Bounds();
var positions = xml.getElementsByTagName('position');
var posLen = positions.length;
2017-04-09 23:35:55 +02:00
for (var i = 0; i < posLen; i++) {
var p = parsePosition(positions[i], i);
2013-06-21 11:15:09 +02:00
totalMeters += p.distance;
totalSeconds += p.seconds;
p['totalMeters'] = totalMeters;
p['totalSeconds'] = totalSeconds;
// set marker
2017-04-09 23:35:55 +02:00
setMarker(p, i, posLen);
2013-06-21 11:15:09 +02:00
// update polyline
2017-04-09 23:35:55 +02:00
var point = new OpenLayers.Geometry.Point(p.longitude, p.latitude).transform(wgs84, mercator);
2013-06-21 11:15:09 +02:00
latlngbounds.extend(point);
points.push(point);
}
var lineString = new OpenLayers.Geometry.LineString(points);
var lineStyle = { strokeColor: '#FF0000', strokeOpacity: 1, strokeWidth: 2 };
var lineFeature = new OpenLayers.Feature.Vector(lineString, null, lineStyle);
layerTrack.addFeatures([lineFeature]);
map.addLayer(layerTrack);
map.addLayer(layerMarkers);
2013-06-21 11:15:09 +02:00
if (update) {
map.zoomToExtent(latlngbounds);
2017-04-09 23:35:55 +02:00
if (i == 1) {
// only one point, zoom out
2013-06-21 11:15:09 +02:00
map.zoomOut();
}
}
2017-05-22 13:39:40 +02:00
updateSummary(p.timestamp, totalMeters, totalSeconds);
2017-04-09 23:35:55 +02:00
if (p.tid != trackid) {
trackid = p.tid;
2013-06-21 11:15:09 +02:00
setTrack(trackid);
}
2017-04-09 23:35:55 +02:00
if (document.getElementById('bottom').style.display == 'block') {
2013-06-21 11:15:09 +02:00
// update altitudes chart
chart.clearChart();
displayChart();
}
}
2013-06-23 00:17:28 +02:00
function clearMap() {
2017-04-09 23:35:55 +02:00
if (layerTrack) {
2013-06-21 11:15:09 +02:00
layerTrack.removeAllFeatures();
}
2017-04-09 23:35:55 +02:00
if (layerMarkers) {
2013-06-21 11:15:09 +02:00
layerMarkers.clearMarkers();
}
}
2017-04-09 23:35:55 +02:00
function setMarker(p, i, posLen) {
2013-06-21 11:15:09 +02:00
// marker
2017-04-09 23:35:55 +02:00
var lonLat = new OpenLayers.LonLat(p.longitude, p.latitude).transform(wgs84, mercator);
var size = new OpenLayers.Size(16, 25);
2017-04-09 23:35:55 +02:00
var offset = new OpenLayers.Pixel(-(size.w / 2), -size.h);
if (latest == 1) { var icon = new OpenLayers.Icon('images/marker-red.png', size, offset); }
else if (i == 0) { var icon = new OpenLayers.Icon('images/marker-green.png', size, offset); }
else if (i == posLen - 1) { var icon = new OpenLayers.Icon('images/marker-red.png', size, offset); }
else {
2017-04-09 23:35:55 +02:00
offset = new OpenLayers.Pixel(-(size.w / 2), -size.h);
var icon = new OpenLayers.Icon('images/marker-white.png', size, offset);
2013-06-21 11:15:09 +02:00
}
2017-04-09 23:35:55 +02:00
var marker = new OpenLayers.Marker(lonLat, icon);
layerMarkers.addMarker(marker);
2013-06-21 11:15:09 +02:00
// popup
2017-04-09 23:35:55 +02:00
var content = getPopupHtml(p, i, posLen);
marker.events.register("mousedown", marker, (function () {
return function () {
// remove popups
if (map.popups.length > 0) {
for (var j = map.popups.length - 1; j >= 0; j--) {
map.removePopup(map.popups[j])
};
}
// show popup
var popup = new OpenLayers.Popup.FramedCloud("popup_" + (i + 1), lonLat, null, content, icon, true);
map.addPopup(popup);
if (document.getElementById('bottom').style.display == 'block') {
var index = 0;
for (var key in altitudes) {
if (altitudes.hasOwnProperty(key) && key == i) {
chart.setSelection([{ row: index, column: null }]);
break;
}
index++;
}
2017-04-09 23:35:55 +02:00
}
}
})());
2013-06-21 11:15:09 +02:00
}
function addChartEvent(chart, data) {
2017-04-09 23:35:55 +02:00
google.visualization.events.addListener(chart, 'select', function () {
var selection = chart.getSelection()[0];
if (selection) {
var id = data.getValue(selection.row, 0) - 1;
var marker = layerMarkers.markers[id];
var url = marker.icon.url;
marker.setUrl('images/marker-gold.png');
2017-04-09 23:35:55 +02:00
altTimeout = setTimeout(function () { marker.setUrl(url); }, 2000);
}
});
2013-06-21 11:15:09 +02:00
}
//20.597985430276808,52.15547181298076,21.363595171488573,52.33750879522563
function getBounds() {
var bounds = map.getExtent().transform(mercator, wgs84).toArray();
var lon_sw = bounds[0];
var lat_sw = bounds[1];
var lon_ne = bounds[2];
var lat_ne = bounds[3];
2017-04-09 23:35:55 +02:00
return [lon_sw, lat_sw, lon_ne, lat_ne];
}
function zoomToBounds(b) {
2017-04-09 23:35:55 +02:00
var bounds = new OpenLayers.Bounds(b).transform(wgs84, mercator);
map.zoomToExtent(bounds);
}
function urlFromOL3(url) {
url = url.replace(/\{([xyz])\}/g, "$${$1}");
return expandUrl(url);
}
// backported from openlayers 3
function expandUrl(url) {
var urls = [];
var match = /\{([a-z])-([a-z])\}/.exec(url);
if (match) {
// char range
var startCharCode = match[1].charCodeAt(0);
var stopCharCode = match[2].charCodeAt(0);
for (var charCode = startCharCode; charCode <= stopCharCode; ++charCode) {
urls.push(url.replace(match[0], String.fromCharCode(charCode)));
}
return urls;
}
match = match = /\{(\d+)-(\d+)\}/.exec(url);
if (match) {
// number range
var stop = parseInt(match[2], 10);
for (var i = parseInt(match[1], 10); i <= stop; i++) {
urls.push(url.replace(match[0], i.toString()));
}
return urls;
}
urls.push(url);
return urls;
}
2018-01-29 18:52:46 +01:00
function updateSize() {
// ignore
}