Add ol.renderer.vector.getSquaredTolerance and ol.SIMPLIFY_TOLERANCE

This commit is contained in:
Andreas Hocevar
2014-06-27 12:10:46 +02:00
parent 2171c92b5c
commit f67767aaf0
7 changed files with 45 additions and 21 deletions

View File

@@ -174,8 +174,6 @@ ol.FeatureOverlay.prototype.handleMapPostCompose_ = function(event) {
var frameState = event.frameState; var frameState = event.frameState;
var pixelRatio = frameState.pixelRatio; var pixelRatio = frameState.pixelRatio;
var resolution = frameState.view2DState.resolution; var resolution = frameState.view2DState.resolution;
var squaredTolerance =
resolution * resolution / (4 * pixelRatio * pixelRatio);
var i, ii, styles; var i, ii, styles;
this.features_.forEach(function(feature) { this.features_.forEach(function(feature) {
styles = styleFunction(feature, resolution); styles = styleFunction(feature, resolution);
@@ -185,7 +183,8 @@ ol.FeatureOverlay.prototype.handleMapPostCompose_ = function(event) {
ii = styles.length; ii = styles.length;
for (i = 0; i < ii; ++i) { for (i = 0; i < ii; ++i) {
ol.renderer.vector.renderFeature(replayGroup, feature, styles[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); }, this);
}; };

View File

@@ -238,7 +238,7 @@ ol.geom.flat.simplify.radialDistance = function(flatCoordinates, offset, end,
/** /**
* @param {number} value Value. * @param {number} value Value.
* @param {number} tolerance Squared tolerance. * @param {number} tolerance Tolerance.
* @return {number} Rounded value. * @return {number} Rounded value.
*/ */
ol.geom.flat.simplify.snap = function(value, tolerance) { 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} offset Offset.
* @param {number} end End. * @param {number} end End.
* @param {number} stride Stride. * @param {number} stride Stride.
* @param {number} tolerance Squared tolerance. * @param {number} tolerance Tolerance.
* @param {Array.<number>} simplifiedFlatCoordinates Simplified flat * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
* coordinates. * coordinates.
* @param {number} simplifiedOffset Simplified offset. * @param {number} simplifiedOffset Simplified offset.

View File

@@ -173,6 +173,12 @@ ol.MOUSEWHEELZOOM_TIMEOUT_DURATION = 80;
ol.ROTATE_ANIMATION_DURATION = 250; 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. * @define {number} Texture cache high water mark.
*/ */

View File

@@ -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.render.IReplayGroup} replayGroup Replay group.
* @param {ol.geom.Geometry} geometry Geometry. * @param {ol.geom.Geometry} geometry Geometry.

View File

@@ -23,6 +23,7 @@ goog.require('ol.renderer.canvas.ImageLayer');
goog.require('ol.renderer.canvas.Layer'); goog.require('ol.renderer.canvas.Layer');
goog.require('ol.renderer.canvas.TileLayer'); goog.require('ol.renderer.canvas.TileLayer');
goog.require('ol.renderer.canvas.VectorLayer'); goog.require('ol.renderer.canvas.VectorLayer');
goog.require('ol.renderer.vector');
goog.require('ol.source.State'); goog.require('ol.source.State');
goog.require('ol.vec.Mat4'); goog.require('ol.vec.Mat4');
@@ -112,8 +113,8 @@ ol.renderer.canvas.Map.prototype.dispatchComposeEvent_ =
-view2DState.center[0], -view2DState.center[1]); -view2DState.center[0], -view2DState.center[1]);
var vectorContext = new ol.render.canvas.Immediate(context, pixelRatio, var vectorContext = new ol.render.canvas.Immediate(context, pixelRatio,
extent, this.transform_, rotation); extent, this.transform_, rotation);
var tolerance = resolution / (2 * pixelRatio); var replayGroup = new ol.render.canvas.ReplayGroup(
var replayGroup = new ol.render.canvas.ReplayGroup(tolerance, extent, ol.renderer.vector.getTolerance(resolution, pixelRatio), extent,
resolution); resolution);
var composeEvent = new ol.render.Event(type, map, vectorContext, var composeEvent = new ol.render.Event(type, map, vectorContext,
replayGroup, frameState, context, null); replayGroup, frameState, context, null);

View File

@@ -206,9 +206,10 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame =
if (!goog.isDef(styleFunction)) { if (!goog.isDef(styleFunction)) {
styleFunction = ol.feature.defaultStyleFunction; styleFunction = ol.feature.defaultStyleFunction;
} }
var tolerance = resolution / (2 * pixelRatio);
var replayGroup = 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); vectorSource.loadFeatures(extent, resolution, projection);
var renderFeature = var renderFeature =
/** /**
@@ -261,14 +262,12 @@ ol.renderer.canvas.VectorLayer.prototype.renderFeature =
if (!goog.isDefAndNotNull(styles)) { if (!goog.isDefAndNotNull(styles)) {
return false; return false;
} }
// simplify to a tolerance of half a device pixel
var squaredTolerance =
resolution * resolution / (4 * pixelRatio * pixelRatio);
var i, ii, loading = false; var i, ii, loading = false;
for (i = 0, ii = styles.length; i < ii; ++i) { for (i = 0, ii = styles.length; i < ii; ++i) {
loading = ol.renderer.vector.renderFeature( loading = ol.renderer.vector.renderFeature(
replayGroup, feature, styles[i], squaredTolerance, feature, replayGroup, feature, styles[i],
this.handleImageChange_, this) || loading; ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio),
feature, this.handleImageChange_, this) || loading;
} }
return loading; return loading;
}; };

View File

@@ -102,8 +102,8 @@ goog.inherits(ol.source.ImageVector, ol.source.ImageCanvas);
ol.source.ImageVector.prototype.canvasFunctionInternal_ = ol.source.ImageVector.prototype.canvasFunctionInternal_ =
function(extent, resolution, pixelRatio, size, projection) { function(extent, resolution, pixelRatio, size, projection) {
var tolerance = resolution / (2 * pixelRatio); var replayGroup = new ol.render.canvas.ReplayGroup(
var replayGroup = new ol.render.canvas.ReplayGroup(tolerance, extent, ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio), extent,
resolution); resolution);
var loading = false; var loading = false;
@@ -226,14 +226,12 @@ ol.source.ImageVector.prototype.renderFeature_ =
if (!goog.isDefAndNotNull(styles)) { if (!goog.isDefAndNotNull(styles)) {
return false; return false;
} }
// simplify to a tolerance of half a device pixel
var squaredTolerance =
resolution * resolution / (4 * pixelRatio * pixelRatio);
var i, ii, loading = false; var i, ii, loading = false;
for (i = 0, ii = styles.length; i < ii; ++i) { for (i = 0, ii = styles.length; i < ii; ++i) {
loading = ol.renderer.vector.renderFeature( loading = ol.renderer.vector.renderFeature(
replayGroup, feature, styles[i], squaredTolerance, feature, replayGroup, feature, styles[i],
this.handleImageChange_, this) || loading; ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio),
feature, this.handleImageChange_, this) || loading;
} }
return loading; return loading;
}; };