Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Better getPointResolution default when no transform available #11811

Merged
merged 5 commits into from Dec 13, 2020
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions examples/wms-no-proj.js
Expand Up @@ -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({
Expand Down Expand Up @@ -37,12 +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()]),
layers: layers,
target: 'map',
view: new View({
Expand Down
33 changes: 19 additions & 14 deletions src/ol/proj.js
Expand Up @@ -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();
Expand Down