Skip to content

Commit 8a2f8dc

Browse files
committed
Fixed bug of forEachFeatureAtPixel for TileLayer
1 parent f5eaebb commit 8a2f8dc

1 file changed

Lines changed: 21 additions & 42 deletions

File tree

src/renderer/canvas/IntermediateCanvas.js

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import {scale as scaleCoordinate} from 'ol/coordinate.js';
55
import {createCanvasContext2D} from 'ol/dom.js';
66
import {containsExtent, intersects} from 'ol/extent.js';
7-
import {VOID} from 'ol/functions.js';
7+
import CanvasLayerRenderer from './Layer.js';
88
import {create as createTransform, apply as applyTransform} from 'ol/transform.js';
9-
import CanvasLayerRenderer from './Layer';
10-
119

10+
/**
11+
* @abstract
12+
*/
1213
class IntermediateCanvasRenderer extends CanvasLayerRenderer {
1314

1415
/**
@@ -82,32 +83,16 @@ class IntermediateCanvasRenderer extends CanvasLayerRenderer {
8283
* @abstract
8384
* @return {HTMLCanvasElement|HTMLVideoElement|HTMLImageElement} Canvas.
8485
*/
85-
getImage() {}
86+
getImage() {
87+
return abstract();
88+
}
8689

8790
/**
8891
* @abstract
8992
* @return {!import("../../transform.js").Transform} Image transform.
9093
*/
91-
getImageTransform() {}
92-
93-
/**
94-
* @inheritDoc
95-
*/
96-
forEachFeatureAtCoordinate(coordinate, frameState, hitTolerance, callback, thisArg) {
97-
const layer = this.getLayer();
98-
const source = layer.getSource();
99-
const resolution = frameState.viewState.resolution;
100-
const rotation = frameState.viewState.rotation;
101-
const skippedFeatureUids = frameState.skippedFeatureUids;
102-
return source.forEachFeatureAtCoordinate(
103-
coordinate, resolution, rotation, hitTolerance, skippedFeatureUids,
104-
/**
105-
* @param {import("../../Feature.js").FeatureLike} feature Feature.
106-
* @return {?} Callback result.
107-
*/
108-
function(feature) {
109-
return callback.call(thisArg, feature, layer);
110-
});
94+
getImageTransform() {
95+
return abstract();
11196
}
11297

11398
/**
@@ -118,27 +103,21 @@ class IntermediateCanvasRenderer extends CanvasLayerRenderer {
118103
return undefined;
119104
}
120105

121-
if (this.getLayer().getSource().forEachFeatureAtCoordinate !== VOID) {
122-
// for ImageCanvas sources use the original hit-detection logic,
123-
// so that for example also transparent polygons are detected
124-
return super.forEachLayerAtCoordinate(arguments);
125-
} else {
126-
const pixel = applyTransform(this.coordinateToCanvasPixelTransform, coordinate.slice());
127-
scaleCoordinate(pixel, frameState.viewState.resolution / this.renderedResolution);
106+
const pixel = applyTransform(this.coordinateToCanvasPixelTransform, coordinate.slice());
107+
scaleCoordinate(pixel, frameState.viewState.resolution / this.renderedResolution);
128108

129-
if (!this.hitCanvasContext_) {
130-
this.hitCanvasContext_ = createCanvasContext2D(1, 1);
131-
}
109+
if (!this.hitCanvasContext_) {
110+
this.hitCanvasContext_ = createCanvasContext2D(1, 1);
111+
}
132112

133-
this.hitCanvasContext_.clearRect(0, 0, 1, 1);
134-
this.hitCanvasContext_.drawImage(this.getImage(), pixel[0], pixel[1], 1, 1, 0, 0, 1, 1);
113+
this.hitCanvasContext_.clearRect(0, 0, 1, 1);
114+
this.hitCanvasContext_.drawImage(this.getImage(), pixel[0], pixel[1], 1, 1, 0, 0, 1, 1);
135115

136-
const imageData = this.hitCanvasContext_.getImageData(0, 0, 1, 1).data;
137-
if (imageData[3] > 0) {
138-
return callback.call(thisArg, this.getLayer(), imageData);
139-
} else {
140-
return undefined;
141-
}
116+
const imageData = this.hitCanvasContext_.getImageData(0, 0, 1, 1).data;
117+
if (imageData[3] > 0) {
118+
return callback.call(thisArg, this.getLayer(), imageData);
119+
} else {
120+
return undefined;
142121
}
143122
}
144123
}

0 commit comments

Comments
 (0)