diff --git a/examples/synthetic-points.js b/examples/synthetic-points.js index ac139f50d5..b1cdfdb882 100644 --- a/examples/synthetic-points.js +++ b/examples/synthetic-points.js @@ -3,6 +3,7 @@ goog.require('ol.Map'); goog.require('ol.Overlay'); goog.require('ol.RendererHint'); goog.require('ol.View2D'); +goog.require('ol.geom.LineString'); goog.require('ol.geom.Point'); goog.require('ol.layer.Vector'); goog.require('ol.shape'); @@ -37,10 +38,11 @@ var styles = { })] }; +var vectorSource = new ol.source.Vector({ + features: features +}); var vector = new ol.layer.Vector({ - source: new ol.source.Vector({ - features: features - }), + source: vectorSource, styleFunction: function(feature, resolution) { return styles[feature.get('size')]; } @@ -61,6 +63,60 @@ var map = new ol.Map({ overlays: [popup] }); +var point = null; +var line = null; +var displaySnap = function(coordinate) { + var closestFeature = vectorSource.getClosestFeatureToCoordinate(coordinate); + if (closestFeature === null) { + point = null; + line = null; + } else { + var geometry = closestFeature.getGeometry(); + var closestPoint = geometry.getClosestPoint(coordinate); + if (point === null) { + point = new ol.geom.Point(closestPoint); + } else { + point.setCoordinates(closestPoint); + } + if (line === null) { + line = new ol.geom.LineString([coordinate, closestPoint]); + } else { + line.setCoordinates([coordinate, closestPoint]); + } + } + map.requestRenderFrame(); +}; + +$(map.getViewport()).on('mousemove', function(evt) { + var coordinate = map.getEventCoordinate(evt.originalEvent); + displaySnap(coordinate); +}); + +map.on('singleclick', function(evt) { + var coordinate = evt.getCoordinate(); + displaySnap(coordinate); +}); + +var imageStyle = ol.shape.renderCircle(10, null, new ol.style.Stroke({ + color: 'rgba(255,255,0,0.9)', + width: 3 +})); +var strokeStyle = new ol.style.Stroke({ + color: 'rgba(255,255,0,0.9)', + width: 3 +}); +map.on('postcompose', function(evt) { + var render = evt.getRender(); + if (point !== null) { + render.setImageStyle(imageStyle); + render.drawPointGeometry(point); + } + if (line !== null) { + render.setFillStrokeStyle(null, strokeStyle); + render.drawLineStringGeometry(line); + } +}); + $(map.getViewport()).on('mousemove', function(e) { var pixel = map.getEventPixel(e.originalEvent);