Hit detection for features drawn at pre/postcompose
This commit is contained in:
@@ -123,6 +123,7 @@ ol.renderer.canvas.Map.prototype.dispatchComposeEvent_ =
|
|||||||
replayGroup.replay(context, extent, pixelRatio, this.transform_,
|
replayGroup.replay(context, extent, pixelRatio, this.transform_,
|
||||||
rotation, {});
|
rotation, {});
|
||||||
}
|
}
|
||||||
|
this.replayGroup = replayGroup;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,12 @@ ol.renderer.Map = function(container, map) {
|
|||||||
*/
|
*/
|
||||||
this.map_ = map;
|
this.map_ = map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @protected
|
||||||
|
* @type {ol.render.IReplayGroup}
|
||||||
|
*/
|
||||||
|
this.replayGroup = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @type {Object.<string, ol.renderer.Layer>}
|
* @type {Object.<string, ol.renderer.Layer>}
|
||||||
@@ -110,9 +116,36 @@ ol.renderer.Map.prototype.disposeInternal = function() {
|
|||||||
ol.renderer.Map.prototype.forEachFeatureAtPixel =
|
ol.renderer.Map.prototype.forEachFeatureAtPixel =
|
||||||
function(coordinate, frameState, callback, thisArg,
|
function(coordinate, frameState, callback, thisArg,
|
||||||
layerFilter, thisArg2) {
|
layerFilter, thisArg2) {
|
||||||
|
var result;
|
||||||
|
var extent = frameState.extent;
|
||||||
|
var view2DState = frameState.view2DState;
|
||||||
|
var viewResolution = view2DState.resolution;
|
||||||
|
var viewRotation = view2DState.rotation;
|
||||||
|
if (!goog.isNull(this.replayGroup)) {
|
||||||
|
/** @type {Object.<string, boolean>} */
|
||||||
|
var features = {};
|
||||||
|
result = this.replayGroup.forEachGeometryAtPixel(extent, viewResolution,
|
||||||
|
viewRotation, coordinate, {},
|
||||||
|
/**
|
||||||
|
* @param {ol.geom.Geometry} geometry Geometry.
|
||||||
|
* @param {Object} data Data.
|
||||||
|
* @return {?} Callback result.
|
||||||
|
*/
|
||||||
|
function(geometry, data) {
|
||||||
|
var feature = /** @type {ol.Feature} */ (data);
|
||||||
|
goog.asserts.assert(goog.isDef(feature));
|
||||||
|
var key = goog.getUid(feature).toString();
|
||||||
|
if (!(key in features)) {
|
||||||
|
features[key] = true;
|
||||||
|
return callback.call(thisArg, feature, null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
var layerStates = this.map_.getLayerGroup().getLayerStatesArray();
|
var layerStates = this.map_.getLayerGroup().getLayerStatesArray();
|
||||||
var numLayers = layerStates.length;
|
var numLayers = layerStates.length;
|
||||||
var viewResolution = frameState.view2DState.resolution;
|
|
||||||
var i;
|
var i;
|
||||||
for (i = numLayers - 1; i >= 0; --i) {
|
for (i = numLayers - 1; i >= 0; --i) {
|
||||||
var layerState = layerStates[i];
|
var layerState = layerStates[i];
|
||||||
@@ -120,7 +153,7 @@ ol.renderer.Map.prototype.forEachFeatureAtPixel =
|
|||||||
if (ol.layer.Layer.visibleAtResolution(layerState, viewResolution) &&
|
if (ol.layer.Layer.visibleAtResolution(layerState, viewResolution) &&
|
||||||
layerFilter.call(thisArg2, layer)) {
|
layerFilter.call(thisArg2, layer)) {
|
||||||
var layerRenderer = this.getLayerRenderer(layer);
|
var layerRenderer = this.getLayerRenderer(layer);
|
||||||
var result = layerRenderer.forEachFeatureAtPixel(
|
result = layerRenderer.forEachFeatureAtPixel(
|
||||||
coordinate, frameState, callback, thisArg);
|
coordinate, frameState, callback, thisArg);
|
||||||
if (result) {
|
if (result) {
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
Reference in New Issue
Block a user