91 lines
2.1 KiB
JavaScript
91 lines
2.1 KiB
JavaScript
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 `
|
|
<table>
|
|
<tbody>
|
|
<tr><th>lon</th><td>${coordinate[0].toFixed(2)}</td></tr>
|
|
<tr><th>lat</th><td>${coordinate[1].toFixed(2)}</td></tr>
|
|
</tbody>
|
|
</table>`;
|
|
}
|
|
|
|
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;
|
|
});
|