Fix hit detection for decluttered layers
This commit is contained in:
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user