From f67767aaf0fd5caa6cb8d221d2e19ff51c381be7 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 27 Jun 2014 12:10:46 +0200 Subject: [PATCH] Add ol.renderer.vector.getSquaredTolerance and ol.SIMPLIFY_TOLERANCE --- src/ol/featureoverlay.js | 5 ++--- src/ol/geom/flat/simplifyflatgeom.js | 4 ++-- src/ol/ol.js | 6 ++++++ src/ol/render/vector.js | 21 +++++++++++++++++++ src/ol/renderer/canvas/canvasmaprenderer.js | 5 +++-- .../canvas/canvasvectorlayerrenderer.js | 13 ++++++------ src/ol/source/imagevectorsource.js | 12 +++++------ 7 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/ol/featureoverlay.js b/src/ol/featureoverlay.js index 5419977f32..77e3055274 100644 --- a/src/ol/featureoverlay.js +++ b/src/ol/featureoverlay.js @@ -174,8 +174,6 @@ ol.FeatureOverlay.prototype.handleMapPostCompose_ = function(event) { var frameState = event.frameState; var pixelRatio = frameState.pixelRatio; var resolution = frameState.view2DState.resolution; - var squaredTolerance = - resolution * resolution / (4 * pixelRatio * pixelRatio); var i, ii, styles; this.features_.forEach(function(feature) { styles = styleFunction(feature, resolution); @@ -185,7 +183,8 @@ ol.FeatureOverlay.prototype.handleMapPostCompose_ = function(event) { ii = styles.length; for (i = 0; i < ii; ++i) { ol.renderer.vector.renderFeature(replayGroup, feature, styles[i], - squaredTolerance, feature, this.handleImageChange_, this); + ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), + feature, this.handleImageChange_, this); } }, this); }; diff --git a/src/ol/geom/flat/simplifyflatgeom.js b/src/ol/geom/flat/simplifyflatgeom.js index b5f2032040..e1f992fc1c 100644 --- a/src/ol/geom/flat/simplifyflatgeom.js +++ b/src/ol/geom/flat/simplifyflatgeom.js @@ -238,7 +238,7 @@ ol.geom.flat.simplify.radialDistance = function(flatCoordinates, offset, end, /** * @param {number} value Value. - * @param {number} tolerance Squared tolerance. + * @param {number} tolerance Tolerance. * @return {number} Rounded value. */ ol.geom.flat.simplify.snap = function(value, tolerance) { @@ -259,7 +259,7 @@ ol.geom.flat.simplify.snap = function(value, tolerance) { * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. - * @param {number} tolerance Squared tolerance. + * @param {number} tolerance Tolerance. * @param {Array.} simplifiedFlatCoordinates Simplified flat * coordinates. * @param {number} simplifiedOffset Simplified offset. diff --git a/src/ol/ol.js b/src/ol/ol.js index 56c0874dc6..c2057ed4c4 100644 --- a/src/ol/ol.js +++ b/src/ol/ol.js @@ -173,6 +173,12 @@ ol.MOUSEWHEELZOOM_TIMEOUT_DURATION = 80; ol.ROTATE_ANIMATION_DURATION = 250; +/** + * @define {number} Tolerance for geometry simplification in device pixels. + */ +ol.SIMPLIFY_TOLERANCE = 0.5; + + /** * @define {number} Texture cache high water mark. */ diff --git a/src/ol/render/vector.js b/src/ol/render/vector.js index 93271dd843..39b259670a 100644 --- a/src/ol/render/vector.js +++ b/src/ol/render/vector.js @@ -24,6 +24,27 @@ ol.renderer.vector.defaultOrder = function(feature1, feature2) { }; +/** + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @return {number} Squared pixel tolerance. + */ +ol.renderer.vector.getSquaredTolerance = function(resolution, pixelRatio) { + var tolerance = ol.renderer.vector.getTolerance(resolution, pixelRatio); + return tolerance * tolerance; +}; + + +/** + * @param {number} resolution Resolution. + * @param {number} pixelRatio Pixel ratio. + * @return {number} Pixel tolerance. + */ +ol.renderer.vector.getTolerance = function(resolution, pixelRatio) { + return ol.SIMPLIFY_TOLERANCE * resolution / pixelRatio; +}; + + /** * @param {ol.render.IReplayGroup} replayGroup Replay group. * @param {ol.geom.Geometry} geometry Geometry. diff --git a/src/ol/renderer/canvas/canvasmaprenderer.js b/src/ol/renderer/canvas/canvasmaprenderer.js index 1211d408ba..7177e5c824 100644 --- a/src/ol/renderer/canvas/canvasmaprenderer.js +++ b/src/ol/renderer/canvas/canvasmaprenderer.js @@ -23,6 +23,7 @@ goog.require('ol.renderer.canvas.ImageLayer'); goog.require('ol.renderer.canvas.Layer'); goog.require('ol.renderer.canvas.TileLayer'); goog.require('ol.renderer.canvas.VectorLayer'); +goog.require('ol.renderer.vector'); goog.require('ol.source.State'); goog.require('ol.vec.Mat4'); @@ -112,8 +113,8 @@ ol.renderer.canvas.Map.prototype.dispatchComposeEvent_ = -view2DState.center[0], -view2DState.center[1]); var vectorContext = new ol.render.canvas.Immediate(context, pixelRatio, extent, this.transform_, rotation); - var tolerance = resolution / (2 * pixelRatio); - var replayGroup = new ol.render.canvas.ReplayGroup(tolerance, extent, + var replayGroup = new ol.render.canvas.ReplayGroup( + ol.renderer.vector.getTolerance(resolution, pixelRatio), extent, resolution); var composeEvent = new ol.render.Event(type, map, vectorContext, replayGroup, frameState, context, null); diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index aa148b4d77..19970bdc7f 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -206,9 +206,10 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = if (!goog.isDef(styleFunction)) { styleFunction = ol.feature.defaultStyleFunction; } - var tolerance = resolution / (2 * pixelRatio); var replayGroup = - new ol.render.canvas.ReplayGroup(tolerance, extent, resolution); + new ol.render.canvas.ReplayGroup( + ol.renderer.vector.getTolerance(resolution, pixelRatio), extent, + resolution); vectorSource.loadFeatures(extent, resolution, projection); var renderFeature = /** @@ -261,14 +262,12 @@ ol.renderer.canvas.VectorLayer.prototype.renderFeature = if (!goog.isDefAndNotNull(styles)) { return false; } - // simplify to a tolerance of half a device pixel - var squaredTolerance = - resolution * resolution / (4 * pixelRatio * pixelRatio); var i, ii, loading = false; for (i = 0, ii = styles.length; i < ii; ++i) { loading = ol.renderer.vector.renderFeature( - replayGroup, feature, styles[i], squaredTolerance, feature, - this.handleImageChange_, this) || loading; + replayGroup, feature, styles[i], + ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), + feature, this.handleImageChange_, this) || loading; } return loading; }; diff --git a/src/ol/source/imagevectorsource.js b/src/ol/source/imagevectorsource.js index c26b1a9d87..992ac56c7c 100644 --- a/src/ol/source/imagevectorsource.js +++ b/src/ol/source/imagevectorsource.js @@ -102,8 +102,8 @@ goog.inherits(ol.source.ImageVector, ol.source.ImageCanvas); ol.source.ImageVector.prototype.canvasFunctionInternal_ = function(extent, resolution, pixelRatio, size, projection) { - var tolerance = resolution / (2 * pixelRatio); - var replayGroup = new ol.render.canvas.ReplayGroup(tolerance, extent, + var replayGroup = new ol.render.canvas.ReplayGroup( + ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), extent, resolution); var loading = false; @@ -226,14 +226,12 @@ ol.source.ImageVector.prototype.renderFeature_ = if (!goog.isDefAndNotNull(styles)) { return false; } - // simplify to a tolerance of half a device pixel - var squaredTolerance = - resolution * resolution / (4 * pixelRatio * pixelRatio); var i, ii, loading = false; for (i = 0, ii = styles.length; i < ii; ++i) { loading = ol.renderer.vector.renderFeature( - replayGroup, feature, styles[i], squaredTolerance, feature, - this.handleImageChange_, this) || loading; + replayGroup, feature, styles[i], + ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), + feature, this.handleImageChange_, this) || loading; } return loading; };