@aibee/crc-bmap 0.0.73 → 0.0.75

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,565 +1,577 @@
1
- import { BMap, Graphic, Overlay, SelectBox } from '../../src'
2
- import Stats from 'three/examples/jsm/libs/stats.module.js'
3
-
4
- // 创建性能监视器
5
- let stats = new Stats()
6
-
7
- // 设置监视器面板,传入面板id(0: fps, 1: ms, 2: mb)
8
- stats.showPanel(0)
9
-
10
- // 设置监视器位置
11
- stats.dom.style.position = 'absolute'
12
- stats.dom.style.left = '10vh'
13
- stats.dom.style.top = '10vh'
14
- stats.dom.style.zIndex = "100"
15
-
16
- // 将监视器添加到页面中
17
- document.body.appendChild(stats.dom)
18
-
19
- function render() {
20
- // 更新帧数
21
- stats.update()
22
- requestAnimationFrame(render)
23
- }
24
-
25
- render()
26
-
27
- const bmap = new BMap(document.getElementById('app')!, {
28
- apiInfo: {
29
- headers: {
30
- "Authorization": localStorage.getItem("Authorization_token") || "Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIzNzIwYjNhOGU3MGM0NGU3YTdkYzdiMTE4NDNhZjFhMyIsInN1YiI6IllVV0VJWEkiLCJpc3MiOiJtaXhjIiwiaWF0IjoxNzAwNzI2NTA4fQ.su7smca9cVeMQ9u-NyT_3NKa6kYfoLIGsOtNZLOnXXI"
31
- }
32
- },
33
- resizeObserver: true
34
- });
35
-
36
- (async () => {
37
- // 加载图元数据
38
- await bmap.load({
39
- brand: "crc",
40
- project: "0202A501",
41
- phase: "themixctd01",
42
- building: "A",
43
- floor: "L1",
44
- ts: "2024-01-03",
45
- resource_type_list: [1, 2, 3, 4, 6].join(",")
46
- });
47
- // 切换楼层
48
- await bmap.switchFloor({
49
- brand: "crc",
50
- project: "0202A501",
51
- phase: "themixctd01",
52
- building: "A",
53
- floor: "L1",
54
- ts: "2024-01-03",
55
- resource_type_list: [1, 2, 3, 4, 6].join(",")
56
- })
57
- bmap.changeMapType("3d")
58
- // bmap.getGraphicByNodeId("700fae09")!.options.strokeWidth = 2;
59
- // bmap.getGraphicByNodeId("b0846107")!.options.strokeWidth = 0.5;
60
- // bmap.getGraphicByNodeId("654cf0a2")!.options.fillColor = '#45E583';
61
- // bmap.getGraphicByNodeId("0b245fa9")!.options.fillColor = '#FFB166';
62
- // bmap.getGraphicByNodeId("9cd3408c")!.options.fillColor = '#FF4D4D';
63
- // bmap.getFloorAllGraphics().forEach(graphic => {
64
- // if (graphic.options.userData.mark) {
65
- // graphic.options.fillColor = '#F2F6FC'
66
- // graphic.options.height = 0.1
67
- // }
68
- // })
69
-
70
- // bmap.getGraphicByNodeId("996d97a6")!.options.stroke = false;
71
- // bmap.getGraphicByNodeId("996d97a6")!.options.height = 0.001;
72
- // bmap.getGraphicByNodeId("996d97a6")!.options.strokeColor = "#000000";
73
- // bmap.getGraphicByNodeId("996d97a6")!.options.strokeOpacity = 1;
74
-
75
- })();
76
-
77
- const graphicId = "9338ca4b"
78
-
79
- // 图元点击
80
- bmap.context.addEventListener('graphic-click', (data) => {
81
- console.log('graphic-click', data.graphics)
82
- // const div = document.createElement("div")
83
- // div.style.cssText = "position: fixed; top: 25%; left: 25%; bottom: 25%; right: 25%; background: red; z-index: 99;"
84
- // div.addEventListener("click", () => {
85
- // document.body.removeChild(div)
86
- // })
87
- // document.body.appendChild(div)
88
- data.graphics[0] && bmap.translateElementToCenter(data.graphics[0], 200)
89
- });
90
-
91
- // 图元选中
92
- bmap.context.addEventListener('select-graphic', (data) => {
93
- console.log('select-graphic', data.graphics)
94
- data.graphics.forEach(item => item.options.fillColor = '#ff0000')
95
- });
96
-
97
- // poi点击
98
- bmap.context.addEventListener('poi-click', (data) => {
99
- console.log('poi-click', data.pois)
100
- bmap.translateElementToCenter(data.pois[0], 500)
101
- });
102
-
103
- (window as any).bmap = bmap;
104
-
105
-
106
- /**
107
- * 显示比例尺
108
- */
109
- const ratioDiv = document.createElement("div")
110
- ratioDiv.style.cssText = "position: absolute; bottom: 10vh; left: 10vw; z-index: 2; background: blue; color: red;"
111
- ratioDiv.textContent = "100M";
112
- document.body.appendChild(ratioDiv)
113
- bmap.context.addEventListener('change-ratio', ({ px }) => {
114
- // px 一百米对应的像素点
115
- let m = 100;
116
- let scale = 1
117
- // 让px保持在50-100中间的一个米的整数
118
- if (px < 50) {
119
- scale = Math.ceil(100 / px)
120
- px *= scale
121
- m *= scale
122
- } else if (px > 100) {
123
- scale = Math.floor(px / 100)
124
- while (m % scale != 0) {
125
- scale--;
126
- }
127
- px /= scale
128
- m /= scale
129
- }
130
- ratioDiv.style.width = `${px}px`;
131
- ratioDiv.textContent = `${m}米`
132
- })
133
-
134
- /**
135
- * 按钮操作
136
- */
137
- // 修改容器大小
138
- document.getElementById("changeContainerSize")?.addEventListener('click', () => {
139
- // 获取legacyId 和 图元 的map
140
- // const graphic = bmap.getGraphicByNodeId("45f9ff75")!
141
- // const poi = bmap.createGraphicPoi(graphic, {
142
- // texts: [
143
- // { text: "店铺名称" }
144
- // ]
145
- // })
146
- document.getElementById("app1")!.style.width = "500px"
147
- })
148
- // 添加poi
149
- document.getElementById("createPoi")?.addEventListener('click', () => {
150
- // 获取legacyId 图元 的map
151
- // const graphic = bmap.getGraphicByNodeId("45f9ff75")!
152
- // const poi = bmap.createGraphicPoi(graphic, {
153
- // texts: [
154
- // { text: "店铺名称" }
155
- // ]
156
- // })
157
- const graphics: Graphic[] = bmap.getFloorAllGraphics()
158
- // bmap.context.control.zoomSpeed = 2
159
- graphics.forEach(graphic => {
160
- // 在图元上添加poi
161
- const poi = bmap.createGraphicPoi(graphic, {
162
- texts: [{ text: "店铺名称", styles: { fontWeight: "bold" } }]
163
- })
164
- })
165
- // return
166
- // 监听放大缩小的变化
167
- bmap.addEventListener("zoom-change", ({ basicZoom, cameraZoom }) => {
168
- const zoomScale = cameraZoom / basicZoom
169
- // console.log(zoomScale, basicZoom, cameraZoom)
170
- bmap.getPois().forEach(poi => {
171
- if (zoomScale > 2) {
172
- poi!.options.texts = [
173
- { text: "店铺名称" },
174
- { text: "店铺名称" },
175
- { text: "店铺名称" },
176
- { text: "店铺名称" },
177
- ]
178
- } else if (zoomScale > 1.6) {
179
- poi!.options.texts = [
180
- { text: "店铺名称" },
181
- { text: "店铺名称" },
182
- { text: "店铺名称" },
183
- ]
184
- } else if (zoomScale > 1.3) {
185
- poi!.options.texts = [
186
- { text: "店铺名称" },
187
- { text: "店铺名称" },
188
- ]
189
- } else {
190
- poi!.options.texts = [
191
- { text: "店铺名称" },
192
- ]
193
- }
194
- })
195
- })
196
- })
197
- // 删除poi
198
- document.getElementById("removePoi")?.addEventListener('click', () => {
199
- bmap.removePoiById(graphicId)
200
- })
201
- // 删除在创建
202
- document.getElementById("deleteAnCreateGraphic")?.addEventListener('click', () => {
203
- const graphic = bmap.getGraphicByNodeId(graphicId)!
204
- console.log(graphic)
205
- const options = graphic.options
206
- bmap.deleteGraphic(graphic)
207
- setTimeout(() => {
208
- bmap.createGraphicByOptions(options)
209
- }, 1000)
210
- })
211
- // 获取全部图元
212
- document.getElementById("getAllGraphics")?.addEventListener('click', () => {
213
- console.log(bmap.getFloorAllGraphics())
214
- })
215
- // 添加选中块儿
216
- document.getElementById("addSelectBox")?.addEventListener('click', () => {
217
- const selectBox = new SelectBox(bmap.context)
218
- selectBox.selectGraphic(bmap.getGraphicByNodeId(graphicId)!)
219
- setTimeout(() => {
220
- selectBox.setEnable(false)
221
- }, 1000)
222
- })
223
- // 切换楼层
224
- document.getElementById("switchFloor")?.addEventListener('click', async () => {
225
- await bmap.load({
226
- brand: "crc",
227
- project: "0202A501",
228
- phase: "themixctd01",
229
- building: "A",
230
- floor: "L1",
231
- ts: "2023-12-01",
232
- resource_type_list: [1, 2, 3, 4, 6].join(",")
233
-
234
- });
235
- // 切换楼层
236
- bmap.switchFloor({
237
- brand: "crc",
238
- project: "0202A501",
239
- phase: "themixctd01",
240
- building: "A",
241
- floor: "L1",
242
- ts: "2023-12-01",
243
- resource_type_list: [1, 2, 3, 4, 6].join(",")
244
- })
245
- })
246
- // hover显示覆盖物
247
- document.getElementById("hoverShowOverlay")?.addEventListener('click', async () => {
248
- const overlaysMap = new Map<Graphic, Overlay>()
249
- const overlayState = new Map<Overlay, { graphicHover: boolean, divHover: boolean }>()
250
- bmap.context.addEventListener("hover", ({ graphics }) => {
251
- // console.log("hover", graphics)
252
- // overlaysMap.forEach(item => item.dispose())
253
- // graphics.forEach(graphic => {
254
- // const overlay = new Overlay(bmap.context)
255
- // overlay.bindElement(graphic)
256
- // const div = document.createElement("div")
257
- // div.style.cssText = "width: 100px; height: 100px; background: red;transform: translate(-50%, -100%);"
258
- // div.textContent = "显示一段文本"
259
- // })
260
- // 没有hover的元素要删除
261
- overlaysMap.forEach((overlay, graphic) => {
262
- if (!graphics.includes(graphic)) {
263
- // overlay.dispose();
264
- // overlaysMap.delete(graphic)
265
- overlayState.get(overlay)!.graphicHover = false
266
- window.requestAnimationFrame(() => {
267
- // 鼠标即不在div上也不再graphic上就销毁这个overlay
268
- if (!overlayState.get(overlay)!.divHover) {
269
- overlay.dispose();
270
- overlaysMap.delete(graphic)
271
- }
272
- })
273
- }
274
- })
275
- graphics.forEach(graphic => {
276
- if (overlaysMap.has(graphic)) {
277
- return
278
- }
279
- const overlay = new Overlay(bmap.context, { autoUpdate: false });
280
- overlay.addEventListener("update-position", ({ x, y, height }) => {
281
- console.log(x, y, height)
282
- overlay.div.style.transform = `translate3d(calc(${x}px - 50%), calc(${-height+y}px - 100%), 0)`
283
- })
284
- overlay.bindElement(graphic)
285
- const div = document.createElement("div")
286
- // console.log(overlay)
287
- div.style.cssText = "width: 100px; height: 100px; background: red;point-event: none; "
288
- div.textContent = "显示一段文本"
289
- overlay.div.addEventListener("mouseover", () => {
290
- console.log("进入额")
291
- overlayState.get(overlay)!.divHover = true
292
- console.log(overlayState.get(overlay))
293
- })
294
- overlay.div.addEventListener("mouseout", () => {
295
- console.log("移除了")
296
- overlayState.get(overlay)!.divHover = false
297
- if (!overlayState.get(overlay)!.graphicHover) {
298
- overlay.dispose();
299
- overlaysMap.delete(graphic)
300
- }
301
- })
302
- overlay.div.appendChild(div)
303
- overlaysMap.set(graphic, overlay)
304
- overlayState.set(overlay, {graphicHover: true, divHover: false})
305
- })
306
- })
307
- })
308
- document.getElementById("changeGraphicColor")?.addEventListener('click', () => {
309
- graphic.options.fillColor = "#000fff";
310
- })
311
- document.getElementById("changeGraphicOpacity")?.addEventListener('click', () => {
312
- graphic.options.fillOpacity = 0.5;
313
- })
314
- document.getElementById("changeGraphicBorder")?.addEventListener('click', () => {
315
- graphic.options.strokeColor = "#00ff00";
316
- })
317
- document.getElementById("changeGraphicBorderOpacity")?.addEventListener('click', () => {
318
- graphic.options.strokeOpacity = 0.5;
319
- })
320
- document.getElementById("changeGraphicHighlight")?.addEventListener('click', () => {
321
- // TODO 获取图源的资源id 在graphicLayer 和 poiLayer 中判断不是这些资源id的都改小透明度,是的透明度都设置成1
322
- })
323
- document.getElementById("changeGraphicAirHeight")?.addEventListener('click', () => {
324
- graphic.options.airHeight = 10
325
- // TODO 获取图源的资源id 然后获取poi 还需要修改对应poi的高度 airHeight + height
326
- })
327
- document.getElementById("changeGraphicHeight")?.addEventListener('click', () => {
328
- graphic.options.height = 20
329
- // TODO 获取图源的资源id 然后获取poi 还需要修改对应poi的高度 airHeight + height
330
- })
331
- document.getElementById("changeGraphicVisible")?.addEventListener('click', () => {
332
- graphic.options.visible = false
333
- })
334
- document.getElementById("changePoiIcon")?.addEventListener('click', () => {
335
- poi.options.icon = 'https://prod-deployment.oss-cn-hangzhou.aliyuncs.com/dd932d4d105e453ea93dd1787dcae6eb_icon-%E5%A4%A7%E5%B1%8F.svg'
336
- })
337
- document.getElementById("changePoiText")?.addEventListener('click', () => {
338
- poi.options.text = '修改后文本'
339
- })
340
- document.getElementById("changePoiVisible")?.addEventListener('click', () => {
341
- bmap.context.currentFloor?.poiLayer.removePoi(poi)
342
- })
343
- document.getElementById("changeLightColor")?.addEventListener('click', () => {
344
- bmap.context.changeAmbientLightColor(0xcccccc)
345
- })
346
- // document.getElementById("changeShadowLightColor")?.addEventListener('click', () => {
347
- // bmap.context.shadow.changeLightColor(0x111000)
348
- // })
349
- document.getElementById("openMouseDrag")?.addEventListener('click', () => {
350
- bmap.context.control.enablePan = true
351
- })
352
- document.getElementById("closeMouseDrag")?.addEventListener('click', () => {
353
- bmap.context.control.enablePan = false
354
- })
355
- document.getElementById("openMouseZoom")?.addEventListener('click', () => {
356
- bmap.context.control.enableZoom = true
357
- })
358
- document.getElementById("closeMouseZoom")?.addEventListener('click', () => {
359
- bmap.context.control.enableZoom = false
360
- })
361
- document.getElementById("reduceMap")?.addEventListener('click', () => {
362
- bmap.reduceMap(0.5, 100)
363
- })
364
- document.getElementById("enlargeMap")?.addEventListener('click', () => {
365
- bmap.enlargeMap(0.3, 0)
366
- })
367
- document.getElementById("centerView")?.addEventListener('click', () => {
368
- bmap.resize()
369
- bmap.resetView()
370
- })
371
- document.getElementById("centerGraphic")?.addEventListener('click', () => {
372
- bmap.context.fitCameraToObject(graphic)
373
- })
374
- document.getElementById("change2d")?.addEventListener('click', () => {
375
- bmap.changeMapType('2d')
376
- })
377
- document.getElementById("change3d")?.addEventListener('click', () => {
378
- bmap.changeMapType('3d')
379
- })
380
- document.getElementById("configurePolarShortcutKeys")?.addEventListener('click', () => {
381
- bmap.configurePolarShortcutKeys(['ControlLeft', 'MetaLeft', 'KeyC'])
382
- })
383
- document.getElementById("configureAzimuthShortcutKeys")?.addEventListener('click', () => {
384
- bmap.configureAzimuthalShortcutKeys(['KeyV'])
385
- })
386
- document.getElementById("changeAzimuth")?.addEventListener('click', () => {
387
- bmap.rotateMap()
388
- })
389
- const fn = (data) => {
390
- console.log(data.graphics, data.pois)
391
- }
392
- document.getElementById("openHover")?.addEventListener('click', () => {
393
- bmap.context.addEventListener("pointer-over", fn)
394
- bmap.context.addEventListener("pointer-move", fn)
395
- })
396
- document.getElementById("closeHover")?.addEventListener('click', () => {
397
- bmap.context.removeEventListener("pointer-over", fn)
398
- bmap.context.removeEventListener("pointer-move", fn)
399
- })
400
- document.getElementById("mousePickup")?.addEventListener('click', () => {
401
- // TODO
402
- })
403
- document.getElementById("mouseMulPickup")?.addEventListener('click', () => {
404
- // TODO
405
- })
406
- document.getElementById("overlayText")?.addEventListener('click', () => {
407
- const overlay = new Overlay(bmap.context)
408
- overlay.bindElement(graphic)
409
- overlay.div.textContent = "显示覆盖物文本"
410
- document.getElementById("hideOverlayText")?.addEventListener("click", () => {
411
- overlay.dispose()
412
- })
413
- })
414
- document.getElementById("clickOverlayText")?.addEventListener('click', () => {
415
- bmap.context.addEventListener('graphic-click', ({ graphics, position }) => {
416
- console.log(graphics, position)
417
- if (position) {
418
- const overlay = new Overlay(bmap.context)
419
- overlay.position.copy(position)
420
- overlay.div.textContent = "点击显示覆盖物文本"
421
- }
422
- })
423
- })
424
- document.getElementById("overlayImage")?.addEventListener('click', () => {
425
- const overlay = new Overlay(bmap.context)
426
- overlay.bindElement(graphic)
427
- const img = document.createElement("img")
428
- img.src = "https://robot-vr-public.cdn.bcebos.com/navigation_images/8c591818844be70fd93bd5817c7d3d50.png"
429
- overlay.div.style.transform = 'translate3d(-50%, -50%, 0)'
430
- overlay.div.appendChild(img)
431
- })
432
- document.getElementById("heatmap")?.addEventListener('click', () => {
433
- bmap.addHeatmap({
434
- data: [
435
- { x: -100, y: 100, value: 1 },
436
- { x: 100, y: 100, value: 100 },
437
- { x: 100, y: -100, value: 50 },
438
- { x: -100, y: -100, value: 25 },
439
- ],
440
- max: 100,
441
- min: 1
442
- })
443
- })
444
- document.getElementById("measureDistance")?.addEventListener('click', async () => {
445
- bmap.context.currentFloor?.addGround(graphic)
446
- const distance = await bmap.measureDistance()
447
- console.log("测量距离是" + distance + "米")
448
- })
449
- document.getElementById("cancelMeasureDistance")?.addEventListener('click', async () => {
450
- bmap.cancelDistance()
451
- })
452
- document.getElementById("measureArea")?.addEventListener('click', async () => {
453
- bmap.context.currentFloor?.addGround(graphic)
454
- const distance = await bmap.measureArea()
455
- console.log("测量面积是" + distance + "平方米")
456
- })
457
- document.getElementById("cancelMeasureArea")?.addEventListener('click', async () => {
458
- bmap.cancelArea()
459
- })
460
-
461
- // TODO - 「<键」顺时针旋转,「>键」逆时针旋转
462
- // TODO - 配置坐标定点旋转快捷键的接口
463
- // - 选中某图元,可以当前图元为中心进行旋转
464
- // bmap.setRotateTarget(element: Object3D)
465
- // TODO 选中某图元,可以当前图元为中心进行2D/3D切换
466
- // bmap.setChangeTarget(element: Object3D)
467
- // TODO 居中视图
468
- // bmap.context.fitCameraToView()
469
- // TODO 修改poi的字体颜色和字体大小
470
- // poi.options.color = "#fff000"
471
- // poi.options.fontSize = 100
472
- // TODO 可以设置字体背景颜色、字体背景描边颜色
473
- // poi.options.textBackgroundColor = "#000fff"
474
- // poi.options.textBackgroundStrokeColor = "#000fff"
475
-
476
- // TODO 连线覆盖物
477
- // const overlay = new LinkOverlay(bmap.context)
478
- // overlay.position.copy(position)
479
- // overlay.div.appendChild()
480
- // TODO 弹窗覆盖物
481
- // const overlay = new ModalOverlay(bmap.context)
482
- // overlay.position.copy(position)
483
- // overlay.div.appendChild()
484
- // TODO 数据可视化图表
485
- // const overlay = new EchartsOverlay(bmap.context, width, height)
486
- // overlay.position.copy(position)
487
- // overlay.setEchartsOptions({...})
488
- // TODO 显示图层弹窗
489
- // bmap.showLayerPanel(bool)
490
- // bmap.switchLayer(layer)
491
- // TODO 显示比例尺
492
- // bmap.showScale(bool)
493
- // TODO 定位
494
- // const position = bmap.getCurrentPosition()
495
- // TODO 路线规划
496
- // const route = bmap.getRoute(start, end)
497
- // TODO 切换楼层
498
- // bmap.switchFloor("B1")
499
- // TODO 加载地图
500
- // await bmap.load({ project, phase, building, floor });
501
- // TODO 资源数据渲染地图的调用
502
- // 传入资源图层类型ID,向后台请求数据,铺位:10001, 库房:10002,广告位:10003
503
- // showResourceLayerByLayerType
504
- // TODO 加载主题
505
- /**
506
- * interface Theme {
507
- id: number, // 主题样式
508
- globalThemeConfig: {
509
- lightConfig: {
510
- hemisphereLight: [0xffffff, 0xeeeeee, 1], // 半球光
511
- ambientLight: [0xffffff] // 环境光
512
- },
513
- backgroundConfig: {
514
- fillColor: string, // 背景色
515
- fillOpacity: number, // 填充透明度
516
- },
517
- polygonStyleConfig: {
518
- strokeColor: string,
519
- strokeOpacity: number,
520
- fillColor: string,
521
- fillOpacity: number,
522
- selectedColor: string,
523
- },
524
- pointStyleConfig: {
525
- poiFontSize: number,
526
- poiFontColor: string,
527
- poiIconSize: number,
528
- },
529
- floorFillColor: string, // 地面颜色
530
- floorShadow: boolean, // 地面阴影
531
- },
532
- businessThemeConfig: [{
533
- rule: 'userData.category_name = "母婴"',
534
- polygonStyleConfig: {
535
- strokeColor: string | null,
536
- strokeOpacity: number | null,
537
- fillColor: string | null,
538
- fillOpacity: number | null,
539
- selectedColor: string | null,
540
- },
541
- pointStyleConfig: {
542
- poiFontSize: number | null,
543
- poiFontColor: string | null,
544
- poiIconSize: number | null,
545
- },
546
- }, {
547
- rule: 'layerType = "铺位"',
548
- polygonStyleConfig: {
549
- strokeColor: string | null,
550
- strokeOpacity: number | null,
551
- fillColor: string | null,
552
- fillOpacity: number | null,
553
- selectedColor: string | null,
554
- },
555
- pointStyleConfig: {
556
- poiFontSize: number | null,
557
- poiFontColor: string | null,
558
- poiIconSize: number | null,
559
- },
560
- }]
561
- }
562
-
563
- bmap.loadThemeById(themeid)
564
- */
565
- // bmap.loadThemeById(themeid)
1
+ import { BMap, Graphic, Overlay, SelectBox } from '../../src'
2
+ import Stats from 'three/examples/jsm/libs/stats.module.js'
3
+
4
+ // 创建性能监视器
5
+ let stats = new Stats()
6
+
7
+ // 设置监视器面板,传入面板id(0: fps, 1: ms, 2: mb)
8
+ stats.showPanel(0)
9
+
10
+ // 设置监视器位置
11
+ stats.dom.style.position = 'absolute'
12
+ stats.dom.style.left = '10vh'
13
+ stats.dom.style.top = '10vh'
14
+ stats.dom.style.zIndex = "100"
15
+
16
+ // 将监视器添加到页面中
17
+ document.body.appendChild(stats.dom)
18
+
19
+ function render() {
20
+ // 更新帧数
21
+ stats.update()
22
+ requestAnimationFrame(render)
23
+ }
24
+
25
+ render()
26
+
27
+ const bmap = new BMap(document.getElementById('app')!, {
28
+ apiInfo: {
29
+ headers: {
30
+ "Authorization": localStorage.getItem("Authorization_token") || "Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIzNzIwYjNhOGU3MGM0NGU3YTdkYzdiMTE4NDNhZjFhMyIsInN1YiI6IllVV0VJWEkiLCJpc3MiOiJtaXhjIiwiaWF0IjoxNzAwNzI2NTA4fQ.su7smca9cVeMQ9u-NyT_3NKa6kYfoLIGsOtNZLOnXXI"
31
+ }
32
+ },
33
+ resizeObserver: true
34
+ });
35
+
36
+ (async () => {
37
+ // 加载图元数据
38
+ await bmap.load({
39
+ brand: "crc",
40
+ project: "0202A501",
41
+ phase: "themixctd01",
42
+ building: "A",
43
+ floor: "L1",
44
+ ts: "2024-01-03",
45
+ resource_type_list: [1, 2, 3, 4, 6].join(",")
46
+ });
47
+ // 切换楼层
48
+ await bmap.switchFloor({
49
+ brand: "crc",
50
+ project: "0202A501",
51
+ phase: "themixctd01",
52
+ building: "A",
53
+ floor: "L1",
54
+ ts: "2024-01-03",
55
+ resource_type_list: [1, 2, 3, 4, 6].join(",")
56
+ })
57
+ bmap.changeMapType("3d")
58
+
59
+ const poi = bmap.createGraphicPoi(bmap.getGraphicByNodeId("3e72f56e")!, {
60
+ texts: [{ text: "文字" }],
61
+ icon: "https://robot-vr-public.cdn.bcebos.com/navigation_images/614c4cb0a949526cf91aa42f5e6cb2c9.svg",
62
+ icon_size: [14, 14],
63
+ // background: "#000000",
64
+ icon_border: { width: 2, color: "#000000" }
65
+ })
66
+ // poi!.options.background = "#000000"
67
+ bmap.context.addEventListener("select-graphic", (...args) => {
68
+ console.log(args)
69
+ })
70
+ // bmap.getGraphicByNodeId("700fae09")!.options.strokeWidth = 2;
71
+ // bmap.getGraphicByNodeId("b0846107")!.options.strokeWidth = 0.5;
72
+ // bmap.getGraphicByNodeId("654cf0a2")!.options.fillColor = '#45E583';
73
+ // bmap.getGraphicByNodeId("0b245fa9")!.options.fillColor = '#FFB166';
74
+ // bmap.getGraphicByNodeId("9cd3408c")!.options.fillColor = '#FF4D4D';
75
+ // bmap.getFloorAllGraphics().forEach(graphic => {
76
+ // if (graphic.options.userData.mark) {
77
+ // graphic.options.fillColor = '#F2F6FC'
78
+ // graphic.options.height = 0.1
79
+ // }
80
+ // })
81
+
82
+ // bmap.getGraphicByNodeId("996d97a6")!.options.stroke = false;
83
+ // bmap.getGraphicByNodeId("996d97a6")!.options.height = 0.001;
84
+ // bmap.getGraphicByNodeId("996d97a6")!.options.strokeColor = "#000000";
85
+ // bmap.getGraphicByNodeId("996d97a6")!.options.strokeOpacity = 1;
86
+
87
+ })();
88
+
89
+ const graphicId = "9338ca4b"
90
+
91
+ // 图元点击
92
+ bmap.context.addEventListener('graphic-click', (data) => {
93
+ console.log('graphic-click', data.graphics)
94
+ // const div = document.createElement("div")
95
+ // div.style.cssText = "position: fixed; top: 25%; left: 25%; bottom: 25%; right: 25%; background: red; z-index: 99;"
96
+ // div.addEventListener("click", () => {
97
+ // document.body.removeChild(div)
98
+ // })
99
+ // document.body.appendChild(div)
100
+ data.graphics[0] && bmap.translateElementToCenter(data.graphics[0], 200)
101
+ });
102
+
103
+ // 图元选中
104
+ bmap.context.addEventListener('select-graphic', (data) => {
105
+ console.log('select-graphic', data.graphics)
106
+ data.graphics.forEach(item => item.options.fillColor = '#ff0000')
107
+ });
108
+
109
+ // poi点击
110
+ bmap.context.addEventListener('poi-click', (data) => {
111
+ console.log('poi-click', data.pois)
112
+ bmap.translateElementToCenter(data.pois[0], 500)
113
+ });
114
+
115
+ (window as any).bmap = bmap;
116
+
117
+
118
+ /**
119
+ * 显示比例尺
120
+ */
121
+ const ratioDiv = document.createElement("div")
122
+ ratioDiv.style.cssText = "position: absolute; bottom: 10vh; left: 10vw; z-index: 2; background: blue; color: red;"
123
+ ratioDiv.textContent = "100M";
124
+ document.body.appendChild(ratioDiv)
125
+ bmap.context.addEventListener('change-ratio', ({ px }) => {
126
+ // px 一百米对应的像素点
127
+ let m = 100;
128
+ let scale = 1
129
+ // 让px保持在50-100中间的一个米的整数
130
+ if (px < 50) {
131
+ scale = Math.ceil(100 / px)
132
+ px *= scale
133
+ m *= scale
134
+ } else if (px > 100) {
135
+ scale = Math.floor(px / 100)
136
+ while (m % scale != 0) {
137
+ scale--;
138
+ }
139
+ px /= scale
140
+ m /= scale
141
+ }
142
+ ratioDiv.style.width = `${px}px`;
143
+ ratioDiv.textContent = `${m}米`
144
+ })
145
+
146
+ /**
147
+ * 按钮操作
148
+ */
149
+ // 修改容器大小
150
+ document.getElementById("changeContainerSize")?.addEventListener('click', () => {
151
+ // 获取legacyId 图元 的map
152
+ // const graphic = bmap.getGraphicByNodeId("45f9ff75")!
153
+ // const poi = bmap.createGraphicPoi(graphic, {
154
+ // texts: [
155
+ // { text: "店铺名称" }
156
+ // ]
157
+ // })
158
+ document.getElementById("app1")!.style.width = "500px"
159
+ })
160
+ // 添加poi
161
+ document.getElementById("createPoi")?.addEventListener('click', () => {
162
+ // 获取legacyId 图元 的map
163
+ // const graphic = bmap.getGraphicByNodeId("45f9ff75")!
164
+ // const poi = bmap.createGraphicPoi(graphic, {
165
+ // texts: [
166
+ // { text: "店铺名称" }
167
+ // ]
168
+ // })
169
+ const graphics: Graphic[] = bmap.getFloorAllGraphics()
170
+ // bmap.context.control.zoomSpeed = 2
171
+ graphics.forEach(graphic => {
172
+ // 在图元上添加poi
173
+ const poi = bmap.createGraphicPoi(graphic, {
174
+ texts: [{ text: "店铺名称", styles: { fontWeight: "bold" } }]
175
+ })
176
+ })
177
+ // return
178
+ // 监听放大缩小的变化
179
+ bmap.addEventListener("zoom-change", ({ basicZoom, cameraZoom }) => {
180
+ const zoomScale = cameraZoom / basicZoom
181
+ // console.log(zoomScale, basicZoom, cameraZoom)
182
+ bmap.getPois().forEach(poi => {
183
+ if (zoomScale > 2) {
184
+ poi!.options.texts = [
185
+ { text: "店铺名称" },
186
+ { text: "店铺名称" },
187
+ { text: "店铺名称" },
188
+ { text: "店铺名称" },
189
+ ]
190
+ } else if (zoomScale > 1.6) {
191
+ poi!.options.texts = [
192
+ { text: "店铺名称" },
193
+ { text: "店铺名称" },
194
+ { text: "店铺名称" },
195
+ ]
196
+ } else if (zoomScale > 1.3) {
197
+ poi!.options.texts = [
198
+ { text: "店铺名称" },
199
+ { text: "店铺名称" },
200
+ ]
201
+ } else {
202
+ poi!.options.texts = [
203
+ { text: "店铺名称" },
204
+ ]
205
+ }
206
+ })
207
+ })
208
+ })
209
+ // 删除poi
210
+ document.getElementById("removePoi")?.addEventListener('click', () => {
211
+ bmap.removePoiById(graphicId)
212
+ })
213
+ // 删除在创建
214
+ document.getElementById("deleteAnCreateGraphic")?.addEventListener('click', () => {
215
+ const graphic = bmap.getGraphicByNodeId(graphicId)!
216
+ console.log(graphic)
217
+ const options = graphic.options
218
+ bmap.deleteGraphic(graphic)
219
+ setTimeout(() => {
220
+ bmap.createGraphicByOptions(options)
221
+ }, 1000)
222
+ })
223
+ // 获取全部图元
224
+ document.getElementById("getAllGraphics")?.addEventListener('click', () => {
225
+ console.log(bmap.getFloorAllGraphics())
226
+ })
227
+ // 添加选中块儿
228
+ document.getElementById("addSelectBox")?.addEventListener('click', () => {
229
+ const selectBox = new SelectBox(bmap.context)
230
+ selectBox.selectGraphic(bmap.getGraphicByNodeId(graphicId)!)
231
+ setTimeout(() => {
232
+ selectBox.setEnable(false)
233
+ }, 1000)
234
+ })
235
+ // 切换楼层
236
+ document.getElementById("switchFloor")?.addEventListener('click', async () => {
237
+ await bmap.load({
238
+ brand: "crc",
239
+ project: "0202A501",
240
+ phase: "themixctd01",
241
+ building: "A",
242
+ floor: "L1",
243
+ ts: "2024-01-12",
244
+ resource_type_list: [1, 2, 3, 4, 6].join(",")
245
+
246
+ });
247
+ // 切换楼层
248
+ bmap.switchFloor({
249
+ brand: "crc",
250
+ project: "0202A501",
251
+ phase: "themixctd01",
252
+ building: "A",
253
+ floor: "L1",
254
+ ts: "2024-01-12",
255
+ resource_type_list: [1, 2, 3, 4, 6].join(",")
256
+ })
257
+ })
258
+ // hover显示覆盖物
259
+ document.getElementById("hoverShowOverlay")?.addEventListener('click', async () => {
260
+ const overlaysMap = new Map<Graphic, Overlay>()
261
+ const overlayState = new Map<Overlay, { graphicHover: boolean, divHover: boolean }>()
262
+ bmap.context.addEventListener("hover", ({ graphics }) => {
263
+ // console.log("hover", graphics)
264
+ // overlaysMap.forEach(item => item.dispose())
265
+ // graphics.forEach(graphic => {
266
+ // const overlay = new Overlay(bmap.context)
267
+ // overlay.bindElement(graphic)
268
+ // const div = document.createElement("div")
269
+ // div.style.cssText = "width: 100px; height: 100px; background: red;transform: translate(-50%, -100%);"
270
+ // div.textContent = "显示一段文本"
271
+ // })
272
+ // 没有hover的元素要删除
273
+ overlaysMap.forEach((overlay, graphic) => {
274
+ if (!graphics.includes(graphic)) {
275
+ // overlay.dispose();
276
+ // overlaysMap.delete(graphic)
277
+ overlayState.get(overlay)!.graphicHover = false
278
+ window.requestAnimationFrame(() => {
279
+ // 鼠标即不在div上也不再graphic上就销毁这个overlay
280
+ if (!overlayState.get(overlay)!.divHover) {
281
+ overlay.dispose();
282
+ overlaysMap.delete(graphic)
283
+ }
284
+ })
285
+ }
286
+ })
287
+ graphics.forEach(graphic => {
288
+ if (overlaysMap.has(graphic)) {
289
+ return
290
+ }
291
+ const overlay = new Overlay(bmap.context, { autoUpdate: false });
292
+ overlay.addEventListener("update-position", ({ x, y, height }) => {
293
+ console.log(x, y, height)
294
+ overlay.div.style.transform = `translate3d(calc(${x}px - 50%), calc(${-height+y}px - 100%), 0)`
295
+ })
296
+ overlay.bindElement(graphic)
297
+ const div = document.createElement("div")
298
+ // console.log(overlay)
299
+ div.style.cssText = "width: 100px; height: 100px; background: red;point-event: none; "
300
+ div.textContent = "显示一段文本"
301
+ overlay.div.addEventListener("mouseover", () => {
302
+ console.log("进入额")
303
+ overlayState.get(overlay)!.divHover = true
304
+ console.log(overlayState.get(overlay))
305
+ })
306
+ overlay.div.addEventListener("mouseout", () => {
307
+ console.log("移除了")
308
+ overlayState.get(overlay)!.divHover = false
309
+ if (!overlayState.get(overlay)!.graphicHover) {
310
+ overlay.dispose();
311
+ overlaysMap.delete(graphic)
312
+ }
313
+ })
314
+ overlay.div.appendChild(div)
315
+ overlaysMap.set(graphic, overlay)
316
+ overlayState.set(overlay, {graphicHover: true, divHover: false})
317
+ })
318
+ })
319
+ })
320
+ document.getElementById("changeGraphicColor")?.addEventListener('click', () => {
321
+ graphic.options.fillColor = "#000fff";
322
+ })
323
+ document.getElementById("changeGraphicOpacity")?.addEventListener('click', () => {
324
+ graphic.options.fillOpacity = 0.5;
325
+ })
326
+ document.getElementById("changeGraphicBorder")?.addEventListener('click', () => {
327
+ graphic.options.strokeColor = "#00ff00";
328
+ })
329
+ document.getElementById("changeGraphicBorderOpacity")?.addEventListener('click', () => {
330
+ graphic.options.strokeOpacity = 0.5;
331
+ })
332
+ document.getElementById("changeGraphicHighlight")?.addEventListener('click', () => {
333
+ // TODO 获取图源的资源id 在graphicLayer 和 poiLayer 中判断不是这些资源id的都改小透明度,是的透明度都设置成1
334
+ })
335
+ document.getElementById("changeGraphicAirHeight")?.addEventListener('click', () => {
336
+ graphic.options.airHeight = 10
337
+ // TODO 获取图源的资源id 然后获取poi 还需要修改对应poi的高度 airHeight + height
338
+ })
339
+ document.getElementById("changeGraphicHeight")?.addEventListener('click', () => {
340
+ graphic.options.height = 20
341
+ // TODO 获取图源的资源id 然后获取poi 还需要修改对应poi的高度 airHeight + height
342
+ })
343
+ document.getElementById("changeGraphicVisible")?.addEventListener('click', () => {
344
+ graphic.options.visible = false
345
+ })
346
+ document.getElementById("changePoiIcon")?.addEventListener('click', () => {
347
+ poi.options.icon = 'https://prod-deployment.oss-cn-hangzhou.aliyuncs.com/dd932d4d105e453ea93dd1787dcae6eb_icon-%E5%A4%A7%E5%B1%8F.svg'
348
+ })
349
+ document.getElementById("changePoiText")?.addEventListener('click', () => {
350
+ poi.options.text = '修改后文本'
351
+ })
352
+ document.getElementById("changePoiVisible")?.addEventListener('click', () => {
353
+ bmap.context.currentFloor?.poiLayer.removePoi(poi)
354
+ })
355
+ document.getElementById("changeLightColor")?.addEventListener('click', () => {
356
+ bmap.context.changeAmbientLightColor(0xcccccc)
357
+ })
358
+ // document.getElementById("changeShadowLightColor")?.addEventListener('click', () => {
359
+ // bmap.context.shadow.changeLightColor(0x111000)
360
+ // })
361
+ document.getElementById("openMouseDrag")?.addEventListener('click', () => {
362
+ bmap.context.control.enablePan = true
363
+ })
364
+ document.getElementById("closeMouseDrag")?.addEventListener('click', () => {
365
+ bmap.context.control.enablePan = false
366
+ })
367
+ document.getElementById("openMouseZoom")?.addEventListener('click', () => {
368
+ bmap.context.control.enableZoom = true
369
+ })
370
+ document.getElementById("closeMouseZoom")?.addEventListener('click', () => {
371
+ bmap.context.control.enableZoom = false
372
+ })
373
+ document.getElementById("reduceMap")?.addEventListener('click', () => {
374
+ bmap.reduceMap(0.5, 100)
375
+ })
376
+ document.getElementById("enlargeMap")?.addEventListener('click', () => {
377
+ bmap.enlargeMap(0.3, 0)
378
+ })
379
+ document.getElementById("centerView")?.addEventListener('click', () => {
380
+ bmap.resize()
381
+ bmap.resetView()
382
+ })
383
+ document.getElementById("centerGraphic")?.addEventListener('click', () => {
384
+ bmap.context.fitCameraToObject(graphic)
385
+ })
386
+ document.getElementById("change2d")?.addEventListener('click', () => {
387
+ bmap.changeMapType('2d')
388
+ })
389
+ document.getElementById("change3d")?.addEventListener('click', () => {
390
+ bmap.changeMapType('3d')
391
+ })
392
+ document.getElementById("configurePolarShortcutKeys")?.addEventListener('click', () => {
393
+ bmap.configurePolarShortcutKeys(['ControlLeft', 'MetaLeft', 'KeyC'])
394
+ })
395
+ document.getElementById("configureAzimuthShortcutKeys")?.addEventListener('click', () => {
396
+ bmap.configureAzimuthalShortcutKeys(['KeyV'])
397
+ })
398
+ document.getElementById("changeAzimuth")?.addEventListener('click', () => {
399
+ bmap.rotateMap()
400
+ })
401
+ const fn = (data) => {
402
+ console.log(data.graphics, data.pois)
403
+ }
404
+ document.getElementById("openHover")?.addEventListener('click', () => {
405
+ bmap.context.addEventListener("pointer-over", fn)
406
+ bmap.context.addEventListener("pointer-move", fn)
407
+ })
408
+ document.getElementById("closeHover")?.addEventListener('click', () => {
409
+ bmap.context.removeEventListener("pointer-over", fn)
410
+ bmap.context.removeEventListener("pointer-move", fn)
411
+ })
412
+ document.getElementById("mousePickup")?.addEventListener('click', () => {
413
+ // TODO
414
+ })
415
+ document.getElementById("mouseMulPickup")?.addEventListener('click', () => {
416
+ // TODO
417
+ })
418
+ document.getElementById("overlayText")?.addEventListener('click', () => {
419
+ const overlay = new Overlay(bmap.context)
420
+ overlay.bindElement(graphic)
421
+ overlay.div.textContent = "显示覆盖物文本"
422
+ document.getElementById("hideOverlayText")?.addEventListener("click", () => {
423
+ overlay.dispose()
424
+ })
425
+ })
426
+ document.getElementById("clickOverlayText")?.addEventListener('click', () => {
427
+ bmap.context.addEventListener('graphic-click', ({ graphics, position }) => {
428
+ console.log(graphics, position)
429
+ if (position) {
430
+ const overlay = new Overlay(bmap.context)
431
+ overlay.position.copy(position)
432
+ overlay.div.textContent = "点击显示覆盖物文本"
433
+ }
434
+ })
435
+ })
436
+ document.getElementById("overlayImage")?.addEventListener('click', () => {
437
+ const overlay = new Overlay(bmap.context)
438
+ overlay.bindElement(graphic)
439
+ const img = document.createElement("img")
440
+ img.src = "https://robot-vr-public.cdn.bcebos.com/navigation_images/8c591818844be70fd93bd5817c7d3d50.png"
441
+ overlay.div.style.transform = 'translate3d(-50%, -50%, 0)'
442
+ overlay.div.appendChild(img)
443
+ })
444
+ document.getElementById("heatmap")?.addEventListener('click', () => {
445
+ bmap.addHeatmap({
446
+ data: [
447
+ { x: -100, y: 100, value: 1 },
448
+ { x: 100, y: 100, value: 100 },
449
+ { x: 100, y: -100, value: 50 },
450
+ { x: -100, y: -100, value: 25 },
451
+ ],
452
+ max: 100,
453
+ min: 1
454
+ })
455
+ })
456
+ document.getElementById("measureDistance")?.addEventListener('click', async () => {
457
+ bmap.context.currentFloor?.addGround(graphic)
458
+ const distance = await bmap.measureDistance()
459
+ console.log("测量距离是" + distance + "米")
460
+ })
461
+ document.getElementById("cancelMeasureDistance")?.addEventListener('click', async () => {
462
+ bmap.cancelDistance()
463
+ })
464
+ document.getElementById("measureArea")?.addEventListener('click', async () => {
465
+ bmap.context.currentFloor?.addGround(graphic)
466
+ const distance = await bmap.measureArea()
467
+ console.log("测量面积是" + distance + "平方米")
468
+ })
469
+ document.getElementById("cancelMeasureArea")?.addEventListener('click', async () => {
470
+ bmap.cancelArea()
471
+ })
472
+
473
+ // TODO - 「<键」顺时针旋转,「>键」逆时针旋转
474
+ // TODO - 配置坐标定点旋转快捷键的接口
475
+ // - 选中某图元,可以当前图元为中心进行旋转
476
+ // bmap.setRotateTarget(element: Object3D)
477
+ // TODO 选中某图元,可以当前图元为中心进行2D/3D切换
478
+ // bmap.setChangeTarget(element: Object3D)
479
+ // TODO 居中视图
480
+ // bmap.context.fitCameraToView()
481
+ // TODO 修改poi的字体颜色和字体大小
482
+ // poi.options.color = "#fff000"
483
+ // poi.options.fontSize = 100
484
+ // TODO 可以设置字体背景颜色、字体背景描边颜色
485
+ // poi.options.textBackgroundColor = "#000fff"
486
+ // poi.options.textBackgroundStrokeColor = "#000fff"
487
+
488
+ // TODO 连线覆盖物
489
+ // const overlay = new LinkOverlay(bmap.context)
490
+ // overlay.position.copy(position)
491
+ // overlay.div.appendChild()
492
+ // TODO 弹窗覆盖物
493
+ // const overlay = new ModalOverlay(bmap.context)
494
+ // overlay.position.copy(position)
495
+ // overlay.div.appendChild()
496
+ // TODO 数据可视化图表
497
+ // const overlay = new EchartsOverlay(bmap.context, width, height)
498
+ // overlay.position.copy(position)
499
+ // overlay.setEchartsOptions({...})
500
+ // TODO 显示图层弹窗
501
+ // bmap.showLayerPanel(bool)
502
+ // bmap.switchLayer(layer)
503
+ // TODO 显示比例尺
504
+ // bmap.showScale(bool)
505
+ // TODO 定位
506
+ // const position = bmap.getCurrentPosition()
507
+ // TODO 路线规划
508
+ // const route = bmap.getRoute(start, end)
509
+ // TODO 切换楼层
510
+ // bmap.switchFloor("B1")
511
+ // TODO 加载地图
512
+ // await bmap.load({ project, phase, building, floor });
513
+ // TODO 资源数据渲染地图的调用
514
+ // 传入资源图层类型ID,向后台请求数据,铺位:10001, 库房:10002,广告位:10003
515
+ // showResourceLayerByLayerType
516
+ // TODO 加载主题
517
+ /**
518
+ * interface Theme {
519
+ id: number, // 主题样式
520
+ globalThemeConfig: {
521
+ lightConfig: {
522
+ hemisphereLight: [0xffffff, 0xeeeeee, 1], // 半球光
523
+ ambientLight: [0xffffff] // 环境光
524
+ },
525
+ backgroundConfig: {
526
+ fillColor: string, // 背景色
527
+ fillOpacity: number, // 填充透明度
528
+ },
529
+ polygonStyleConfig: {
530
+ strokeColor: string,
531
+ strokeOpacity: number,
532
+ fillColor: string,
533
+ fillOpacity: number,
534
+ selectedColor: string,
535
+ },
536
+ pointStyleConfig: {
537
+ poiFontSize: number,
538
+ poiFontColor: string,
539
+ poiIconSize: number,
540
+ },
541
+ floorFillColor: string, // 地面颜色
542
+ floorShadow: boolean, // 地面阴影
543
+ },
544
+ businessThemeConfig: [{
545
+ rule: 'userData.category_name = "母婴"',
546
+ polygonStyleConfig: {
547
+ strokeColor: string | null,
548
+ strokeOpacity: number | null,
549
+ fillColor: string | null,
550
+ fillOpacity: number | null,
551
+ selectedColor: string | null,
552
+ },
553
+ pointStyleConfig: {
554
+ poiFontSize: number | null,
555
+ poiFontColor: string | null,
556
+ poiIconSize: number | null,
557
+ },
558
+ }, {
559
+ rule: 'layerType = "铺位"',
560
+ polygonStyleConfig: {
561
+ strokeColor: string | null,
562
+ strokeOpacity: number | null,
563
+ fillColor: string | null,
564
+ fillOpacity: number | null,
565
+ selectedColor: string | null,
566
+ },
567
+ pointStyleConfig: {
568
+ poiFontSize: number | null,
569
+ poiFontColor: string | null,
570
+ poiIconSize: number | null,
571
+ },
572
+ }]
573
+ }
574
+
575
+ bmap.loadThemeById(themeid)
576
+ */
577
+ // bmap.loadThemeById(themeid)