@xingm/vmap-cesium-toolbar 0.0.1-beta.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.
package/README.md ADDED
@@ -0,0 +1,715 @@
1
+ # CesiumMapToolbar API 文档
2
+
3
+ ## 概述
4
+
5
+ 本文档详细介绍了 `vmap-cesium-tool` 项目中三个核心模块的API接口和使用方法。
6
+
7
+ ## 目录
8
+
9
+ - [CesiumMapHelper.ts](#cesiummaphelperts)
10
+ - [CesiumMapLoader.ts](#cesiummaploaderts)
11
+ - [CesiumMapToolbar.ts](#cesiummaptoolbarts)
12
+
13
+ ---
14
+
15
+ ## CesiumMapHelper.ts
16
+
17
+ ### 概述
18
+
19
+ Cesium绘图辅助工具类,提供绘制点、线、多边形、矩形、视锥体等功能,支持编辑和删除操作。
20
+
21
+ ### 类定义
22
+
23
+ ```typescript
24
+ class DrawHelper
25
+ ```
26
+
27
+ ### 构造函数
28
+
29
+ ```typescript
30
+ constructor(viewer: Cesium.Viewer)
31
+ ```
32
+
33
+ **参数:**
34
+
35
+ - `viewer` (Cesium.Viewer): Cesium Viewer 实例
36
+
37
+ **示例:**
38
+
39
+ ```typescript
40
+ import DrawHelper from './libs/CesiumMapHelper';
41
+
42
+ const drawHelper = new DrawHelper(viewer);
43
+ ```
44
+
45
+ ### 主要方法
46
+
47
+ #### 1. 绘制线条
48
+
49
+ ```typescript
50
+ startDrawingLine(): void
51
+ ```
52
+
53
+ 开始绘制线条模式。支持多点折线绘制。
54
+
55
+ **使用示例:**
56
+
57
+ ```typescript
58
+ drawHelper.startDrawingLine();
59
+ ```
60
+
61
+ #### 2. 绘制多边形
62
+
63
+ ```typescript
64
+ startDrawingPolygon(): void
65
+ ```
66
+
67
+ 开始绘制多边形模式。绘制带淡绿色填充的多边形区域。
68
+
69
+ **使用示例:**
70
+
71
+ ```typescript
72
+ drawHelper.startDrawingPolygon();
73
+ ```
74
+
75
+ #### 3. 绘制矩形
76
+
77
+ ```typescript
78
+ startDrawingRectangle(): void
79
+ ```
80
+
81
+ 开始绘制矩形模式。
82
+
83
+ **使用示例:**
84
+
85
+ ```typescript
86
+ drawHelper.startDrawingRectangle();
87
+ ```
88
+
89
+ #### 4. 绘制视锥体
90
+
91
+ ```typescript
92
+ drawFrustum(options?: FrustumOptions): void
93
+ ```
94
+
95
+ **参数:**
96
+
97
+ - `options` (FrustumOptions, 可选): 视锥体配置选项
98
+
99
+ **FrustumOptions 接口:**
100
+
101
+ ```typescript
102
+ interface FrustumOptions {
103
+ position?: Cartesian3; // 视锥体位置
104
+ orientation?: Quaternion; // 视锥体方向
105
+ fov?: number; // 视野角度 (1-179度)
106
+ aspectRatio?: number; // 宽高比
107
+ near?: number; // 近平面距离
108
+ far?: number; // 远平面距离
109
+ fillColor?: Color; // 填充颜色
110
+ outlineColor?: Color; // 轮廓颜色
111
+ onRightClick?: (position: Cartesian3) => void; // 右键点击回调
112
+ }
113
+ ```
114
+
115
+ **使用示例:**
116
+
117
+ ```typescript
118
+ drawHelper.drawFrustum({
119
+ fov: 60,
120
+ aspectRatio: 1.5,
121
+ near: 10,
122
+ far: 2000,
123
+ fillColor: Cesium.Color.GREEN.withAlpha(0.3),
124
+ outlineColor: Cesium.Color.WHITE,
125
+ onRightClick: (pos) => {
126
+ console.log('视锥体被右键点击:', pos);
127
+ }
128
+ });
129
+ ```
130
+
131
+ #### 5. 结束绘制
132
+
133
+ ```typescript
134
+ endDrawing(): void
135
+ ```
136
+
137
+ 结束当前绘制操作。
138
+
139
+ #### 6. 清除所有
140
+
141
+ ```typescript
142
+ clearAll(): void
143
+ ```
144
+
145
+ 清除所有已绘制的实体。
146
+
147
+ #### 7. 清除视锥体
148
+
149
+ ```typescript
150
+ clearFrustum(): void
151
+ ```
152
+
153
+ 清除所有视锥体相关图形。
154
+
155
+ #### 8. 删除指定实体
156
+
157
+ ```typescript
158
+ removeEntity(entity: Cesium.Entity): void
159
+ ```
160
+
161
+ **参数:**
162
+
163
+ - `entity` (Cesium.Entity): 要删除的实体
164
+
165
+ #### 9. 获取已完成实体
166
+
167
+ ```typescript
168
+ getFinishedEntities(): Cesium.Entity[]
169
+ ```
170
+
171
+ 返回所有已完成的绘制实体数组。
172
+
173
+ ### 事件回调
174
+
175
+ #### 设置开始绘制回调
176
+
177
+ ```typescript
178
+ onDrawStart(callback: () => void): void
179
+ ```
180
+
181
+ #### 设置结束绘制回调
182
+
183
+ ```typescript
184
+ onDrawEnd(callback: (entity: Cesium.Entity | null) => void): void
185
+ ```
186
+
187
+ #### 设置实体移除回调
188
+
189
+ ```typescript
190
+ onEntityRemoved(callback: (entity: Cesium.Entity) => void): void
191
+ ```
192
+
193
+ **使用示例:**
194
+
195
+ ```typescript
196
+ drawHelper.onDrawStart(() => {
197
+ console.log('开始绘制');
198
+ });
199
+
200
+ drawHelper.onDrawEnd((entity) => {
201
+ if (entity) {
202
+ console.log('绘制完成:', entity);
203
+ } else {
204
+ console.log('绘制被取消');
205
+ }
206
+ });
207
+
208
+ drawHelper.onEntityRemoved((entity) => {
209
+ console.log('实体被移除:', entity);
210
+ });
211
+ ```
212
+
213
+ ### 销毁资源
214
+
215
+ ```typescript
216
+ destroy(): void
217
+ ```
218
+
219
+ 销毁工具实例,清理所有事件监听器和资源。
220
+
221
+ ---
222
+
223
+ ## CesiumMapLoader.ts
224
+
225
+ ### 概述
226
+
227
+ Cesium地图加载器,提供地图初始化、地形配置、图层管理等功能。
228
+
229
+ ### 主要函数
230
+
231
+ #### 1. 初始化Cesium地图
232
+
233
+ ```typescript
234
+ async function initCesium(
235
+ containerId: string,
236
+ options: InitOptions,
237
+ mapCenter?: MapCenter
238
+ ): Promise<{ viewer: CesiumViewer; initialCenter: MapCenter }>
239
+ ```
240
+
241
+ **参数:**
242
+
243
+ - `containerId` (string): 地图容器DOM元素ID
244
+ - `options` (InitOptions): 地图初始化配置
245
+ - `mapCenter` (MapCenter, 可选): 地图中心点配置
246
+
247
+ **InitOptions 接口:**
248
+
249
+ ```typescript
250
+ interface InitOptions {
251
+ terrain?: Terrain; // 地形配置
252
+ terrainProvider?: TerrainProvider; // 地形提供者
253
+ mapType?: string; // 地图类型
254
+ imageryProvider?: UrlTemplateImageryProvider; // 自定义影像图层
255
+ imageryLayers?: ImageryLayerCollection; // 自定义影像图层集合
256
+ terrainShadows?: ShadowMode; // 地形阴影
257
+ contextOptions?: ContextOptions; // 上下文选项
258
+ scene3DOnly?: boolean; // 是否只使用3D场景
259
+ selectionIndicator?: boolean; // 选择指示器
260
+ navigationHelpButton?: boolean; // 导航帮助按钮
261
+ fullscreenButton?: boolean; // 全屏按钮
262
+ geocoder?: boolean; // 地理编码器
263
+ homeButton?: boolean; // 主页按钮
264
+ infoBox?: boolean; // 信息框
265
+ sceneModePicker?: boolean; // 场景模式选择器
266
+ timeline?: boolean; // 时间轴
267
+ animation?: boolean; // 动画
268
+ baseLayerPicker?: boolean; // 基础图层选择器
269
+ navigationInstructionsInitiallyVisible?: boolean; // 导航指令初始可见
270
+ clock?: Clock; // 时钟
271
+ sceneMode?: SceneMode; // 场景模式
272
+ screenSpaceEventHandler?: ScreenSpaceEventHandler; // 屏幕空间事件处理器
273
+ useDefaultRenderLoop?: boolean; // 使用默认渲染循环
274
+ targetFrameRate?: number; // 目标帧率
275
+ showRenderLoopErrors?: boolean; // 显示渲染循环错误
276
+ automaticallyTrackDataSourceClocks?: boolean; // 自动跟踪数据源时钟
277
+ dataSources?: DataSourceCollection; // 数据源集合
278
+ creationTime?: number; // 创建时间
279
+ useBrowserRecommendedResolution?: boolean; // 使用浏览器推荐分辨率
280
+ resolutionScale?: number; // 分辨率缩放
281
+ orderIndependentTransparency?: boolean; // 无序透明度
282
+ shadows?: boolean; // 阴影
283
+ terrainExaggeration?: number; // 地形夸张系数
284
+ maximumScreenSpaceError?: number; // 最大屏幕空间误差
285
+ maximumNumberOfLoadedTiles?: number; // 最大加载瓦片数量
286
+ }
287
+ ```
288
+
289
+ **MapCenter 接口:**
290
+
291
+ ```typescript
292
+ interface MapCenter {
293
+ latitude: number; // 纬度
294
+ longitude: number; // 经度
295
+ height: number; // 高度
296
+ pitch?: number; // 俯仰角
297
+ heading?: number; // 航向角
298
+ }
299
+ ```
300
+
301
+ **返回值:**
302
+
303
+ - `viewer`: Cesium Viewer 实例
304
+ - `initialCenter`: 初始中心点配置
305
+
306
+ **使用示例:**
307
+
308
+ ```typescript
309
+ import { initCesium } from './libs/CesiumMapLoader';
310
+
311
+ const { viewer, initialCenter } = await initCesium("cesiumContainer", {
312
+ terrain: Cesium.Terrain.fromWorldTerrain(),
313
+ animation: false,
314
+ baseLayerPicker: false,
315
+ fullscreenButton: false,
316
+ geocoder: false,
317
+ homeButton: false,
318
+ infoBox: false,
319
+ sceneModePicker: false,
320
+ selectionIndicator: false,
321
+ timeline: false,
322
+ navigationHelpButton: false,
323
+ scene3DOnly: false,
324
+ }, {
325
+ longitude: 120.2052342,
326
+ latitude: 30.2489634,
327
+ height: 1000,
328
+ pitch: -60,
329
+ heading: 0
330
+ });
331
+ ```
332
+
333
+ #### 2. 创建天地图
334
+
335
+ ```typescript
336
+ function createTianDiMap(): TianDiMap
337
+ ```
338
+
339
+ 创建天地图配置对象。
340
+
341
+ **返回值:**
342
+
343
+ ```typescript
344
+ interface TianDiMap {
345
+ url: string; // 瓦片URL模板
346
+ subdomains: string[]; // 子域名数组
347
+ minimumLevel: number; // 最小缩放级别
348
+ maximumLevel: number; // 最大缩放级别
349
+ credit: string; // 版权信息
350
+ }
351
+ ```
352
+
353
+ #### 3. 创建高德地图
354
+
355
+ ```typescript
356
+ function createGaoDeMap(): UrlTemplateImageryProvider
357
+ ```
358
+
359
+ 创建高德地图影像提供者。
360
+
361
+ ---
362
+
363
+ ## CesiumMapToolbar.ts
364
+
365
+ ### 概述
366
+
367
+ Cesium地图工具栏类,提供搜索、测量、2D/3D切换、图层切换、定位、缩放、全屏等功能。
368
+
369
+ ### 类定义
370
+
371
+ ```typescript
372
+ class CesiumMapToolbar
373
+ ```
374
+
375
+ ### 构造函数
376
+
377
+ ```typescript
378
+ constructor(
379
+ viewer: Viewer,
380
+ container: HTMLElement,
381
+ config?: ToolbarConfig,
382
+ callbacks?: {
383
+ search?: SearchCallback;
384
+ measurement?: MeasurementCallback;
385
+ zoom?: ZoomCallback;
386
+ },
387
+ initialCenter?: { longitude: number; latitude: number; height: number }
388
+ )
389
+ ```
390
+
391
+ **参数:**
392
+
393
+ - `viewer` (Viewer): Cesium Viewer 实例
394
+ - `container` (HTMLElement): 地图容器元素
395
+ - `config` (ToolbarConfig, 可选): 工具栏配置
396
+ - `callbacks` (对象, 可选): 回调函数配置
397
+ - `initialCenter` (对象, 可选): 初始中心点
398
+
399
+ ### 配置接口
400
+
401
+ #### ToolbarConfig
402
+
403
+ ```typescript
404
+ interface ToolbarConfig {
405
+ position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
406
+ buttonSize?: number; // 按钮大小 (默认40px)
407
+ buttonSpacing?: number; // 按钮间距 (默认8px)
408
+ backgroundColor?: string; // 背景色
409
+ borderColor?: string; // 边框色
410
+ borderRadius?: number; // 圆角半径
411
+ borderWidth?: number; // 边框宽度
412
+ boxShadow?: string; // 阴影
413
+ zIndex?: number; // 层级
414
+ }
415
+ ```
416
+
417
+ #### SearchCallback
418
+
419
+ ```typescript
420
+ interface SearchCallback {
421
+ onSearch?: (query: string) => Promise<SearchResult[]>;
422
+ onSelect?: (result: SearchResult) => void;
423
+ }
424
+ ```
425
+
426
+ #### MeasurementCallback
427
+
428
+ ```typescript
429
+ interface MeasurementCallback {
430
+ onDistanceComplete?: (positions: Cartesian3[], distance: number) => void;
431
+ onAreaComplete?: (positions: Cartesian3[], area: number) => void;
432
+ onClear?: () => void;
433
+ }
434
+ ```
435
+
436
+ #### ZoomCallback
437
+
438
+ ```typescript
439
+ interface ZoomCallback {
440
+ onZoomIn?: (beforeLevel: number, afterLevel: number) => void;
441
+ onZoomOut?: (beforeLevel: number, afterLevel: number) => void;
442
+ }
443
+ ```
444
+
445
+ #### SearchResult
446
+
447
+ ```typescript
448
+ interface SearchResult {
449
+ name: string; // 地点名称
450
+ address: string; // 详细地址
451
+ longitude: number; // 经度
452
+ latitude: number; // 纬度
453
+ height?: number; // 高度
454
+ }
455
+ ```
456
+
457
+ ### 主要方法
458
+
459
+ #### 1. 设置初始中心点
460
+
461
+ ```typescript
462
+ setInitialCenter(center: { longitude: number; latitude: number; height: number }): void
463
+ ```
464
+
465
+ #### 2. 获取初始中心点
466
+
467
+ ```typescript
468
+ getInitialCenter(): { longitude: number; latitude: number; height: number } | undefined
469
+ ```
470
+
471
+ #### 3. 复位到初始位置
472
+
473
+ ```typescript
474
+ resetToInitialLocation(): void
475
+ ```
476
+
477
+ #### 4. 销毁工具栏
478
+
479
+ ```typescript
480
+ destroy(): void
481
+ ```
482
+
483
+ ### 工具栏按钮功能
484
+
485
+ 工具栏包含以下8个按钮:
486
+
487
+ 1. **🔍 搜索按钮**
488
+ - 鼠标悬停显示搜索框
489
+ - 支持地址搜索
490
+ - 点击搜索结果自动定位
491
+
492
+ 2. **📏 测量按钮**
493
+ - 悬停显示:测面积、测距、清除
494
+ - 测距:支持多点折线,显示每段距离和总距离
495
+ - 测面积:绘制淡绿色填充多边形,显示面积
496
+
497
+ 3. **2D/3D 切换按钮**
498
+ - 一键切换2D和3D视角
499
+ - 按钮文本自动更新
500
+
501
+ 4. **📚 图层切换按钮**
502
+ - 悬停显示地图类型选择菜单
503
+ - 支持:普通地图、三维地图、影像图、地形图
504
+
505
+ 5. **🎯 定位按钮**
506
+ - 复位到地图初始中心点
507
+ - 平滑飞行动画
508
+
509
+ 6. **🔍+ 放大按钮**
510
+ - 地图放大
511
+ - 支持缩放回调
512
+
513
+ 7. **🔍- 缩小按钮**
514
+ - 地图缩小
515
+ - 支持缩放回调
516
+
517
+ 8. **⛶ 全屏按钮**
518
+ - 进入/退出全屏模式
519
+ - 自动检测全屏状态
520
+
521
+ ### 使用示例
522
+
523
+ #### 基本使用
524
+
525
+ ```typescript
526
+ import { CesiumMapToolbar } from './libs/CesiumMapToolbar';
527
+
528
+ const toolbar = new CesiumMapToolbar(
529
+ viewer,
530
+ container,
531
+ {
532
+ position: 'bottom-right',
533
+ buttonSize: 45,
534
+ buttonSpacing: 10,
535
+ backgroundColor: 'rgba(255, 255, 255, 0.95)',
536
+ borderColor: '#4285f4',
537
+ borderRadius: 8,
538
+ zIndex: 1000
539
+ },
540
+ {
541
+ search: {
542
+ onSearch: async (query: string) => {
543
+ // 实现搜索逻辑
544
+ return await searchAPI(query);
545
+ },
546
+ onSelect: (result) => {
547
+ console.log('选择了:', result);
548
+ }
549
+ },
550
+ measurement: {
551
+ onDistanceComplete: (positions, distance) => {
552
+ console.log('测距完成:', distance);
553
+ },
554
+ onAreaComplete: (positions, area) => {
555
+ console.log('测面积完成:', area);
556
+ },
557
+ onClear: () => {
558
+ console.log('清除测量');
559
+ }
560
+ },
561
+ zoom: {
562
+ onZoomIn: (before, after) => {
563
+ console.log('放大:', before, '->', after);
564
+ },
565
+ onZoomOut: (before, after) => {
566
+ console.log('缩小:', before, '->', after);
567
+ }
568
+ }
569
+ },
570
+ {
571
+ longitude: 120.2052342,
572
+ latitude: 30.2489634,
573
+ height: 1000
574
+ }
575
+ );
576
+ ```
577
+
578
+ #### 动态设置初始中心点
579
+
580
+ ```typescript
581
+ toolbar.setInitialCenter({
582
+ longitude: 116.3974,
583
+ latitude: 39.9093,
584
+ height: 1000
585
+ });
586
+ ```
587
+
588
+ #### 复位到初始位置
589
+
590
+ ```typescript
591
+ toolbar.resetToInitialLocation();
592
+ ```
593
+
594
+ ### 地图类型配置
595
+
596
+ 工具栏内置支持以下地图类型:
597
+
598
+ 1. **天地图-普通** (normal)
599
+ 2. **天地图-三维** (3d)
600
+ 3. **天地图-影像** (imagery) - 默认
601
+ 4. **天地图-地形** (terrain)
602
+
603
+ ### 样式定制
604
+
605
+ 可以通过CSS覆盖工具栏样式:
606
+
607
+ ```css
608
+ /* 自定义工具栏样式 */
609
+ .cesium-map-toolbar {
610
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
611
+ border: 2px solid #fff !important;
612
+ }
613
+
614
+ .cesium-toolbar-button {
615
+ background: rgba(255, 255, 255, 0.2) !important;
616
+ color: #fff !important;
617
+ border: 1px solid rgba(255, 255, 255, 0.3) !important;
618
+ }
619
+
620
+ .cesium-toolbar-button:hover {
621
+ background: rgba(255, 255, 255, 0.3) !important;
622
+ transform: scale(1.1) !important;
623
+ }
624
+ ```
625
+
626
+ ### 注意事项
627
+
628
+ 1. **搜索功能**:需要实现 `onSearch` 回调函数,可以集成真实的地理编码API
629
+ 2. **地图类型**:天地图需要有效的token,请替换示例中的 `your_token`
630
+ 3. **全屏功能**:需要用户手势触发,某些浏览器可能有限制
631
+ 4. **测量精度**:面积计算使用球面几何,适合大范围测量
632
+ 5. **内存管理**:记得在组件销毁时调用 `destroy()` 方法
633
+
634
+ ---
635
+
636
+ ## 完整使用示例
637
+
638
+ ```typescript
639
+ import { initCesium } from './libs/CesiumMapLoader';
640
+ import { CesiumMapToolbar } from './libs/CesiumMapToolbar';
641
+ import DrawHelper from './libs/CesiumMapHelper';
642
+
643
+ // 初始化地图
644
+ const { viewer, initialCenter } = await initCesium("cesiumContainer", {
645
+ terrain: Cesium.Terrain.fromWorldTerrain(),
646
+ animation: false,
647
+ baseLayerPicker: false,
648
+ fullscreenButton: false,
649
+ geocoder: false,
650
+ homeButton: false,
651
+ infoBox: false,
652
+ sceneModePicker: false,
653
+ selectionIndicator: false,
654
+ timeline: false,
655
+ navigationHelpButton: false,
656
+ scene3DOnly: false,
657
+ });
658
+
659
+ // 创建绘图助手
660
+ const drawHelper = new DrawHelper(viewer);
661
+ drawHelper.onDrawEnd((entity) => {
662
+ console.log('绘制完成:', entity);
663
+ });
664
+
665
+ // 创建工具栏
666
+ const container = document.getElementById("cesiumContainer");
667
+ const toolbar = new CesiumMapToolbar(
668
+ viewer,
669
+ container,
670
+ {
671
+ position: 'bottom-right',
672
+ buttonSize: 45,
673
+ backgroundColor: 'rgba(255, 255, 255, 0.95)',
674
+ },
675
+ {
676
+ search: {
677
+ onSearch: async (query) => {
678
+ // 实现搜索逻辑
679
+ return [];
680
+ },
681
+ onSelect: (result) => {
682
+ console.log('定位到:', result.name);
683
+ }
684
+ },
685
+ measurement: {
686
+ onDistanceComplete: (positions, distance) => {
687
+ console.log(`测距完成,总距离: ${distance.toFixed(2)} 米`);
688
+ },
689
+ onAreaComplete: (positions, area) => {
690
+ console.log(`测面积完成,面积: ${area.toFixed(2)} 平方公里`);
691
+ }
692
+ }
693
+ },
694
+ initialCenter
695
+ );
696
+
697
+ // 清理资源
698
+ function cleanup() {
699
+ toolbar.destroy();
700
+ drawHelper.destroy();
701
+ }
702
+ ```
703
+
704
+ ---
705
+
706
+ ## 更新日志
707
+
708
+ ### v1.0.0
709
+
710
+ - 初始版本发布
711
+ - 支持完整的绘图功能(点、线、多边形、矩形、视锥体)
712
+ - 支持完整的工具栏功能(搜索、测量、2D/3D切换、图层切换、定位、缩放、全屏)
713
+ - 完整的回调系统和事件处理
714
+ - 可配置的样式选项
715
+ - 完善的错误处理和资源管理