new example
This commit is contained in:
18
examples/projection-and-scale.html
Normal file
18
examples/projection-and-scale.html
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
layout: example.html
|
||||
title: Projection and Scale
|
||||
shortdesc: Example of maintaining scale when changing projection.
|
||||
docs: >
|
||||
Example of maintaining scale when changing projection.
|
||||
`getPointResolution()` is used to calculate the resolution for the
|
||||
new projection which corresponds to that for the old projection.
|
||||
tags: "projection, scale"
|
||||
---
|
||||
<div id="map" class="map"></div>
|
||||
<div>
|
||||
<label for="view-projection">View projection</label>
|
||||
<select id="view-projection">
|
||||
<option value="EPSG:3857">Spherical Mercator (EPSG:3857)</option>
|
||||
<option value="EPSG:4326" selected>WGS 84 (EPSG:4326)</option>
|
||||
</select>
|
||||
</div>
|
||||
68
examples/projection-and-scale.js
Normal file
68
examples/projection-and-scale.js
Normal file
@@ -0,0 +1,68 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user