From b8ec2e28b5bc30b5d6bc9c3fd5a0f50caec56bdb Mon Sep 17 00:00:00 2001 From: tsauerwein Date: Tue, 14 Apr 2015 22:03:47 +0200 Subject: [PATCH] Add permalink example --- examples/permalink.html | 19 ++++++++++ examples/permalink.js | 80 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 examples/permalink.html create mode 100644 examples/permalink.js diff --git a/examples/permalink.html b/examples/permalink.html new file mode 100644 index 0000000000..6191c32ec6 --- /dev/null +++ b/examples/permalink.html @@ -0,0 +1,19 @@ +--- +template: example.html +title: Permalink example +shortdesc: Example on how to create permalinks. +docs: > + In this example the HTML 5 History API is used to update the browser URL + with the current zoom-level, center and rotation when the map is moved. + Note that the History API is not supported in all browsers, one might consider to use a a polyfill. +tags: "permalink, openstreetmap, history" +--- +
+
+
+
+
diff --git a/examples/permalink.js b/examples/permalink.js new file mode 100644 index 0000000000..9ee2c5ba6c --- /dev/null +++ b/examples/permalink.js @@ -0,0 +1,80 @@ +goog.require('ol.Map'); +goog.require('ol.View'); +goog.require('ol.control'); +goog.require('ol.layer.Tile'); +goog.require('ol.source.OSM'); + +// default zoom, center and rotation +var zoom = 2; +var center = [0, 0]; +var rotation = 0; + +if (window.location.hash !== '') { + // try to restore center, zoom-level and rotation from the URL + var hash = window.location.hash.replace('#map=', ''); + var parts = hash.split('/'); + if (parts.length === 4) { + zoom = parseInt(parts[0], 10); + center = [ + parseFloat(parts[1]), + parseFloat(parts[2]) + ]; + rotation = parseFloat(parts[3]); + } +} + +var map = new ol.Map({ + layers: [ + new ol.layer.Tile({ + source: new ol.source.OSM() + }) + ], + controls: ol.control.defaults({ + attributionOptions: /** @type {olx.control.AttributionOptions} */ ({ + collapsible: false + }) + }), + target: 'map', + view: new ol.View({ + center: center, + zoom: zoom, + rotation: rotation + }) +}); + +var shouldUpdate = true; +var view = map.getView(); +var updatePermalink = function() { + if (!shouldUpdate) { + // do not update the URL when the view was changed in the 'popstate' handler + shouldUpdate = true; + return; + } + + var center = view.getCenter(); + var hash = '#map=' + + view.getZoom() + '/' + + Math.round(center[0] * 100) / 100 + '/' + + Math.round(center[1] * 100) / 100 + '/' + + view.getRotation(); + var state = { + zoom: view.getZoom(), + center: view.getCenter(), + rotation: view.getRotation() + }; + window.history.pushState(state, 'map', hash); +}; + +map.on('moveend', updatePermalink); + +// restore the view state when navigating through the history, see +// https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onpopstate +window.addEventListener('popstate', function(event) { + if (event.state === null) { + return; + } + map.getView().setCenter(event.state.center); + map.getView().setZoom(event.state.zoom); + map.getView().setRotation(event.state.rotation); + shouldUpdate = false; +});