@hzab/map-combine 0.0.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +67 -0
  3. package/package.json +56 -0
  4. package/src/assets/Thumbs.db +0 -0
  5. package/src/assets/add.png +0 -0
  6. package/src/assets/point.png +0 -0
  7. package/src/basic/ContextMenu.tsx +49 -0
  8. package/src/basic/MapCombine.ts +67 -0
  9. package/src/basic/MapElement.ts +32 -0
  10. package/src/basic/MapEvent.ts +18 -0
  11. package/src/basic/Point.ts +176 -0
  12. package/src/basic/PointAggregation.tsx +189 -0
  13. package/src/basic/Polygon.ts +180 -0
  14. package/src/basic/Polyline.ts +194 -0
  15. package/src/basic/ReactPoint.tsx +357 -0
  16. package/src/basic/ReactPopup.tsx +34 -0
  17. package/src/basic/Tile3D.ts +99 -0
  18. package/src/cesium/CesiumEvent.ts +86 -0
  19. package/src/cesium/CesiumMap.ts +167 -0
  20. package/src/cesium/CesiumPoint.ts +137 -0
  21. package/src/cesium/CesiumPolygon.ts +368 -0
  22. package/src/cesium/CesiumPolyline.ts +382 -0
  23. package/src/cesium/CesiumTile3D.ts +100 -0
  24. package/src/mine/MineEvent.ts +29 -0
  25. package/src/mine/MineMap.ts +90 -0
  26. package/src/mine/MinePoint.ts +139 -0
  27. package/src/mine/MinePolygon.ts +388 -0
  28. package/src/mine/MinePolyline.ts +359 -0
  29. package/src/mine/MineTile3D.ts +32 -0
  30. package/src/openlayer/OpenlayerEvent.ts +75 -0
  31. package/src/openlayer/OpenlayerMap.ts +149 -0
  32. package/src/openlayer/OpenlayerPoint.ts +177 -0
  33. package/src/openlayer/OpenlayerPolygon.ts +300 -0
  34. package/src/openlayer/OpenlayerPolyline.ts +289 -0
  35. package/src/utils/Image.ts +46 -0
  36. package/src/utils/PolygonEditor.ts +159 -0
  37. package/src/utils/PolylineEditor.ts +149 -0
  38. package/src/utils/Projection.ts +46 -0
  39. package/src/utils/index.ts +131 -0
  40. package/src/utils/static.ts +7 -0
@@ -0,0 +1,139 @@
1
+
2
+ import { Point } from "../basic/Point";
3
+ import { MineMap } from "./MineMap";
4
+
5
+
6
+ export function drawPoint(map: MineMap, point: Point<unknown>) {
7
+ const { viewer } = map
8
+ const { size, center } = point
9
+ let status = 0
10
+ let skip = 0
11
+
12
+ const img = document.createElement('img')
13
+ img.src = point.src
14
+ img.width = size[0]
15
+ img.height = size[1]
16
+ img.style.cursor = point.cursor
17
+
18
+ img.onpointerenter = () => {
19
+ status == 2 && point.event.trigger('pointer-in')
20
+ }
21
+ img.onpointerleave = () => {
22
+ status == 2 && point.event.trigger('pointer-out')
23
+ }
24
+
25
+ img.onclick = () => {
26
+ status == 2 && point.event.trigger('left-click')
27
+ }
28
+ img.oncontextmenu = () => {
29
+ status == 2 && point.event.trigger('right-click')
30
+ }
31
+
32
+ const marker = new minemap.Marker({
33
+ draggable: point.editable,
34
+ rotation: 0,
35
+ offset: [-size[0] * (center[0]), -size[1] * (center[1])],
36
+ element: img
37
+ })
38
+
39
+
40
+ if (point.coordinates) {
41
+ status = 2
42
+ marker.setLngLat(point.coordinates).setAltitude(point.coordinates[2] ?? 0)
43
+ point.show && marker.addTo(map.viewer);
44
+ }
45
+
46
+
47
+ const onMouseMove = (e: any) => {
48
+ switch (status) {
49
+ case 0:
50
+ status = 1
51
+ marker.setLngLat(e.lngLat)
52
+ point.show && marker.addTo(map.viewer);
53
+ break;
54
+ case 1:
55
+ marker.setLngLat(e.lngLat);
56
+ break
57
+ }
58
+ }
59
+
60
+ const onUpdate = (e: Set<string>) => {
61
+ if (skip) {
62
+ skip--
63
+ return
64
+ }
65
+ const { size, center } = point
66
+ e.forEach(key => {
67
+ switch (key) {
68
+ case 'show':
69
+ point.show ? marker.addTo(map.viewer) : marker.remove()
70
+ break;
71
+ case 'editable':
72
+ marker.setDraggable(point.editable)
73
+ break;
74
+ case 'coordinates':
75
+ if (point.coordinates) {
76
+ marker.setLngLat(point.coordinates).setAltitude(point.coordinates[2] ?? 0)
77
+ switch (status) {
78
+ case 0:
79
+ point.show && marker.addTo(map.viewer)
80
+ status = 2;
81
+ break;
82
+ case 1:
83
+ status = 2;
84
+ break;
85
+ }
86
+ } else {
87
+ marker.remove()
88
+ status = 0
89
+ }
90
+
91
+ break;
92
+ case 'src':
93
+ img.src = point.src
94
+ break;
95
+ case 'size':
96
+ img.width = size[0]
97
+ img.height = size[1]
98
+ if (!e.has('center')) {
99
+ marker.setOffset([-size[0] * (center[0]), -size[1] * (center[1])])
100
+ }
101
+ break;
102
+ case 'center':
103
+ marker.setOffset([-size[0] * (center[0]), -size[1] * (center[1])])
104
+ break;
105
+ case 'rotation':
106
+ marker.setRotation(point.rotation)
107
+ break;
108
+ default:
109
+ throw new Error(`${key} 还不支持修改`)
110
+ }
111
+ })
112
+ }
113
+
114
+
115
+ const onDestroy = () => {
116
+ marker.remove()
117
+ viewer.off('mousemove', onMouseMove)
118
+ viewer.off('click', onClick)
119
+ point.event.off('update', onUpdate)
120
+ point.event.off('destroy', onDestroy)
121
+
122
+ }
123
+ const onClick = () => {
124
+ if (status == 1) {
125
+ status = 2
126
+ skip++
127
+ const p = marker.getLngLat()
128
+ point.coordinates = [p.lng, p.lat]
129
+ point.event.trigger('pointer-in')
130
+ }
131
+ }
132
+
133
+
134
+ viewer.on('mousemove', onMouseMove)
135
+ viewer.on('click', onClick)
136
+ point.event.on('update', onUpdate)
137
+ point.event.on('destroy', onDestroy)
138
+
139
+ }
@@ -0,0 +1,388 @@
1
+
2
+ import { Polygon } from "../basic/Polygon";
3
+ import { ChainNode, PolygonEditor } from "../utils/PolygonEditor";
4
+ import { MineMap } from './MineMap';
5
+ import iconPoint from '../assets/point.png'
6
+ import iconAdd from '../assets/add.png'
7
+ import { dealColor } from "../utils";
8
+
9
+
10
+ function createImgNode(
11
+ onPointerDown: () => void,
12
+ onPointerUp: () => void,
13
+ onDbClick: () => void,
14
+ ) {
15
+ const img = document.createElement('img')
16
+ img.src = iconPoint
17
+ img.width = 16
18
+ img.height = 16
19
+ img.style.cursor = 'move'
20
+ img.addEventListener('pointerdown', onPointerDown)
21
+ img.addEventListener('pointerup', onPointerUp)
22
+ img.addEventListener('dblclick', onDbClick)
23
+ const marker = new minemap.Marker({
24
+ draggable: false,
25
+ element: img,
26
+ offset: [-8, -8],
27
+ })
28
+ return marker
29
+ }
30
+
31
+ function createImgVirtul(onPointerDown: () => void) {
32
+ const img = document.createElement('img')
33
+ img.src = iconAdd
34
+ img.width = 16
35
+ img.height = 16
36
+ img.style.cursor = 'pointer'
37
+ img.addEventListener('pointerdown', onPointerDown)
38
+ const marker = new minemap.Marker({
39
+ draggable: false,
40
+ element: img,
41
+ offset: [-8, -8],
42
+ })
43
+ return marker
44
+ }
45
+
46
+
47
+ function getPolygonOption(polygon: Polygon<unknown>) {
48
+ const [color, opacity] = dealColor(polygon.fill)
49
+ return {
50
+ id: polygon.name,
51
+ source: polygon.name,
52
+ type: "fill",
53
+ layout: {
54
+ visibility: polygon.show ? "visible" : 'none',
55
+ },
56
+ paint: {
57
+ "fill-color": color,
58
+ 'fill-opacity': opacity
59
+ }
60
+ }
61
+ }
62
+
63
+ function getPolylineOption(polygon: Polygon<unknown>) {
64
+ return {
65
+ id: polygon.name + '_outline',
66
+ source: polygon.name,
67
+ type: "line",
68
+ translation: [0, 0, 1000],
69
+ "depth-test": false,
70
+ layout: {
71
+ visibility: polygon.show ? "visible" : 'none',
72
+ },
73
+ paint: polygon.dash ? {
74
+ "line-dasharray": [10, 10],
75
+ "line-color": polygon.stroke,
76
+ "line-width": polygon.lineWidth
77
+ } : {
78
+ "line-color": polygon.stroke,
79
+ "line-width": polygon.lineWidth
80
+ },
81
+ }
82
+ }
83
+
84
+
85
+ function main(map: MineMap, polygon: Polygon<unknown>) {
86
+ const { viewer } = map
87
+ const data = {
88
+ type: "FeatureCollection",
89
+ features: [],
90
+ }
91
+ viewer.addSource(polygon.name, {
92
+ type: "geojson",
93
+ data
94
+ });
95
+
96
+ const cource = viewer.getSource(polygon.name)
97
+
98
+ viewer.addLayer(getPolylineOption(polygon));
99
+ viewer.addLayer(getPolygonOption(polygon));
100
+
101
+ let status = 0
102
+ let skip = 0
103
+ const editor = new PolygonEditor<any, any>()
104
+ let activeNode: ChainNode<any, any>
105
+ editor.on('create-node', (n) => {
106
+ if (n.type == 'node') {
107
+ const maker = createImgNode(() => {
108
+ status = 4
109
+ activeNode = n
110
+ map.moveable = false
111
+ }, () => {
112
+ if (status == 4) {
113
+ status = 3
114
+ map.moveable = true
115
+ activeNode = undefined
116
+ }
117
+ }, () => {
118
+ n.destroy()
119
+ updateCoordinate(editor.getCoordinates())
120
+ })
121
+ maker.setLngLat(n.position).addTo(viewer)
122
+
123
+ n.shape = maker
124
+ } else {
125
+ const maker = createImgVirtul(() => {
126
+ status = 4
127
+ activeNode = n.insert()
128
+ map.moveable = false
129
+ })
130
+ maker.setLngLat(n.position).addTo(viewer)
131
+ viewer.addMarker(maker)
132
+ n.shape = maker
133
+ }
134
+ })
135
+
136
+ editor.on('update-node', (n) => {
137
+ n.shape.setLngLat(n.position)
138
+ })
139
+ editor.on('remove-node', (n) => {
140
+ viewer.removeMarker(n.shape)
141
+ })
142
+ editor.on('empty', () => {
143
+ // source.removeFeature(feature)
144
+ status = 0
145
+ })
146
+
147
+ const updateCoordinate = (coordinates) => {
148
+ if (coordinates) {
149
+ data.features[0] = {
150
+ type: "Feature",
151
+ geometry: {
152
+ type: "Polygon",
153
+ coordinates: [[...coordinates, coordinates[0]]],
154
+ },
155
+ properties: {
156
+ id: polygon.name,
157
+ },
158
+ }
159
+ } else {
160
+ data.features = []
161
+ }
162
+ cource.setData(data)
163
+ }
164
+
165
+
166
+
167
+
168
+
169
+ if (polygon.coordinates) {
170
+ status = 2
171
+ updateCoordinate(polygon.coordinates)
172
+ }
173
+ const onUpdate = (e: Set<string>) => {
174
+ if (skip) {
175
+ skip--
176
+ return
177
+ }
178
+
179
+ const keys = new Set()
180
+
181
+ e.forEach(key => {
182
+ switch (key) {
183
+ case 'show':
184
+ keys.add('polyline')
185
+ keys.add('polygon')
186
+ break;
187
+ case 'editable':
188
+ break;
189
+ case 'coordinates':
190
+ updateCoordinate(polygon.coordinates)
191
+ if (status == 3) {
192
+ editor.setCoordinates([])
193
+ }
194
+ if (polygon.coordinates) {
195
+ status = 2
196
+
197
+ } else {
198
+ status = 0
199
+
200
+ }
201
+
202
+ break;
203
+ case 'fill':
204
+ keys.add('polygon')
205
+ break
206
+ case 'lineWidth':
207
+ keys.add('polyline')
208
+ break;
209
+ case 'stroke':
210
+ keys.add('polyline')
211
+ break;
212
+ case 'dash':
213
+ keys.add('polyline')
214
+ break;
215
+ default:
216
+ throw new Error(`${key} 还不支持修改`)
217
+ }
218
+ })
219
+
220
+ keys.forEach(e => {
221
+ switch (e) {
222
+ case 'polyline':
223
+ viewer.removeLayer(polygon.name + '_outline')
224
+ viewer.addLayer(getPolylineOption(polygon));
225
+ break;
226
+ case 'polygon':
227
+ viewer.removeLayer(polygon.name)
228
+ viewer.addLayer(getPolygonOption(polygon));
229
+ break;
230
+ }
231
+ })
232
+ }
233
+
234
+ const onPointerIn = () => {
235
+ if (status == 2) {
236
+ map.cursor = polygon.cursor
237
+ polygon.event.trigger('pointer-in')
238
+ }
239
+
240
+ }
241
+
242
+ const onPointerOut = () => {
243
+ if (status == 2) {
244
+ map.cursor = 'default'
245
+ polygon.event.trigger('pointer-out')
246
+ }
247
+ }
248
+
249
+ let cache = []
250
+
251
+ const onClick = (e: any) => {
252
+ switch (status) {
253
+ case 0:
254
+ status = 1
255
+ cache = [[e.lngLat.lng, e.lngLat.lat], [e.lngLat.lng, e.lngLat.lat]]
256
+ break;
257
+ case 1:
258
+ cache.push(cache[cache.length - 1])
259
+ break;
260
+ }
261
+ }
262
+
263
+ const onPointerMove = (e: any) => {
264
+ switch (status) {
265
+ case 1:
266
+ cache.pop()
267
+ cache.push([e.lngLat.lng, e.lngLat.lat])
268
+ updateCoordinate(cache)
269
+ break;
270
+ case 4:
271
+ activeNode.update([e.lngLat.lng, e.lngLat.lat])
272
+ updateCoordinate(editor.getCoordinates())
273
+
274
+ break;
275
+ }
276
+ }
277
+
278
+ const onDbClick = () => {
279
+ switch (status) {
280
+ case 1:
281
+ status = 2
282
+ skip++
283
+ cache.pop()
284
+ cache.pop()
285
+ polygon.coordinates = cache
286
+ polygon.event.trigger('pointer-in')
287
+ break;
288
+ case 3:
289
+ if (!skip) {
290
+ polygon.event.trigger('stop-edit')
291
+ } else {
292
+ skip = 0
293
+ }
294
+ break;
295
+ }
296
+ }
297
+
298
+ const onLineDbClick = () => {
299
+
300
+ switch (status) {
301
+ case 2:
302
+ polygon.event.trigger('start-edit')
303
+ break;
304
+ }
305
+ }
306
+
307
+ const onLineClick = () => {
308
+ switch (status) {
309
+ case 2:
310
+ polygon.event.trigger('left-click')
311
+ break;
312
+ }
313
+ }
314
+ const onLineRClick = () => {
315
+ if (polygon.menu) {
316
+ map.menu.show(polygon.menu);
317
+ }
318
+ switch (status) {
319
+ case 2:
320
+ polygon.event.trigger('right-click')
321
+ break;
322
+ }
323
+ }
324
+
325
+
326
+ const onStartEdit = () => {
327
+ if (status == 2) {
328
+ status = 3
329
+ map.cursor = 'default'
330
+ editor.setCoordinates(polygon.coordinates)
331
+ skip = 1
332
+ }
333
+ }
334
+
335
+ const onStopEdit = () => {
336
+ if (status == 3) {
337
+ status = 2
338
+ skip++
339
+ polygon.coordinates = editor.getCoordinates()
340
+ editor.setCoordinates([])
341
+ }
342
+ }
343
+
344
+
345
+ const onDestroy = () => {
346
+ viewer.removeLayer(polygon.name)
347
+ viewer.removeSource(polygon.name)
348
+
349
+ viewer.off('mouseover', polygon.name, onPointerIn)
350
+ viewer.off('mouseout', polygon.name, onPointerOut)
351
+ viewer.off('dblclick', polygon.name, onLineDbClick)
352
+ viewer.off('click', polygon.name, onLineClick)
353
+ viewer.off('contextmenu', polygon.name, onLineRClick)
354
+ viewer.off('click', onClick)
355
+ viewer.off('mousemove', onPointerMove)
356
+ viewer.off('dblclick', onDbClick)
357
+ polygon.event.off('update', onUpdate)
358
+ polygon.event.off('destroy', onDestroy)
359
+ polygon.event.off('start-edit', onStartEdit)
360
+ polygon.event.off('stop-edit', onStopEdit)
361
+ }
362
+
363
+ viewer.on('mouseover', polygon.name, onPointerIn)
364
+ viewer.on('mouseout', polygon.name, onPointerOut)
365
+ viewer.on('dblclick', polygon.name, onLineDbClick)
366
+ viewer.on('click', polygon.name, onLineClick)
367
+ viewer.on('contextmenu', polygon.name, onLineRClick)
368
+ viewer.on('click', onClick)
369
+ viewer.on('mousemove', onPointerMove)
370
+ viewer.on('dblclick', onDbClick)
371
+
372
+ polygon.event.on('update', onUpdate)
373
+ polygon.event.on('destroy', onDestroy)
374
+ polygon.event.on('start-edit', onStartEdit)
375
+ polygon.event.on('stop-edit', onStopEdit)
376
+ }
377
+
378
+
379
+ export function drawPolygon(map: MineMap, polygon: Polygon<unknown>) {
380
+ const { viewer } = map
381
+ if (viewer.loaded()) {
382
+ main(map, polygon)
383
+ } else {
384
+ viewer.once('load', () => {
385
+ main(map, polygon)
386
+ })
387
+ }
388
+ }