Merge pull request #11811 from mike-000/patch-6

Better getPointResolution default when no transform available
This commit is contained in:
Andreas Hocevar
2020-12-13 22:33:09 +01:00
committed by GitHub
3 changed files with 36 additions and 14 deletions

View File

@@ -4,6 +4,7 @@ import Projection from '../src/ol/proj/Projection.js';
import TileWMS from '../src/ol/source/TileWMS.js'; import TileWMS from '../src/ol/source/TileWMS.js';
import View from '../src/ol/View.js'; import View from '../src/ol/View.js';
import {Image as ImageLayer, Tile as TileLayer} from '../src/ol/layer.js'; import {Image as ImageLayer, Tile as TileLayer} from '../src/ol/layer.js';
import {ScaleLine, defaults as defaultControls} from '../src/ol/control.js';
const layers = [ const layers = [
new TileLayer({ new TileLayer({
@@ -37,12 +38,18 @@ const layers = [
// projection object. Requesting tiles only needs the code together with a // projection object. Requesting tiles only needs the code together with a
// tile grid of Cartesian coordinates; it does not matter how those // tile grid of Cartesian coordinates; it does not matter how those
// coordinates relate to latitude or longitude. // coordinates relate to latitude or longitude.
//
// With no transforms available projection units must be assumed to represent
// true distances. In the case of local projections this may be a sufficiently
// close approximation for a meaningful (if not 100% accurate) ScaleLine control.
const projection = new Projection({ const projection = new Projection({
code: 'EPSG:21781', code: 'EPSG:21781',
units: 'm', units: 'm',
}); });
const map = new Map({ const map = new Map({
controls: defaultControls().extend([new ScaleLine()]),
layers: layers, layers: layers,
target: 'map', target: 'map',
view: new View({ view: new View({

View File

@@ -212,20 +212,25 @@ export function getPointResolution(projection, resolution, point, opt_units) {
projection, projection,
get('EPSG:4326') get('EPSG:4326')
); );
let vertices = [ if (toEPSG4326 === identityTransform && units !== Units.DEGREES) {
point[0] - resolution / 2, // no transform is available
point[1], pointResolution = resolution * projection.getMetersPerUnit();
point[0] + resolution / 2, } else {
point[1], let vertices = [
point[0], point[0] - resolution / 2,
point[1] - resolution / 2, point[1],
point[0], point[0] + resolution / 2,
point[1] + resolution / 2, point[1],
]; point[0],
vertices = toEPSG4326(vertices, vertices, 2); point[1] - resolution / 2,
const width = getDistance(vertices.slice(0, 2), vertices.slice(2, 4)); point[0],
const height = getDistance(vertices.slice(4, 6), vertices.slice(6, 8)); point[1] + resolution / 2,
pointResolution = (width + height) / 2; ];
vertices = toEPSG4326(vertices, vertices, 2);
const width = getDistance(vertices.slice(0, 2), vertices.slice(2, 4));
const height = getDistance(vertices.slice(4, 6), vertices.slice(6, 8));
pointResolution = (width + height) / 2;
}
const metersPerUnit = opt_units const metersPerUnit = opt_units
? METERS_PER_UNIT[opt_units] ? METERS_PER_UNIT[opt_units]
: projection.getMetersPerUnit(); : projection.getMetersPerUnit();

View File

@@ -410,6 +410,16 @@ describe('ol.proj', function () {
); );
expect(pointResolution).to.be(1); expect(pointResolution).to.be(1);
}); });
it('returns the nominal resolution for projections without transforms', function () {
const projection = new Projection({
code: 'foo',
units: 'ft',
});
let pointResolution = getPointResolution(projection, 2, [0, 0]);
expect(pointResolution).to.be(2);
pointResolution = getPointResolution(projection, 2, [0, 0], 'm');
expect(pointResolution).to.be(0.6096);
});
}); });
describe('Proj4js integration', function () { describe('Proj4js integration', function () {