UNPKG

2.75 kBJavaScriptView Raw
1goog.require('ol.Map');
2goog.require('ol.View');
3goog.require('ol.layer.Tile');
4goog.require('ol.proj');
5goog.require('ol.source.BingMaps');
6
7var key = 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5';
8
9var imagery = new ol.layer.Tile({
10 source: new ol.source.BingMaps({key: key, imagerySet: 'Aerial'})
11});
12
13var container = document.getElementById('map');
14
15var map = new ol.Map({
16 layers: [imagery],
17 target: container,
18 view: new ol.View({
19 center: ol.proj.fromLonLat([-109, 46.5]),
20 zoom: 6
21 })
22});
23
24var radius = 75;
25document.addEventListener('keydown', function(evt) {
26 if (evt.which === 38) {
27 radius = Math.min(radius + 5, 150);
28 map.render();
29 evt.preventDefault();
30 } else if (evt.which === 40) {
31 radius = Math.max(radius - 5, 25);
32 map.render();
33 evt.preventDefault();
34 }
35});
36
37// get the pixel position with every move
38var mousePosition = null;
39
40container.addEventListener('mousemove', function(event) {
41 mousePosition = map.getEventPixel(event);
42 map.render();
43});
44
45container.addEventListener('mouseout', function() {
46 mousePosition = null;
47 map.render();
48});
49
50// after rendering the layer, show an oversampled version around the pointer
51imagery.on('postcompose', function(event) {
52 if (mousePosition) {
53 var context = event.context;
54 var pixelRatio = event.frameState.pixelRatio;
55 var half = radius * pixelRatio;
56 var centerX = mousePosition[0] * pixelRatio;
57 var centerY = mousePosition[1] * pixelRatio;
58 var originX = centerX - half;
59 var originY = centerY - half;
60 var size = 2 * half + 1;
61 var sourceData = context.getImageData(originX, originY, size, size).data;
62 var dest = context.createImageData(size, size);
63 var destData = dest.data;
64 for (var j = 0; j < size; ++j) {
65 for (var i = 0; i < size; ++i) {
66 var dI = i - half;
67 var dJ = j - half;
68 var dist = Math.sqrt(dI * dI + dJ * dJ);
69 var sourceI = i;
70 var sourceJ = j;
71 if (dist < half) {
72 sourceI = Math.round(half + dI / 2);
73 sourceJ = Math.round(half + dJ / 2);
74 }
75 var destOffset = (j * size + i) * 4;
76 var sourceOffset = (sourceJ * size + sourceI) * 4;
77 destData[destOffset] = sourceData[sourceOffset];
78 destData[destOffset + 1] = sourceData[sourceOffset + 1];
79 destData[destOffset + 2] = sourceData[sourceOffset + 2];
80 destData[destOffset + 3] = sourceData[sourceOffset + 3];
81 }
82 }
83 context.beginPath();
84 context.arc(centerX, centerY, half, 0, 2 * Math.PI);
85 context.lineWidth = 3 * pixelRatio;
86 context.strokeStyle = 'rgba(255,255,255,0.5)';
87 context.putImageData(dest, originX, originY);
88 context.stroke();
89 context.restore();
90 }
91});