import {Feature, Map, Overlay, View} from '../src/ol/index.js'; import {OSM, Vector as VectorSource} from '../src/ol/source.js'; import {Point} from '../src/ol/geom.js'; import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; import {useGeographic} from '../src/ol/proj.js'; useGeographic(); const place = [-110, 45]; const point = new Point(place); const map = new Map({ target: 'map', view: new View({ center: place, zoom: 8, }), layers: [ new TileLayer({ source: new OSM(), }), new VectorLayer({ source: new VectorSource({ features: [new Feature(point)], }), style: { 'circle-radius': 9, 'circle-fill-color': 'red', }, }), ], }); const element = document.getElementById('popup'); const popup = new Overlay({ element: element, stopEvent: false, }); map.addOverlay(popup); function formatCoordinate(coordinate) { return `
lon${coordinate[0].toFixed(2)}
lat${coordinate[1].toFixed(2)}
`; } const info = document.getElementById('info'); map.on('moveend', function () { const view = map.getView(); const center = view.getCenter(); info.innerHTML = formatCoordinate(center); }); let popover; map.on('click', function (event) { if (popover) { popover.dispose(); popover = undefined; } const feature = map.getFeaturesAtPixel(event.pixel)[0]; if (!feature) { return; } const coordinate = feature.getGeometry().getCoordinates(); popup.setPosition([ coordinate[0] + Math.round(event.coordinate[0] / 360) * 360, coordinate[1], ]); popover = new bootstrap.Popover(element, { container: element.parentElement, content: formatCoordinate(coordinate), html: true, offset: [0, 20], placement: 'top', sanitize: false, }); popover.show(); }); map.on('pointermove', function (event) { const type = map.hasFeatureAtPixel(event.pixel) ? 'pointer' : 'inherit'; map.getViewport().style.cursor = type; });