diff --git a/src/ol/View.js b/src/ol/View.js index 4acc41003a..bda219cb0d 100644 --- a/src/ol/View.js +++ b/src/ol/View.js @@ -10,6 +10,7 @@ import {DEFAULT_TILE_SIZE} from './tilegrid/common.js'; import { METERS_PER_UNIT, createProjection, + disableCoordinateWarning, fromUserCoordinate, fromUserExtent, getUserProjection, @@ -241,7 +242,7 @@ const DEFAULT_MIN_ZOOM = 0; * A View has a `projection`. The projection determines the * coordinate system of the center, and its units determine the units of the * resolution (projection units per pixel). The default projection is - * Spherical Mercator (EPSG:3857). + * Web Mercator (EPSG:3857). * * ### The view states * @@ -406,6 +407,9 @@ class View extends BaseObject { if (options.extent) { options.extent = fromUserExtent(options.extent, this.projection_); } + if (options.projection) { + disableCoordinateWarning(); + } this.applyOptions_(options); } diff --git a/src/ol/proj.js b/src/ol/proj.js index 9071ef9360..c8c3876c4b 100644 --- a/src/ol/proj.js +++ b/src/ol/proj.js @@ -73,8 +73,8 @@ import { } from './proj/transforms.js'; import {applyTransform, getWidth} from './extent.js'; import {clamp, modulo} from './math.js'; +import {equals, getWorldsAway} from './coordinate.js'; import {getDistance} from './sphere.js'; -import {getWorldsAway} from './coordinate.js'; /** * A projection as {@link module:ol/proj/Projection}, SRS identifier @@ -97,6 +97,16 @@ export {METERS_PER_UNIT}; export {Projection}; +let showCoordinateWarning = true; + +/** + * @param {boolean} [opt_disable = true] Disable console info about `useGeographic()` + */ +export function disableCoordinateWarning(opt_disable) { + const hide = opt_disable === undefined ? true : opt_disable; + showCoordinateWarning = !hide; +} + /** * @param {Array} input Input coordinate array. * @param {Array} [opt_output] Output array of coordinate values. @@ -386,6 +396,7 @@ export function addCoordinateTransforms(source, destination, forward, inverse) { * @api */ export function fromLonLat(coordinate, opt_projection) { + disableCoordinateWarning(); return transform( coordinate, 'EPSG:4326', @@ -598,6 +609,20 @@ export function toUserCoordinate(coordinate, sourceProjection) { */ export function fromUserCoordinate(coordinate, destProjection) { if (!userProjection) { + if ( + showCoordinateWarning && + !equals(coordinate, [0, 0]) && + coordinate[0] >= -180 && + coordinate[0] <= 180 && + coordinate[1] >= -90 && + coordinate[1] <= 90 + ) { + showCoordinateWarning = false; + // eslint-disable-next-line no-console + console.warn( + 'Call useGeographic() ol/proj once to work with [longitude, latitude] coordinates.' + ); + } return coordinate; } return transform(coordinate, userProjection, destProjection); diff --git a/test/node/ol/proj.test.js b/test/node/ol/proj.test.js index 5002b807b7..5cf40ab139 100644 --- a/test/node/ol/proj.test.js +++ b/test/node/ol/proj.test.js @@ -1,5 +1,6 @@ import Projection from '../../../src/ol/proj/Projection.js'; import Units from '../../../src/ol/proj/Units.js'; +import View from '../../../src/ol/View.js'; import expect from '../expect.js'; import proj4 from 'proj4'; import {HALF_SIZE} from '../../../src/ol/proj/epsg3857.js'; @@ -8,6 +9,7 @@ import { addCommon, clearAllProjections, clearUserProjection, + disableCoordinateWarning, equivalent, fromLonLat, fromUserCoordinate, @@ -890,4 +892,43 @@ describe('ol/proj.js', function () { ); }); }); + + describe('Console info about `setUserProjection`', function () { + let originalConsole, callCount; + beforeEach(function () { + disableCoordinateWarning(false); + originalConsole = console; + callCount = 0; + global.console = { + ...console, + warn: () => ++callCount, + }; + }); + afterEach(function () { + global.console = originalConsole; + clearUserProjection(); + }); + it('is shown once when suspicious coordinates are used', function () { + const view = new View({ + center: [16, 48], + }); + view.setCenter([15, 47]); + expect(callCount).to.be(1); + }); + it('is not shown when fromLonLat() is used', function () { + const view = new View({ + center: fromLonLat([16, 48]), + }); + view.setCenter(fromLonLat([15, 47])); + expect(callCount).to.be(0); + }); + it('is not shown when useGeographic() is used', function () { + useGeographic(); + const view = new View({ + center: [16, 48], + }); + view.setCenter([15, 47]); + expect(callCount).to.be(0); + }); + }); });