Merge pull request #6305 from KlausBenndorf/hitToleranceExample

Moved hit Tolerance parameter to own example.
This commit is contained in:
Tim Schaub
2017-01-02 20:38:11 -08:00
committed by GitHub
4 changed files with 109 additions and 41 deletions

View File

@@ -0,0 +1,25 @@
---
layout: example.html
title: Hit Tolerance
shortdesc: Example using the hitTolerance parameter.
docs: >
By default, the map.forEachFeatureAtPixel() function only considers features that are directly under the provided
pixel. This can make it difficult to interact with features on touch devices. To consider features within some
distance of the provided pixel, use the hitTolerance option. For example,
map.forEachFeatureAtPixel(pixel, callback, {hitTolerance: 3}) will call the callback with all features that are
within three pixels of the provided pixel.
tags: "hitTolerance"
---
<div id="map" class="map"></div>
<form class="form-inline">
<span id="status">&nbsp;No feature got hit.</span>
<br />
<label>Hit tolerance for selecting features </label>
<select id="hitTolerance" class="form-control">
<option value="0" selected>0 Pixels</option>
<option value="5">5 Pixels</option>
<option value="10">10 Pixels</option>
</select>
<br />
Area: &nbsp;<canvas id="circle" style="vertical-align: middle"/>
</form>

80
examples/hit-tolerance.js Normal file
View File

@@ -0,0 +1,80 @@
goog.require('ol.Map');
goog.require('ol.View');
goog.require('ol.layer.Tile');
goog.require('ol.layer.Vector');
goog.require('ol.source.OSM');
goog.require('ol.source.Vector');
goog.require('ol.Feature');
goog.require('ol.geom.LineString');
goog.require('ol.style.Style');
goog.require('ol.style.Stroke');
var raster = new ol.layer.Tile({
source: new ol.source.OSM()
});
var style = new ol.style.Style({
stroke: new ol.style.Stroke({
color: 'black',
width: 1
})
});
var feature = new ol.Feature(new ol.geom.LineString([[-4000000, 0], [4000000, 0]]));
var vector = new ol.layer.Vector({
source: new ol.source.Vector({
features: [feature]
}),
style: style
});
var map = new ol.Map({
layers: [raster, vector],
target: 'map',
view: new ol.View({
center: [0, 0],
zoom: 2
})
});
var hitTolerance;
var statusElement = document.getElementById('status');
map.on('singleclick', function(e) {
var hit = false;
map.forEachFeatureAtPixel(e.pixel, function() {
hit = true;
}, {
hitTolerance: hitTolerance
});
if (hit) {
style.getStroke().setColor('green');
statusElement.innerHTML = '&nbsp;A feature got hit!';
} else {
style.getStroke().setColor('black');
statusElement.innerHTML = '&nbsp;No feature got hit.';
}
feature.changed();
});
var selectHitToleranceElement = document.getElementById('hitTolerance');
var circleCanvas = document.getElementById('circle');
var changeHitTolerance = function() {
hitTolerance = parseInt(selectHitToleranceElement.value, 10);
var size = 2 * hitTolerance + 2;
circleCanvas.width = size;
circleCanvas.height = size;
var ctx = circleCanvas.getContext('2d');
ctx.clearRect(0, 0, size, size);
ctx.beginPath();
ctx.arc(hitTolerance + 1, hitTolerance + 1, hitTolerance + 0.5, 0, 2 * Math.PI);
ctx.fill();
ctx.stroke();
};
selectHitToleranceElement.onchange = changeHitTolerance;
changeHitTolerance();

View File

@@ -19,12 +19,4 @@ tags: "select, vector"
<option value="none">None</option>
</select>
<span id="status">&nbsp;0 selected features</span>
<br />
<label>Hit tolerance for selecting features </label>
<select id="hitTolerance" class="form-control">
<option value="0" selected>0 Pixels</option>
<option value="5">5 Pixels</option>
<option value="10">10 Pixels</option>
</select>
<canvas id="circle" style="vertical-align: middle"/>
</form>

View File

@@ -31,28 +31,23 @@ var map = new ol.Map({
var select = null; // ref to currently selected interaction
// select interaction working on "singleclick"
var selectSingleClick = new ol.interaction.Select({
multi: true // multi is used in this example if hitTolerance > 0
});
var selectSingleClick = new ol.interaction.Select();
// select interaction working on "click"
var selectClick = new ol.interaction.Select({
condition: ol.events.condition.click,
multi: true
condition: ol.events.condition.click
});
// select interaction working on "pointermove"
var selectPointerMove = new ol.interaction.Select({
condition: ol.events.condition.pointerMove,
multi: true
condition: ol.events.condition.pointerMove
});
var selectAltClick = new ol.interaction.Select({
condition: function(mapBrowserEvent) {
return ol.events.condition.click(mapBrowserEvent) &&
ol.events.condition.altKeyOnly(mapBrowserEvent);
},
multi: true
}
});
var selectElement = document.getElementById('type');
@@ -90,27 +85,3 @@ var changeInteraction = function() {
*/
selectElement.onchange = changeInteraction;
changeInteraction();
var selectHitToleranceElement = document.getElementById('hitTolerance');
var circleCanvas = document.getElementById('circle');
var changeHitTolerance = function() {
var value = parseInt(selectHitToleranceElement.value, 10);
selectSingleClick.setHitTolerance(value);
selectClick.setHitTolerance(value);
selectPointerMove.setHitTolerance(value);
selectAltClick.setHitTolerance(value);
var size = 2 * value + 2;
circleCanvas.width = size;
circleCanvas.height = size;
var ctx = circleCanvas.getContext('2d');
ctx.clearRect(0, 0, size, size);
ctx.beginPath();
ctx.arc(value + 1, value + 1, value + 0.5, 0, 2 * Math.PI);
ctx.fill();
ctx.stroke();
};
selectHitToleranceElement.onchange = changeHitTolerance;
changeHitTolerance();