Fix hit detection for decluttered layers

This commit is contained in:
Andreas Hocevar
2017-10-22 12:55:23 +02:00
parent f4506d87eb
commit 53a2cf55f1
2 changed files with 30 additions and 28 deletions
+27 -26
View File
@@ -201,11 +201,11 @@ ol.render.canvas.ReplayGroup.replayDeclutter = function(declutterReplays, contex
ol.render.canvas.ReplayGroup.replayDeclutterHitDetection = function( ol.render.canvas.ReplayGroup.replayDeclutterHitDetection = function(
declutterReplays, context, rotation, featureCallback, hitExtent) { declutterReplays, context, rotation, featureCallback, hitExtent) {
var zs = Object.keys(declutterReplays).map(Number).sort(ol.array.numberSafeCompareFunction); var zs = Object.keys(declutterReplays).map(Number).sort(ol.array.numberSafeCompareFunction);
for (var z = zs.length - 1; z >= 0; --z) { for (var z = 0, zz = zs.length; z < zz; ++z) {
var replayData = declutterReplays[zs[z].toString()]; var replayData = declutterReplays[zs[z].toString()];
for (var i = 0, ii = replayData.length; i < ii;) { for (var i = replayData.length - 1; i >= 0;) {
var replay = replayData[i++]; var transform = replayData[i--];
var transform = replayData[i++]; var replay = replayData[i--];
var result = replay.replayHitDetection(context, transform, rotation, {}, var result = replay.replayHitDetection(context, transform, rotation, {},
featureCallback, hitExtent); featureCallback, hitExtent);
if (result) { if (result) {
@@ -327,33 +327,34 @@ ol.render.canvas.ReplayGroup.prototype.forEachFeatureAtCoordinate = function(
var mask = ol.render.canvas.ReplayGroup.getCircleArray_(hitTolerance); var mask = ol.render.canvas.ReplayGroup.getCircleArray_(hitTolerance);
var result = this.replayHitDetection_(context, transform, rotation, /**
skippedFeaturesHash, * @param {ol.Feature|ol.render.Feature} feature Feature.
/** * @return {?} Callback result.
* @param {ol.Feature|ol.render.Feature} feature Feature. */
* @return {?} Callback result. function hitDetectionCallback(feature) {
*/ var imageData = context.getImageData(0, 0, contextSize, contextSize).data;
function(feature) { for (var i = 0; i < contextSize; i++) {
var imageData = context.getImageData(0, 0, contextSize, contextSize).data; for (var j = 0; j < contextSize; j++) {
for (var i = 0; i < contextSize; i++) { if (mask[i][j]) {
for (var j = 0; j < contextSize; j++) { if (imageData[(j * contextSize + i) * 4 + 3] > 0) {
if (mask[i][j]) { var result = callback(feature);
if (imageData[(j * contextSize + i) * 4 + 3] > 0) { if (result) {
var result = callback(feature); return result;
if (result) { } else {
return result; context.clearRect(0, 0, contextSize, contextSize);
} else { return undefined;
context.clearRect(0, 0, contextSize, contextSize);
return undefined;
}
}
} }
} }
} }
}, hitExtent); }
}
}
var result = this.replayHitDetection_(context, transform, rotation,
skippedFeaturesHash, hitDetectionCallback, hitExtent, declutterReplays);
if (!result && declutterReplays) { if (!result && declutterReplays) {
result = ol.render.canvas.ReplayGroup.replayDeclutterHitDetection( result = ol.render.canvas.ReplayGroup.replayDeclutterHitDetection(
declutterReplays, context, rotation, callback, hitExtent); declutterReplays, context, rotation, hitDetectionCallback, hitExtent);
} }
return result; return result;
}; };
+3 -2
View File
@@ -234,9 +234,10 @@ ol.renderer.canvas.VectorLayer.prototype.forEachFeatureAtCoordinate = function(c
} else { } else {
var resolution = frameState.viewState.resolution; var resolution = frameState.viewState.resolution;
var rotation = frameState.viewState.rotation; var rotation = frameState.viewState.rotation;
var layer = this.getLayer(); var layer = /** @type {ol.layer.Vector} */ (this.getLayer());
/** @type {Object.<string, boolean>} */ /** @type {Object.<string, boolean>} */
var features = {}; var features = {};
var declutterReplays = layer.getDeclutter() ? {} : null;
var result = this.replayGroup_.forEachFeatureAtCoordinate(coordinate, resolution, var result = this.replayGroup_.forEachFeatureAtCoordinate(coordinate, resolution,
rotation, hitTolerance, {}, rotation, hitTolerance, {},
/** /**
@@ -249,7 +250,7 @@ ol.renderer.canvas.VectorLayer.prototype.forEachFeatureAtCoordinate = function(c
features[key] = true; features[key] = true;
return callback.call(thisArg, feature, layer); return callback.call(thisArg, feature, layer);
} }
}, null); }, declutterReplays);
if (this.declutterTree_) { if (this.declutterTree_) {
this.declutterTree_.clear(); this.declutterTree_.clear();
} }