@hzab/map-combine 0.2.8 → 0.3.0-beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,299 +1,299 @@
1
-
2
- import { OpenlayerMap } from "./OpenlayerMap";
3
- import Feature from 'ol/Feature.js'
4
- import OlPolygon from 'ol/geom/Polygon.js'
5
- import { Icon, Fill, Stroke, Style } from 'ol/style.js'
6
- import { fromLonLat, toLonLat } from "ol/proj";
7
- import { Polygon } from "../basic/Polygon";
8
- import VectorSource from "ol/source/Vector";
9
- import VectorLayer from "ol/layer/Vector";
10
- import iconPoint from '../assets/point.png'
11
- import iconAdd from '../assets/add.png'
12
- import Point from 'ol/geom/Point.js'
13
- import { ChainNode, PolygonEditor } from "../utils/PolygonEditor";
14
- const styleNode = new Style({
15
- image: new Icon({
16
- width: 16,
17
- height: 16,
18
- src: iconPoint,
19
- crossOrigin: 'anonymous'
20
- })
21
- });
22
-
23
- const styleVirtual = new Style({
24
- image: new Icon({
25
- width: 16,
26
- height: 16,
27
- src: iconAdd,
28
- crossOrigin: 'anonymous'
29
- })
30
- });
31
-
32
-
33
-
34
-
35
-
36
- export function drawPolygon(map: OpenlayerMap, polygon: Polygon<unknown>) {
37
- const { event, viewer, vectors, getFromLonLat, isFromLonLat } = map
38
-
39
- const source = new VectorSource();
40
-
41
- const layer = new VectorLayer({
42
- source,
43
- visible: polygon.show
44
- })
45
- viewer.addLayer(layer)
46
-
47
- let status = 0
48
- let skip = 0
49
-
50
- const feature = new Feature()
51
- const geometry = new OlPolygon([[[0, 0], [0, 0]]])
52
- const fill = new Fill({
53
- color: polygon.fill
54
- })
55
- const stroke = new Stroke({
56
- color: polygon.stroke,
57
- width: polygon.lineWidth,
58
- lineDash: polygon.dash ? [10, 10] : undefined,
59
- })
60
- const style = new Style({
61
- zIndex: 50,
62
- stroke,
63
- fill
64
- })
65
-
66
- const _event = {
67
- cursor: polygon.cursor,
68
- silent: polygon.silent,
69
- onPointerIn() {
70
- status == 2 && polygon.event.trigger('pointer-in')
71
- },
72
- onPointerOut() {
73
- status == 2 && polygon.event.trigger('pointer-out')
74
- },
75
- onLClick() {
76
- status == 2 && polygon.event.trigger('left-click')
77
- },
78
- onRClick() {
79
- if (polygon.menu) {
80
- map.menu.show(polygon.menu);
81
- }
82
- status == 2 && polygon.event.trigger('right-click')
83
- },
84
- onDbClick() {
85
- polygon.editable && status == 2 && setTimeout(() => {
86
- polygon.event.trigger('start-edit')
87
- });
88
- }
89
- }
90
-
91
- feature.setGeometry(geometry)
92
- feature.setStyle(style)
93
- feature.set('event', _event, true)
94
- if (polygon.coordinates) {
95
- status = 2
96
- geometry.setCoordinates([polygon.coordinates.map(e => getFromLonLat(e, isFromLonLat))])
97
- layer.setZIndex(polygon.coordinates[0][2] ?? 1)
98
- source.addFeature(feature)
99
- }
100
-
101
-
102
-
103
-
104
- const onUpdate = (e: Set<string>) => {
105
- if (skip) {
106
- skip--
107
- return
108
- }
109
-
110
- e.forEach(key => {
111
- switch (key) {
112
- case 'show':
113
- layer.setVisible(polygon.show)
114
- break;
115
- case 'editable':
116
- break;
117
- case 'coordinates':
118
- if (polygon.coordinates) {
119
- geometry.setCoordinates([polygon.coordinates.map(e => getFromLonLat(e, isFromLonLat))])
120
- layer.setZIndex(polygon.coordinates[0][2] ?? 1)
121
- switch (status) {
122
- case 0:
123
- source.addFeature(feature)
124
- status = 2;
125
- break;
126
- case 1:
127
- status = 2;
128
- break;
129
- }
130
- } else {
131
- source.removeFeature(feature)
132
- status == 3 && editor.setCoordinates([])
133
- status = 0
134
- }
135
- break;
136
- case 'lineWidth':
137
- stroke.setWidth(polygon.lineWidth)
138
- break;
139
- case 'stroke':
140
- stroke.setColor(polygon.stroke)
141
- break;
142
- case 'dash':
143
- stroke.setLineDash(polygon.dash ? [10, 10] : undefined)
144
- break;
145
- case 'fill':
146
- fill.setColor(polygon.fill)
147
- break;
148
- default:
149
- throw new Error(`${key} 还不支持修改`)
150
- }
151
- })
152
-
153
- feature.changed()
154
- }
155
- let cache = [[0]]
156
- let activeNode: ChainNode<Feature, Feature>
157
- const onMouseMove = () => {
158
- switch (status) {
159
- case 1:
160
- cache.pop()
161
- cache.push(getFromLonLat(event.geography))
162
- geometry.setCoordinates([cache])
163
- break
164
- case 4:
165
- activeNode.update(getFromLonLat(event.geography))
166
- geometry.setCoordinates([editor.getCoordinates()])
167
- break;
168
- }
169
- }
170
-
171
- const onClick = () => {
172
- switch (status) {
173
- case 0:
174
- status = 1
175
- cache = [getFromLonLat(event.geography)]
176
- cache.push(cache[0])
177
- geometry.setCoordinates([cache])
178
- source.addFeature(feature)
179
- break;
180
- case 1:
181
- cache.push(cache[cache.length - 1])
182
- geometry.setCoordinates([cache])
183
- break
184
- }
185
- }
186
-
187
- const onDbClick = () => {
188
- switch (status) {
189
- case 1:
190
- status = 2
191
- skip++
192
- cache.pop()
193
- cache.pop()
194
- geometry.setCoordinates([cache])
195
- polygon.coordinates = cache.map(e => toLonLat(e))
196
- polygon.event.trigger('data-loaded')
197
- polygon.event.trigger('pointer-in')
198
- break
199
- case 3:
200
- polygon.event.trigger('stop-edit')
201
- break
202
- }
203
- }
204
-
205
- const editor = new PolygonEditor<Feature<Point>, Feature<Point>>()
206
-
207
- editor.on('create-node', (n) => {
208
- if (n.type == 'node') {
209
- const feature = new Feature(new Point(n.position))
210
- feature.setStyle(styleNode)
211
- feature.set('event', {
212
- cursor: 'move',
213
- onPointerDown() {
214
- status = 4
215
- activeNode = n
216
- map.moveable = false
217
- },
218
- onPointerUp() {
219
- if (status == 4) {
220
- status = 3
221
- map.moveable = true
222
- activeNode = undefined
223
- }
224
- },
225
- onDbClick() {
226
- n.destroy()
227
- geometry.setCoordinates([editor.getCoordinates()])
228
- }
229
- }, true)
230
- source.addFeature(feature)
231
- n.shape = feature
232
- } else {
233
- const feature = new Feature(new Point(n.position))
234
- feature.setStyle(styleVirtual)
235
- feature.set('event', {
236
- cursor: 'pointer',
237
- onPointerDown() {
238
- status = 4
239
- activeNode = n.insert()
240
- map.cursor = 'move'
241
- map.moveable = false
242
- },
243
- }, true)
244
- source.addFeature(feature)
245
- n.shape = feature
246
- }
247
- })
248
- editor.on('update-node', (n) => {
249
- n.shape.getGeometry().setCoordinates(n.position)
250
- })
251
- editor.on('remove-node', (n) => {
252
- source.removeFeature(n.shape)
253
- })
254
- editor.on('empty', () => {
255
- source.removeFeature(feature)
256
- status = 0
257
- })
258
- const onStartEdit = () => {
259
- switch (status) {
260
- case 2:
261
- status = 3
262
- editor.setCoordinates(geometry.getCoordinates()[0])
263
- break
264
- }
265
-
266
- }
267
-
268
- const onStopEdit = () => {
269
- if (status == 3) {
270
- status = 2
271
- skip++
272
- polygon.coordinates = editor.getCoordinates().map(e => toLonLat(e))
273
- editor.setCoordinates([])
274
- polygon.event.trigger('pointer-in')
275
- }
276
-
277
- }
278
-
279
-
280
- const onDestroy = () => {
281
- viewer.removeLayer(layer)
282
- event.off('pointer-move', onMouseMove)
283
- event.off('left-click', onClick)
284
- event.off('double-click', onDbClick)
285
- polygon.event.off('update', onUpdate)
286
- polygon.event.off('start-edit', onStartEdit)
287
- polygon.event.off('stop-edit', onStopEdit)
288
- polygon.event.off('destroy', onDestroy)
289
-
290
- }
291
-
292
- event.on('pointer-move', onMouseMove)
293
- event.on('left-click', onClick)
294
- event.on('double-click', onDbClick)
295
- polygon.event.on('update', onUpdate)
296
- polygon.event.on('start-edit', onStartEdit)
297
- polygon.event.on('stop-edit', onStopEdit)
298
- polygon.event.on('destroy', onDestroy)
1
+
2
+ import { OpenlayerMap } from "./OpenlayerMap";
3
+ import Feature from 'ol/Feature.js'
4
+ import OlPolygon from 'ol/geom/Polygon.js'
5
+ import { Icon, Fill, Stroke, Style } from 'ol/style.js'
6
+ import { fromLonLat, toLonLat } from "ol/proj";
7
+ import { Polygon } from "../basic/Polygon";
8
+ import VectorSource from "ol/source/Vector";
9
+ import VectorLayer from "ol/layer/Vector";
10
+ import iconPoint from '../assets/point.png'
11
+ import iconAdd from '../assets/add.png'
12
+ import Point from 'ol/geom/Point.js'
13
+ import { ChainNode, PolygonEditor } from "../utils/PolygonEditor";
14
+ const styleNode = new Style({
15
+ image: new Icon({
16
+ width: 16,
17
+ height: 16,
18
+ src: iconPoint,
19
+ crossOrigin: 'anonymous'
20
+ })
21
+ });
22
+
23
+ const styleVirtual = new Style({
24
+ image: new Icon({
25
+ width: 16,
26
+ height: 16,
27
+ src: iconAdd,
28
+ crossOrigin: 'anonymous'
29
+ })
30
+ });
31
+
32
+
33
+
34
+
35
+
36
+ export function drawPolygon(map: OpenlayerMap, polygon: Polygon<unknown>) {
37
+ const { event, viewer, vectors, getFromLonLat, isFromLonLat } = map
38
+
39
+ const source = new VectorSource();
40
+
41
+ const layer = new VectorLayer({
42
+ source,
43
+ visible: polygon.show
44
+ })
45
+ viewer.addLayer(layer)
46
+
47
+ let status = 0
48
+ let skip = 0
49
+
50
+ const feature = new Feature()
51
+ const geometry = new OlPolygon([[[0, 0], [0, 0]]])
52
+ const fill = new Fill({
53
+ color: polygon.fill
54
+ })
55
+ const stroke = new Stroke({
56
+ color: polygon.stroke,
57
+ width: polygon.lineWidth,
58
+ lineDash: polygon.dash ? [10, 10] : undefined,
59
+ })
60
+ const style = new Style({
61
+ zIndex: 50,
62
+ stroke,
63
+ fill
64
+ })
65
+
66
+ const _event = {
67
+ cursor: polygon.cursor,
68
+ silent: polygon.silent,
69
+ onPointerIn() {
70
+ status == 2 && polygon.event.trigger('pointer-in')
71
+ },
72
+ onPointerOut() {
73
+ status == 2 && polygon.event.trigger('pointer-out')
74
+ },
75
+ onLClick() {
76
+ status == 2 && polygon.event.trigger('left-click')
77
+ },
78
+ onRClick() {
79
+ if (polygon.menu) {
80
+ map.menu.show(polygon.menu);
81
+ }
82
+ status == 2 && polygon.event.trigger('right-click')
83
+ },
84
+ onDbClick() {
85
+ polygon.editable && status == 2 && setTimeout(() => {
86
+ polygon.event.trigger('start-edit')
87
+ });
88
+ }
89
+ }
90
+
91
+ feature.setGeometry(geometry)
92
+ feature.setStyle(style)
93
+ feature.set('event', _event, true)
94
+ if (polygon.coordinates) {
95
+ status = 2
96
+ geometry.setCoordinates([polygon.coordinates.map(e => getFromLonLat(e, isFromLonLat))])
97
+ layer.setZIndex(polygon.coordinates[0][2] ?? 1)
98
+ source.addFeature(feature)
99
+ }
100
+
101
+
102
+
103
+
104
+ const onUpdate = (e: Set<string>) => {
105
+ if (skip) {
106
+ skip--
107
+ return
108
+ }
109
+
110
+ e.forEach(key => {
111
+ switch (key) {
112
+ case 'show':
113
+ layer.setVisible(polygon.show)
114
+ break;
115
+ case 'editable':
116
+ break;
117
+ case 'coordinates':
118
+ if (polygon.coordinates) {
119
+ geometry.setCoordinates([polygon.coordinates.map(e => getFromLonLat(e, isFromLonLat))])
120
+ layer.setZIndex(polygon.coordinates[0][2] ?? 1)
121
+ switch (status) {
122
+ case 0:
123
+ source.addFeature(feature)
124
+ status = 2;
125
+ break;
126
+ case 1:
127
+ status = 2;
128
+ break;
129
+ }
130
+ } else {
131
+ source.removeFeature(feature)
132
+ status == 3 && editor.setCoordinates([])
133
+ status = 0
134
+ }
135
+ break;
136
+ case 'lineWidth':
137
+ stroke.setWidth(polygon.lineWidth)
138
+ break;
139
+ case 'stroke':
140
+ stroke.setColor(polygon.stroke)
141
+ break;
142
+ case 'dash':
143
+ stroke.setLineDash(polygon.dash ? [10, 10] : undefined)
144
+ break;
145
+ case 'fill':
146
+ fill.setColor(polygon.fill)
147
+ break;
148
+ default:
149
+ throw new Error(`${key} 还不支持修改`)
150
+ }
151
+ })
152
+
153
+ feature.changed()
154
+ }
155
+ let cache = [[0]]
156
+ let activeNode: ChainNode<Feature, Feature>
157
+ const onMouseMove = () => {
158
+ switch (status) {
159
+ case 1:
160
+ cache.pop()
161
+ cache.push(getFromLonLat(event.geography))
162
+ geometry.setCoordinates([cache])
163
+ break
164
+ case 4:
165
+ activeNode.update(getFromLonLat(event.geography))
166
+ geometry.setCoordinates([editor.getCoordinates()])
167
+ break;
168
+ }
169
+ }
170
+
171
+ const onClick = () => {
172
+ switch (status) {
173
+ case 0:
174
+ status = 1
175
+ cache = [getFromLonLat(event.geography)]
176
+ cache.push(cache[0])
177
+ geometry.setCoordinates([cache])
178
+ source.addFeature(feature)
179
+ break;
180
+ case 1:
181
+ cache.push(cache[cache.length - 1])
182
+ geometry.setCoordinates([cache])
183
+ break
184
+ }
185
+ }
186
+
187
+ const onDbClick = () => {
188
+ switch (status) {
189
+ case 1:
190
+ status = 2
191
+ skip++
192
+ cache.pop()
193
+ cache.pop()
194
+ geometry.setCoordinates([cache])
195
+ polygon.coordinates = cache.map(e => toLonLat(e))
196
+ polygon.event.trigger('data-loaded')
197
+ polygon.event.trigger('pointer-in')
198
+ break
199
+ case 3:
200
+ polygon.event.trigger('stop-edit')
201
+ break
202
+ }
203
+ }
204
+
205
+ const editor = new PolygonEditor<Feature<Point>, Feature<Point>>()
206
+
207
+ editor.on('create-node', (n) => {
208
+ if (n.type == 'node') {
209
+ const feature = new Feature(new Point(n.position))
210
+ feature.setStyle(styleNode)
211
+ feature.set('event', {
212
+ cursor: 'move',
213
+ onPointerDown() {
214
+ status = 4
215
+ activeNode = n
216
+ map.moveable = false
217
+ },
218
+ onPointerUp() {
219
+ if (status == 4) {
220
+ status = 3
221
+ map.moveable = true
222
+ activeNode = undefined
223
+ }
224
+ },
225
+ onDbClick() {
226
+ n.destroy()
227
+ geometry.setCoordinates([editor.getCoordinates()])
228
+ }
229
+ }, true)
230
+ source.addFeature(feature)
231
+ n.shape = feature
232
+ } else {
233
+ const feature = new Feature(new Point(n.position))
234
+ feature.setStyle(styleVirtual)
235
+ feature.set('event', {
236
+ cursor: 'pointer',
237
+ onPointerDown() {
238
+ status = 4
239
+ activeNode = n.insert()
240
+ map.cursor = 'move'
241
+ map.moveable = false
242
+ },
243
+ }, true)
244
+ source.addFeature(feature)
245
+ n.shape = feature
246
+ }
247
+ })
248
+ editor.on('update-node', (n) => {
249
+ n.shape.getGeometry().setCoordinates(n.position)
250
+ })
251
+ editor.on('remove-node', (n) => {
252
+ source.removeFeature(n.shape)
253
+ })
254
+ editor.on('empty', () => {
255
+ source.removeFeature(feature)
256
+ status = 0
257
+ })
258
+ const onStartEdit = () => {
259
+ switch (status) {
260
+ case 2:
261
+ status = 3
262
+ editor.setCoordinates(geometry.getCoordinates()[0])
263
+ break
264
+ }
265
+
266
+ }
267
+
268
+ const onStopEdit = () => {
269
+ if (status == 3) {
270
+ status = 2
271
+ skip++
272
+ polygon.coordinates = editor.getCoordinates().map(e => toLonLat(e))
273
+ editor.setCoordinates([])
274
+ polygon.event.trigger('pointer-in')
275
+ }
276
+
277
+ }
278
+
279
+
280
+ const onDestroy = () => {
281
+ viewer.removeLayer(layer)
282
+ event.off('pointer-move', onMouseMove)
283
+ event.off('left-click', onClick)
284
+ event.off('double-click', onDbClick)
285
+ polygon.event.off('update', onUpdate)
286
+ polygon.event.off('start-edit', onStartEdit)
287
+ polygon.event.off('stop-edit', onStopEdit)
288
+ polygon.event.off('destroy', onDestroy)
289
+
290
+ }
291
+
292
+ event.on('pointer-move', onMouseMove)
293
+ event.on('left-click', onClick)
294
+ event.on('double-click', onDbClick)
295
+ polygon.event.on('update', onUpdate)
296
+ polygon.event.on('start-edit', onStartEdit)
297
+ polygon.event.on('stop-edit', onStopEdit)
298
+ polygon.event.on('destroy', onDestroy)
299
299
  }