UNPKG

1.97 kBJavaScriptView Raw
1goog.require('ol.Map');
2goog.require('ol.View');
3goog.require('ol.control');
4goog.require('ol.layer.Tile');
5goog.require('ol.source.OSM');
6
7// default zoom, center and rotation
8var zoom = 2;
9var center = [0, 0];
10var rotation = 0;
11
12if (window.location.hash !== '') {
13 // try to restore center, zoom-level and rotation from the URL
14 var hash = window.location.hash.replace('#map=', '');
15 var parts = hash.split('/');
16 if (parts.length === 4) {
17 zoom = parseInt(parts[0], 10);
18 center = [
19 parseFloat(parts[1]),
20 parseFloat(parts[2])
21 ];
22 rotation = parseFloat(parts[3]);
23 }
24}
25
26var map = new ol.Map({
27 layers: [
28 new ol.layer.Tile({
29 source: new ol.source.OSM()
30 })
31 ],
32 controls: ol.control.defaults({
33 attributionOptions: {
34 collapsible: false
35 }
36 }),
37 target: 'map',
38 view: new ol.View({
39 center: center,
40 zoom: zoom,
41 rotation: rotation
42 })
43});
44
45var shouldUpdate = true;
46var view = map.getView();
47var updatePermalink = function() {
48 if (!shouldUpdate) {
49 // do not update the URL when the view was changed in the 'popstate' handler
50 shouldUpdate = true;
51 return;
52 }
53
54 var center = view.getCenter();
55 var hash = '#map=' +
56 view.getZoom() + '/' +
57 Math.round(center[0] * 100) / 100 + '/' +
58 Math.round(center[1] * 100) / 100 + '/' +
59 view.getRotation();
60 var state = {
61 zoom: view.getZoom(),
62 center: view.getCenter(),
63 rotation: view.getRotation()
64 };
65 window.history.pushState(state, 'map', hash);
66};
67
68map.on('moveend', updatePermalink);
69
70// restore the view state when navigating through the history, see
71// https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onpopstate
72window.addEventListener('popstate', function(event) {
73 if (event.state === null) {
74 return;
75 }
76 map.getView().setCenter(event.state.center);
77 map.getView().setZoom(event.state.zoom);
78 map.getView().setRotation(event.state.rotation);
79 shouldUpdate = false;
80});