From 2bb8aa0f32e919cd1168a084ca416ed3f242d674 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Mon, 7 Dec 2020 17:32:08 +0000 Subject: [PATCH 1/5] Better default when no transform available Do not use identityTransform for EPSG:4326 transform unless units are degrees --- src/ol/proj.js | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/ol/proj.js b/src/ol/proj.js index 9d59af3dc0..c508ef754e 100644 --- a/src/ol/proj.js +++ b/src/ol/proj.js @@ -212,20 +212,25 @@ export function getPointResolution(projection, resolution, point, opt_units) { projection, get('EPSG:4326') ); - let vertices = [ - point[0] - resolution / 2, - point[1], - point[0] + resolution / 2, - point[1], - point[0], - point[1] - resolution / 2, - point[0], - point[1] + resolution / 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; + if (toEPSG4326 === identityTransform && units !== Units.DEGREES) { + // no transform is available + pointResolution = resolution * projection.getMetersPerUnit(); + } else { + let vertices = [ + point[0] - resolution / 2, + point[1], + point[0] + resolution / 2, + point[1], + point[0], + point[1] - resolution / 2, + point[0], + point[1] + resolution / 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 ? METERS_PER_UNIT[opt_units] : projection.getMetersPerUnit(); From 884799db20f323076c69160d3abf023b27aacb0c Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Tue, 8 Dec 2020 14:01:20 +0000 Subject: [PATCH 2/5] Add ScaleLine (based on projection units) --- examples/wms-no-proj.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/examples/wms-no-proj.js b/examples/wms-no-proj.js index d0692a6455..1300ca8f23 100644 --- a/examples/wms-no-proj.js +++ b/examples/wms-no-proj.js @@ -4,6 +4,7 @@ import Projection from '../src/ol/proj/Projection.js'; import TileWMS from '../src/ol/source/TileWMS.js'; import View from '../src/ol/View.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 = [ new TileLayer({ @@ -37,12 +38,20 @@ const layers = [ // projection object. Requesting tiles only needs the code together with a // tile grid of Cartesian coordinates; it does not matter how those // 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({ code: 'EPSG:21781', units: 'm', }); const map = new Map({ + controls: defaultControls().extend([ + new ScaleLine({ + units: 'metric', + }), + ]), layers: layers, target: 'map', view: new View({ From 519e10b36121c89bca16326ed57a72df8cd43fd6 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Wed, 9 Dec 2020 22:47:38 +0000 Subject: [PATCH 3/5] tidier comments --- examples/wms-no-proj.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/wms-no-proj.js b/examples/wms-no-proj.js index 1300ca8f23..578dfdd7eb 100644 --- a/examples/wms-no-proj.js +++ b/examples/wms-no-proj.js @@ -38,20 +38,18 @@ const layers = [ // projection object. Requesting tiles only needs the code together with a // tile grid of Cartesian coordinates; it does not matter how those // 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({ code: 'EPSG:21781', units: 'm', }); const map = new Map({ - controls: defaultControls().extend([ - new ScaleLine({ - units: 'metric', - }), - ]), + controls: defaultControls().extend([new ScaleLine()]), layers: layers, target: 'map', view: new View({ From a9adb1850ff4c722f8f77cabf4ad0bd7490295a3 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Thu, 10 Dec 2020 11:18:46 +0000 Subject: [PATCH 4/5] Test projections without transforms --- test/spec/ol/proj.test.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/spec/ol/proj.test.js b/test/spec/ol/proj.test.js index c98c90c036..f5f3fbf8ca 100644 --- a/test/spec/ol/proj.test.js +++ b/test/spec/ol/proj.test.js @@ -410,6 +410,25 @@ describe('ol.proj', function () { ); 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 () { From 51db8f9308fd96655f8fd212c64a8aae951f4c25 Mon Sep 17 00:00:00 2001 From: mike-000 <49240900+mike-000@users.noreply.github.com> Date: Thu, 10 Dec 2020 11:22:40 +0000 Subject: [PATCH 5/5] Test projections without transforms --- test/spec/ol/proj.test.js | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/test/spec/ol/proj.test.js b/test/spec/ol/proj.test.js index f5f3fbf8ca..eb0b9f7feb 100644 --- a/test/spec/ol/proj.test.js +++ b/test/spec/ol/proj.test.js @@ -415,18 +415,9 @@ describe('ol.proj', function () { code: 'foo', units: 'ft', }); - let pointResolution = getPointResolution( - projection, - 2, - [0, 0] - ); + let pointResolution = getPointResolution(projection, 2, [0, 0]); expect(pointResolution).to.be(2); - pointResolution = getPointResolution( - projection, - 2, - [0, 0], - 'm' - ); + pointResolution = getPointResolution(projection, 2, [0, 0], 'm'); expect(pointResolution).to.be(0.6096); }); });