import Map from '../src/ol/Map.js'; import View from '../src/ol/View.js'; import {Draw, Modify, Snap} from '../src/ol/interaction.js'; import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; import {OSM, Vector as VectorSource} from '../src/ol/source.js'; import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js'; import Collection from '../src/ol/Collection.js'; import {shiftKeyOnly} from '../src/ol/events/condition.js'; const raster = new TileLayer({ source: new OSM() }); const vector = new VectorLayer({ source: new VectorSource(), style: new Style({ fill: new Fill({ color: 'rgba(255, 255, 255, 0.2)' }), stroke: new Stroke({ color: '#ffcc33', width: 2 }), image: new CircleStyle({ radius: 7, fill: new Fill({ color: '#ffcc33' }) }) }) }); const map = new Map({ layers: [raster, vector], target: 'map', view: new View({ center: [-11000000, 4600000], zoom: 4 }) }); const highlightStyle = new Style({ fill: new Fill({ color: 'rgba(255,255,255,0.7)' }), stroke: new Stroke({ color: 'rgb(51,153,204)', width: 3 }) }); const ExampleModify = { init: function() { this.features = new Collection(); this.features.on('add', function(e) { e.element.setStyle(highlightStyle); }); this.features.on('remove', function(e) { e.element.setStyle(undefined); }); this.select = function(e) { if (!shiftKeyOnly(e)) { this.features.clear(); } map.forEachFeatureAtPixel(e.pixel, function(f) { this.features.push(f); }.bind(this)); }.bind(this); this.modify = new Modify({ features: this.features }); map.addInteraction(this.modify); this.setEvents(); }, setEvents: function() { }, setActive: function(active) { if (active) { this.features.clear(); map.on('singleclick', this.select); } else { map.un('singleclick', this.select); } this.modify.setActive(active); } }; ExampleModify.init(); const optionsForm = document.getElementById('options-form'); const ExampleDraw = { init: function() { map.addInteraction(this.Point); this.Point.setActive(false); map.addInteraction(this.LineString); this.LineString.setActive(false); map.addInteraction(this.Polygon); this.Polygon.setActive(false); map.addInteraction(this.Circle); this.Circle.setActive(false); }, Point: new Draw({ source: vector.getSource(), type: 'Point' }), LineString: new Draw({ source: vector.getSource(), type: 'LineString' }), Polygon: new Draw({ source: vector.getSource(), type: 'Polygon' }), Circle: new Draw({ source: vector.getSource(), type: 'Circle' }), getActive: function() { return this.activeType ? this[this.activeType].getActive() : false; }, setActive: function(active) { const type = optionsForm.elements['draw-type'].value; if (active) { this.activeType && this[this.activeType].setActive(false); this[type].setActive(true); this.activeType = type; } else { this.activeType && this[this.activeType].setActive(false); this.activeType = null; } } }; ExampleDraw.init(); /** * Let user change the geometry type. * @param {Event} e Change event. */ optionsForm.onchange = function(e) { const type = e.target.getAttribute('name'); const value = e.target.value; if (type == 'draw-type') { ExampleDraw.getActive() && ExampleDraw.setActive(true); } else if (type == 'interaction') { if (value == 'modify') { ExampleDraw.setActive(false); ExampleModify.setActive(true); } else if (value == 'draw') { ExampleDraw.setActive(true); ExampleModify.setActive(false); } } }; ExampleDraw.setActive(true); ExampleModify.setActive(false); // The snap interaction must be added after the Modify and Draw interactions // in order for its map browser event handlers to be fired first. Its handlers // are responsible of doing the snapping. const snap = new Snap({ source: vector.getSource() }); map.addInteraction(snap);