diff --git a/externs/olx.js b/externs/olx.js
index 83c1e2f418..48f6e8c8cf 100644
--- a/externs/olx.js
+++ b/externs/olx.js
@@ -3188,6 +3188,7 @@ olx.layer.TileOptions.prototype.useInterimTilesOnError;
* minResolution: (number|undefined),
* maxResolution: (number|undefined),
* opacity: (number|undefined),
+ * renderBuffer: (number|undefined),
* saturation: (number|undefined),
* source: (ol.source.Vector|undefined),
* style: (ol.style.Style|Array.
|ol.style.StyleFunction|undefined),
@@ -3264,6 +3265,16 @@ olx.layer.VectorOptions.prototype.maxResolution;
olx.layer.VectorOptions.prototype.opacity;
+/**
+ * The buffer around the viewport extent used by the renderer when getting
+ * features from the vector source. Recommended value: the size of the
+ * largest symbol or line width. Default is 100 pixels.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.VectorOptions.prototype.renderBuffer;
+
+
/**
* Saturation.
* @type {number|undefined}
diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js
index 2acd21415a..025f76e4dd 100644
--- a/src/ol/layer/vectorlayer.js
+++ b/src/ol/layer/vectorlayer.js
@@ -37,6 +37,13 @@ ol.layer.Vector = function(opt_options) {
delete baseOptions.style;
goog.base(this, /** @type {olx.layer.LayerOptions} */ (baseOptions));
+ /**
+ * @type {number}
+ * @private
+ */
+ this.renderBuffer_ = goog.isDef(options.renderBuffer) ?
+ options.renderBuffer : 100;
+
/**
* User provided style.
* @type {ol.style.Style|Array.|ol.style.StyleFunction}
@@ -57,6 +64,14 @@ ol.layer.Vector = function(opt_options) {
goog.inherits(ol.layer.Vector, ol.layer.Layer);
+/**
+ * @return {number|undefined} Render buffer.
+ */
+ol.layer.Vector.prototype.getRenderBuffer = function() {
+ return this.renderBuffer_;
+};
+
+
/**
* @return {function(ol.Feature, ol.Feature): number|null|undefined} Render
* order.
diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
index d53f68fb65..f34d4c3a4b 100644
--- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
+++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
@@ -194,12 +194,8 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame =
}
var extent = this.renderedExtent_;
- var xBuffer = ol.extent.getWidth(frameStateExtent) / 4;
- var yBuffer = ol.extent.getHeight(frameStateExtent) / 4;
- extent[0] = frameStateExtent[0] - xBuffer;
- extent[1] = frameStateExtent[1] - yBuffer;
- extent[2] = frameStateExtent[2] + xBuffer;
- extent[3] = frameStateExtent[3] + yBuffer;
+ var renderBuffer = vectorLayer.getRenderBuffer();
+ ol.extent.buffer(frameStateExtent, renderBuffer * resolution, extent);
// FIXME dispose of old replayGroup in post render
goog.dispose(this.replayGroup_);
diff --git a/src/ol/renderer/dom/domvectorlayerrenderer.js b/src/ol/renderer/dom/domvectorlayerrenderer.js
index 6bc535af21..eb2593237d 100644
--- a/src/ol/renderer/dom/domvectorlayerrenderer.js
+++ b/src/ol/renderer/dom/domvectorlayerrenderer.js
@@ -234,12 +234,8 @@ ol.renderer.dom.VectorLayer.prototype.prepareFrame =
}
var extent = this.renderedExtent_;
- var xBuffer = ol.extent.getWidth(frameStateExtent) / 4;
- var yBuffer = ol.extent.getHeight(frameStateExtent) / 4;
- extent[0] = frameStateExtent[0] - xBuffer;
- extent[1] = frameStateExtent[1] - yBuffer;
- extent[2] = frameStateExtent[2] + xBuffer;
- extent[3] = frameStateExtent[3] + yBuffer;
+ var renderBuffer = vectorLayer.getRenderBuffer();
+ ol.extent.buffer(frameStateExtent, renderBuffer * resolution, extent);
// FIXME dispose of old replayGroup in post render
goog.dispose(this.replayGroup_);
diff --git a/src/ol/renderer/webgl/webglvectorlayerrenderer.js b/src/ol/renderer/webgl/webglvectorlayerrenderer.js
index 02947e8ace..4287ef99db 100644
--- a/src/ol/renderer/webgl/webglvectorlayerrenderer.js
+++ b/src/ol/renderer/webgl/webglvectorlayerrenderer.js
@@ -153,12 +153,8 @@ ol.renderer.webgl.VectorLayer.prototype.prepareFrame =
}
var extent = this.renderedExtent_;
- var xBuffer = ol.extent.getWidth(frameStateExtent) / 4;
- var yBuffer = ol.extent.getHeight(frameStateExtent) / 4;
- extent[0] = frameStateExtent[0] - xBuffer;
- extent[1] = frameStateExtent[1] - yBuffer;
- extent[2] = frameStateExtent[2] + xBuffer;
- extent[3] = frameStateExtent[3] + yBuffer;
+ var renderBuffer = vectorLayer.getRenderBuffer();
+ ol.extent.buffer(frameStateExtent, renderBuffer * resolution, extent);
if (!goog.isNull(this.replayGroup_)) {
frameState.postRenderFunctions.push(