UNPKG

openlayers

Version:

Build tools and sources for developing OpenLayers based mapping applications

81 lines (73 loc) 1.97 kB
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: { 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; });