69 lines
1.8 KiB
JavaScript
69 lines
1.8 KiB
JavaScript
import Map from '../src/ol/Map.js';
|
|
import OSM from '../src/ol/source/OSM.js';
|
|
import TileLayer from '../src/ol/layer/Tile.js';
|
|
import View from '../src/ol/View.js';
|
|
import {ScaleLine, defaults as defaultControls} from '../src/ol/control.js';
|
|
import {
|
|
getPointResolution,
|
|
get as getProjection,
|
|
transform,
|
|
} from '../src/ol/proj.js';
|
|
|
|
const viewProjSelect = document.getElementById('view-projection');
|
|
const projection = getProjection(viewProjSelect.value);
|
|
|
|
const scaleControl = new ScaleLine({
|
|
units: 'metric',
|
|
bar: true,
|
|
steps: 4,
|
|
text: true,
|
|
minWidth: 140,
|
|
});
|
|
|
|
const map = new Map({
|
|
controls: defaultControls().extend([scaleControl]),
|
|
layers: [
|
|
new TileLayer({
|
|
source: new OSM(),
|
|
}),
|
|
],
|
|
target: 'map',
|
|
view: new View({
|
|
center: transform([0, 52], 'EPSG:4326', projection),
|
|
zoom: 6,
|
|
projection: projection,
|
|
}),
|
|
});
|
|
|
|
function onChangeProjection() {
|
|
const currentView = map.getView();
|
|
const currentProjection = currentView.getProjection();
|
|
const newProjection = getProjection(viewProjSelect.value);
|
|
const currentResolution = currentView.getResolution();
|
|
const currentCenter = currentView.getCenter();
|
|
const currentRotation = currentView.getRotation();
|
|
const newCenter = transform(currentCenter, currentProjection, newProjection);
|
|
const currentPointResolution = getPointResolution(
|
|
currentProjection,
|
|
1,
|
|
currentCenter,
|
|
'm'
|
|
);
|
|
const newPointResolution = getPointResolution(
|
|
newProjection,
|
|
1,
|
|
newCenter,
|
|
'm'
|
|
);
|
|
const newResolution =
|
|
(currentResolution * currentPointResolution) / newPointResolution;
|
|
const newView = new View({
|
|
center: newCenter,
|
|
resolution: newResolution,
|
|
rotation: currentRotation,
|
|
projection: newProjection,
|
|
});
|
|
map.setView(newView);
|
|
}
|
|
viewProjSelect.addEventListener('change', onChangeProjection);
|