@hzab/map-combine 0.4.1 → 0.4.2-alpha.1

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