Use declutter tree only for text and image replays

This commit is contained in:
Andreas Hocevar
2018-01-01 13:56:02 +01:00
parent 4234c2ce3d
commit 9397c41e6c
2 changed files with 29 additions and 6 deletions

View File

@@ -34,6 +34,11 @@ var _ol_render_canvas_ReplayGroup_ = function(
tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree, opt_renderBuffer) { tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree, opt_renderBuffer) {
_ol_render_ReplayGroup_.call(this); _ol_render_ReplayGroup_.call(this);
/**
* @type {ol.render.ReplayType}
*/
this.currentReplayType_;
/** /**
* Declutter tree. * Declutter tree.
* @private * @private
@@ -325,15 +330,18 @@ _ol_render_canvas_ReplayGroup_.prototype.forEachFeatureAtCoordinate = function(
/** /**
* @param {ol.Feature|ol.render.Feature} feature Feature. * @param {ol.Feature|ol.render.Feature} feature Feature.
* @return {?} Callback result. * @return {?} Callback result.
* @this {ol.render.canvas.ReplayGroup}
*/ */
function hitDetectionCallback(feature) { var hitDetectionCallback = (function(feature) {
var imageData = context.getImageData(0, 0, contextSize, contextSize).data; var imageData = context.getImageData(0, 0, contextSize, contextSize).data;
for (var i = 0; i < contextSize; i++) { for (var i = 0; i < contextSize; i++) {
for (var j = 0; j < contextSize; j++) { for (var j = 0; j < contextSize; j++) {
if (mask[i][j]) { if (mask[i][j]) {
if (imageData[(j * contextSize + i) * 4 + 3] > 0) { if (imageData[(j * contextSize + i) * 4 + 3] > 0) {
var replayType = this.currentReplayType_;
var result; var result;
if (!declutteredFeatures || declutteredFeatures.indexOf(feature) !== -1) { if (!(declutteredFeatures && (replayType == ReplayType.IMAGE || replayType == ReplayType.TEXT)) ||
declutteredFeatures.indexOf(feature) !== -1) {
result = callback(feature); result = callback(feature);
} }
if (result) { if (result) {
@@ -346,7 +354,7 @@ _ol_render_canvas_ReplayGroup_.prototype.forEachFeatureAtCoordinate = function(
} }
} }
} }
} }).bind(this);
return this.replayHitDetection_(context, transform, rotation, return this.replayHitDetection_(context, transform, rotation,
skippedFeaturesHash, hitDetectionCallback, hitExtent, declutterReplays); skippedFeaturesHash, hitDetectionCallback, hitExtent, declutterReplays);
@@ -498,6 +506,7 @@ _ol_render_canvas_ReplayGroup_.prototype.replayHitDetection_ = function(
declutter.push(replay, transform.slice(0)); declutter.push(replay, transform.slice(0));
} }
} else { } else {
this.currentReplayType_ = replayType;
result = replay.replayHitDetection(context, transform, viewRotation, result = replay.replayHitDetection(context, transform, viewRotation,
skippedFeaturesHash, featureCallback, opt_hitExtent); skippedFeaturesHash, featureCallback, opt_hitExtent);
if (result) { if (result) {

View File

@@ -3,7 +3,7 @@ import Map from '../../../src/ol/Map.js';
import MapEvent from '../../../src/ol/MapEvent.js'; import MapEvent from '../../../src/ol/MapEvent.js';
import Overlay from '../../../src/ol/Overlay.js'; import Overlay from '../../../src/ol/Overlay.js';
import _ol_View_ from '../../../src/ol/View.js'; import _ol_View_ from '../../../src/ol/View.js';
import Point from '../../../src/ol/geom/Point.js'; import LineString from '../../../src/ol/geom/LineString.js';
import _ol_has_ from '../../../src/ol/has.js'; import _ol_has_ from '../../../src/ol/has.js';
import {defaults as defaultInteractions} from '../../../src/ol/interaction.js'; import {defaults as defaultInteractions} from '../../../src/ol/interaction.js';
import DoubleClickZoom from '../../../src/ol/interaction/DoubleClickZoom.js'; import DoubleClickZoom from '../../../src/ol/interaction/DoubleClickZoom.js';
@@ -197,12 +197,12 @@ describe('ol.Map', function() {
target: target, target: target,
layers: [new _ol_layer_Vector_({ layers: [new _ol_layer_Vector_({
source: new _ol_source_Vector_({ source: new _ol_source_Vector_({
features: [new _ol_Feature_(new Point([0, 0]))] features: [new _ol_Feature_(new LineString([[-50, 0], [50, 0]]))]
}) })
})], })],
view: new _ol_View_({ view: new _ol_View_({
center: [0, 0], center: [0, 0],
zoom: 2 zoom: 17
}) })
}); });
map.renderSync(); map.renderSync();
@@ -222,6 +222,20 @@ describe('ol.Map', function() {
expect(features[0]).to.be.an(_ol_Feature_); expect(features[0]).to.be.an(_ol_Feature_);
}); });
it('returns an array of found features with declutter: true', function() {
var layer = map.getLayers().item(0);
map.removeLayer(layer);
var otherLayer = new _ol_layer_Vector_({
declutter: true,
source: layer.getSource()
});
map.addLayer(otherLayer);
map.renderSync();
var features = map.getFeaturesAtPixel([50, 50]);
expect(features).to.be.an(Array);
expect(features[0]).to.be.an(_ol_Feature_);
});
it('respects options', function() { it('respects options', function() {
var otherLayer = new _ol_layer_Vector_({ var otherLayer = new _ol_layer_Vector_({
source: new _ol_source_Vector_ source: new _ol_source_Vector_