原文链接及内容

将捕捉交互组件与绘制和修改交互组件一起使用的示例。捕捉(Snap)交互组件必须最后添加,因为它需要是第一个处理pointermove事件的交互组件。

main.js代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import Map from 'ol/Map.js';
import View from 'ol/View.js';
import {Draw, Modify, Select, Snap} from 'ol/interaction.js';
import {OSM, Vector as VectorSource} from 'ol/source.js';
import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer.js';

const raster = new TileLayer({
source: new OSM(),
});

const vector = new VectorLayer({
source: new VectorSource(),
style: {
'fill-color': 'rgba(255, 255, 255, 0.2)',
'stroke-color': '#ffcc33',
'stroke-width': 2,
'circle-radius': 7,
'circle-fill-color': '#ffcc33',
},
});

const map = new Map({
layers: [raster, vector],
target: 'map',
view: new View({
center: [-11000000, 4600000],
zoom: 4,
}),
});

const ExampleModify = {
init: function () {
this.select = new Select();
map.addInteraction(this.select);

this.modify = new Modify({
features: this.select.getFeatures(),
});
map.addInteraction(this.modify);

this.setEvents();
},
setEvents: function () {
const selectedFeatures = this.select.getFeatures();

this.select.on('change:active', function () {
selectedFeatures.forEach(function (each) {
selectedFeatures.remove(each);
});
});
},
setActive: function (active) {
this.select.setActive(active);
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',
}),
activeDraw: null,
setActive: function (active) {
if (this.activeDraw) {
this.activeDraw.setActive(false);
this.activeDraw = null;
}
if (active) {
const type = optionsForm.elements['draw-type'].value;
this.activeDraw = this[type];
this.activeDraw.setActive(true);
}
},
};
ExampleDraw.init();

/**
* Let user change the geometry type.
* @param {Event} e Change event.
*/
optionsForm.onchange = function (e) {
const type = e.target.getAttribute('name');
if (type == 'draw-type') {
ExampleModify.setActive(false);
ExampleDraw.setActive(true);
optionsForm.elements['interaction'].value = 'draw';
} else if (type == 'interaction') {
const interactionType = e.target.value;
if (interactionType == 'modify') {
ExampleDraw.setActive(false);
ExampleModify.setActive(true);
} else if (interactionType == '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);

界面布局文件index.html代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Snap Interaction</title>
<link rel="stylesheet" href="node_modules/ol/ol.css">
<style>
.map {
width: 100%;
height: 400px;
}
</style>
</head>
<body>
<div id="map" class="map"></div>
<form id="options-form" autocomplete="off">
<div class="radio">
<label>
<input type="radio" name="interaction" value="draw" id="draw" checked>
Draw &nbsp;
</label>
<select name="draw-type" id="draw-type">
<option value="Point">Point</option>
<option value="LineString">LineString</option>
<option value="Polygon">Polygon</option>
<option value="Circle">Circle</option>
</select>
</div>
<div class="radio">
<label>
<input type="radio" name="interaction" value="modify">
Modify &nbsp;
</label>
</div>
</form>
<!-- Pointer events polyfill for old browsers, see https://caniuse.com/#feat=pointer -->
<script src="https://cdn.jsdelivr.net/npm/elm-pep@1.0.6/dist/elm-pep.js"></script>
<script type="module" src="main.js"></script>
</body>
</html>