From b0cea7139b7f085cb57904d7e73573a4c6ecef28 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 23 Sep 2013 19:22:28 +0200 Subject: [PATCH 1/2] Function to buffer an extent --- src/ol/extent.js | 13 +++++++++++++ test/spec/ol/extent.test.js | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/ol/extent.js b/src/ol/extent.js index 25464d5e68..f4651b1f7d 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -52,6 +52,19 @@ ol.extent.boundingExtentXYs_ = function(xs, ys, opt_extent) { }; +/** + * Increase an extent by the provided value. + * @param {ol.Extent} extent The extent to buffer. + * @param {number} value The amount by wich the extent should be buffered. + */ +ol.extent.buffer = function(extent, value) { + extent[0] -= value; + extent[1] -= value; + extent[2] += value; + extent[3] += value; +}; + + /** * Creates a clone of an extent. * diff --git a/test/spec/ol/extent.test.js b/test/spec/ol/extent.test.js index a2f032f423..182491d9a6 100644 --- a/test/spec/ol/extent.test.js +++ b/test/spec/ol/extent.test.js @@ -3,6 +3,16 @@ goog.provide('ol.test.extent'); describe('ol.extent', function() { + describe('buffer', function() { + + it('buffers an extent by some value', function() { + var extent = [-10, -20, 10, 20]; + ol.extent.buffer(extent, 15); + expect(extent).to.eql([-25, -35, 25, 35]); + }); + + }); + describe('clone', function() { it('creates a copy of an extent', function() { From b355c1f412dfdcdf4c9bde1eb372617ef1571c72 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 23 Sep 2013 21:17:48 +0200 Subject: [PATCH 2/2] When expiring tiles, consider max symbol size When an extent is invalidated, we have to expire tiles outside of that extent to account for symbolizer size. --- .../canvas/canvasvectorlayerrenderer.js | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index 8c3a1bb5e0..eb881e453d 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -1,5 +1,6 @@ goog.provide('ol.renderer.canvas.VectorLayer'); +goog.require('goog.asserts'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); goog.require('goog.events'); @@ -101,6 +102,13 @@ ol.renderer.canvas.VectorLayer = function(mapRenderer, layer) { */ this.tileArchetype_ = null; + /** + * The maximum symbol size ever rendered for this layer (in pixels). + * @private + * @type {number} + */ + this.maxSymbolPixelDim_ = 0; + /** * @private * @type {number} @@ -168,12 +176,18 @@ goog.inherits(ol.renderer.canvas.VectorLayer, ol.renderer.canvas.Layer); * @private */ ol.renderer.canvas.VectorLayer.prototype.expireTiles_ = function(extents) { + // buffer by max symbolizer size at rendered resolution + var resolution = this.renderedResolution_; + goog.asserts.assertNumber(resolution); var tileCache = this.tileCache_; var length = extents.length; + var extent; if (length > 0) { for (var i = 0; i < length; ++i) { + extent = ol.extent.clone(extents[i]); + ol.extent.buffer(extent, this.maxSymbolPixelDim_ * resolution / 2); tileCache.pruneTileRange( - this.tileGrid_.getTileRangeForExtentAndZ(extents[i], 0)); + this.tileGrid_.getTileRangeForExtentAndZ(extent, 0)); } } else { tileCache.clear(); @@ -509,6 +523,11 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame = var symbolSizes = sketchCanvasRenderer.getSymbolSizes(), maxSymbolSize = sketchCanvasRenderer.getMaxSymbolSize(), symbolOffsets = sketchCanvasRenderer.getSymbolOffsets(); + + // keep track of maximum pixel size for symbols rendered on this layer + this.maxSymbolPixelDim_ = Math.max(maxSymbolSize[0] / tileResolution, + maxSymbolSize[1] / tileResolution); + for (key in tilesToRender) { tileCoord = tilesToRender[key]; if (this.tileCache_.containsKey(key)) {