diff --git a/src/ol/layer/Graticule.js b/src/ol/layer/Graticule.js index aa13cd8fee..15ba7cd2a1 100644 --- a/src/ol/layer/Graticule.js +++ b/src/ol/layer/Graticule.js @@ -437,8 +437,7 @@ class Graticule extends VectorLayer { features: new Collection(), overlaps: false, useSpatialIndex: false, - wrapX: options.wrapX, - loadWrapX: false + wrapX: options.wrapX }) ); diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index bdfe6c2e5b..beef39b2f3 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -361,7 +361,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const center = viewState.center.slice(); const extent = buffer(frameStateExtent, vectorLayerRenderBuffer * resolution); - let loadExtent = extent.slice(); + const loadExtent = extent.slice(); const projectionExtent = viewState.projection.getExtent(); if (vectorSource.getWrapX() && viewState.projection.canWrapX() && @@ -375,11 +375,10 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const gutter = Math.max(getWidth(extent) / 2, worldWidth); extent[0] = projectionExtent[0] - gutter; extent[2] = projectionExtent[2] + gutter; - if (vectorSource.getLoadWrapX()) { - loadExtent = extent; - } const worldsAway = Math.floor((center[0] - projectionExtent[0]) / worldWidth); center[0] -= (worldsAway * worldWidth); + loadExtent[0] -= (worldsAway * worldWidth); + loadExtent[2] -= (worldsAway * worldWidth); } if (!this.dirty_ && diff --git a/src/ol/source/Vector.js b/src/ol/source/Vector.js index edf1c4e25d..607f0d3b67 100644 --- a/src/ol/source/Vector.js +++ b/src/ol/source/Vector.js @@ -146,10 +146,6 @@ export class VectorSourceEvent extends Event { * @property {boolean} [wrapX=true] Wrap the world horizontally. For vector editing across the * -180° and 180° meridians to work properly, this should be set to `false`. The * resulting geometry coordinates will then exceed the world bounds. - * @property {boolean} [loadWrapX=true] Call the loader with one world width either side - * of the projection extent when the world is wrapped horizontally. This allows features - * to be loaded in a single request, but may be inefficient. If `false` only the viewport - * extent is used and the loader must determine the appropriate real world requests. */ @@ -190,12 +186,6 @@ class VectorSource extends Source { */ this.format_ = options.format; - /** - * @private - * @type {boolean} - */ - this.loadWrapX_ = options.loadWrapX === undefined ? true : options.loadWrapX; - /** * @private * @type {boolean} @@ -811,14 +801,6 @@ class VectorSource extends Source { } - /** - * @return {boolean} The loadWrapX option used to construct the source. - */ - getLoadWrapX() { - return this.loadWrapX_; - } - - /** * @return {boolean} The source can have overlapping geometries. */ diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index f163a6b4cf..05e7c011b6 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -1,7 +1,7 @@ import Feature from '../../../../../src/ol/Feature.js'; import Map from '../../../../../src/ol/Map.js'; import View from '../../../../../src/ol/View.js'; -import {buffer as bufferExtent, getWidth} from '../../../../../src/ol/extent.js'; +import {buffer as bufferExtent, getWidth, getCenter} from '../../../../../src/ol/extent.js'; import Circle from '../../../../../src/ol/geom/Circle.js'; import Point from '../../../../../src/ol/geom/Point.js'; import {fromExtent} from '../../../../../src/ol/geom/Polygon.js'; @@ -243,7 +243,6 @@ describe('ol.renderer.canvas.VectorLayer', function() { frameState = { viewHints: [], viewState: { - center: [0, 0], projection: projection, resolution: 1, rotation: 0 @@ -251,58 +250,72 @@ describe('ol.renderer.canvas.VectorLayer', function() { }; }); + function setExtent(extent) { + frameState.extent = extent; + frameState.viewState.center = getCenter(extent); + } + it('sets correct extent for small viewport near dateline', function() { - frameState.extent = - [projExtent[0] - 10000, -10000, projExtent[0] + 10000, 10000]; + setExtent([projExtent[0] - 10000, -10000, projExtent[0] + 10000, 10000]); renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); - expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); + expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); }); it('sets correct extent for viewport less than 1 world wide', function() { - frameState.extent = - [projExtent[0] - 10000, -10000, projExtent[1] - 10000, 10000]; + setExtent([projExtent[0] - 10000, -10000, projExtent[2] - 10000, 10000]); renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); - expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); + expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); }); it('sets correct extent for viewport more than 1 world wide', function() { - frameState.extent = - [2 * projExtent[0] - 10000, -10000, 2 * projExtent[1] + 10000, 10000]; + setExtent([2 * projExtent[0] + 10000, -10000, 2 * projExtent[2] - 10000, 10000]); renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 ], buffer)); - expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); + expect(loadExtent).to.eql(bufferExtent(frameState.extent, buffer)); }); - it('sets correct extent for viewport more than 2 worlds wide', function() { + it('sets correct extent for viewport more than 2 worlds wide, one world away', function() { - frameState.extent = [ - projExtent[0] - 2 * worldWidth - 10000, - -10000, projExtent[1] + 2 * worldWidth + 10000, 10000 - ]; + setExtent([projExtent[0] - 2 * worldWidth - 10000, + -10000, projExtent[0] + 2 * worldWidth + 10000, 10000 + ]); renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - 2 * worldWidth - 10000, -10000, projExtent[2] + 2 * worldWidth + 10000, 10000 ], buffer)); - expect(loadExtent).to.eql(renderer.replayGroup_.maxExtent_); + const normalizedExtent = [projExtent[0] - 2 * worldWidth + worldWidth - 10000, -10000, projExtent[0] + 2 * worldWidth + worldWidth + 10000, 10000]; + expect(loadExtent).to.eql(bufferExtent(normalizedExtent, buffer)); + }); + + it('sets correct extent for small viewport near dateline, one world away', function() { + + setExtent([-worldWidth - 10000, -10000, -worldWidth + 10000, 10000]); + renderer.prepareFrame(frameState); + expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ + projExtent[0] - worldWidth + buffer, + -10000, projExtent[2] + worldWidth - buffer, 10000 + ], buffer)); + const normalizedExtent = [-10000, -10000, 10000, 10000]; + expect(loadExtent).to.eql(bufferExtent(normalizedExtent, buffer)); }); it('sets replayGroupChanged correctly', function() { - frameState.extent = [-10000, -10000, 10000, 10000]; + setExtent([-10000, -10000, 10000, 10000]); renderer.prepareFrame(frameState); expect(renderer.replayGroupChanged).to.be(true); renderer.prepareFrame(frameState);