| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 
 | import Feature from 'ol/Feature.js';import Map from 'ol/Map.js';
 import Overlay from 'ol/Overlay.js';
 import Point from 'ol/geom/Point.js';
 import TileJSON from 'ol/source/TileJSON.js';
 import VectorSource from 'ol/source/Vector.js';
 import View from 'ol/View.js';
 import {Icon, Style} from 'ol/style.js';
 import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer.js';
 
 const iconFeature = new Feature({
 geometry: new Point([0, 0]),
 name: 'Null Island',
 population: 4000,
 rainfall: 500,
 });
 
 const iconStyle = new Style({
 image: new Icon({
 anchor: [0.5, 46],
 anchorXUnits: 'fraction',
 anchorYUnits: 'pixels',
 src: 'data/icon.png',
 }),
 });
 
 iconFeature.setStyle(iconStyle);
 
 const vectorSource = new VectorSource({
 features: [iconFeature],
 });
 
 const vectorLayer = new VectorLayer({
 source: vectorSource,
 });
 
 const rasterLayer = new TileLayer({
 source: new TileJSON({
 url: 'https://a.tiles.mapbox.com/v3/aj.1x1-degrees.json?secure=1',
 crossOrigin: '',
 }),
 });
 
 const map = new Map({
 layers: [rasterLayer, vectorLayer],
 target: document.getElementById('map'),
 view: new View({
 center: [0, 0],
 zoom: 3,
 }),
 });
 
 const element = document.getElementById('popup');
 
 const popup = new Overlay({
 element: element,
 positioning: 'bottom-center',
 stopEvent: false,
 });
 map.addOverlay(popup);
 
 let popover;
 function disposePopover() {
 if (popover) {
 popover.dispose();
 popover = undefined;
 }
 }
 
 map.on('click', function (evt) {
 const feature = map.forEachFeatureAtPixel(evt.pixel, function (feature) {
 return feature;
 });
 disposePopover();
 if (!feature) {
 return;
 }
 popup.setPosition(evt.coordinate);
 popover = new bootstrap.Popover(element, {
 placement: 'top',
 html: true,
 content: feature.get('name'),
 });
 popover.show();
 });
 
 
 map.on('pointermove', function (e) {
 const pixel = map.getEventPixel(e.originalEvent);
 const hit = map.hasFeatureAtPixel(pixel);
 map.getTarget().style.cursor = hit ? 'pointer' : '';
 });
 
 map.on('movestart', disposePopover);
 
 |