@xingm/vmap-cesium-toolbar 0.0.2 → 0.0.3

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.
@@ -83,7 +83,16 @@ export default class CesiumHeatmapLayer {
83
83
  private handleWorkerFault;
84
84
  constructor(viewer: Cesium.Viewer, options?: HeatmapOptions);
85
85
  private parseColorToRGBA;
86
+ /**
87
+ * 获取离散桶的索引
88
+ * @param value - 需要确定桶索引的数值
89
+ * @return 返回对应的桶索引,如果阈值无效则返回0
90
+ */
86
91
  private getDiscreteBucketIndex;
92
+ /**
93
+ * 渲染离散热力图
94
+ * @param points 热力点数据数组
95
+ */
87
96
  private renderDiscrete;
88
97
  /**
89
98
  * 设置/替换热力图数据(度为单位)
@@ -74,11 +74,19 @@ declare class DrawHelper {
74
74
  */
75
75
  constructor(viewer: Cesium.Viewer);
76
76
  private dumpPotentialClampingEntities;
77
+ /**
78
+ * 对新创建的实体进行净化处理,确保其符合渲染要求
79
+ * @param entity - 需要净化的 Cesium.Entity 对象
80
+ * @param tag - 用于标识来源的标签,会在控制台警告时显示
81
+ */
77
82
  private sanitizeNewEntity;
78
83
  private installEntitiesAddHook;
79
84
  private uninstallEntitiesAddHook;
85
+ /**
86
+ * 安装地面几何更新器调试钩子
87
+ * 此方法用于在Cesium GroundGeometryUpdater中安装一个调试钩子,用于捕获和处理渲染错误
88
+ */
80
89
  private installGroundGeometryUpdaterDebugHook;
81
- private logRenderErrorDetails;
82
90
  /**
83
91
  * 外部调用:在场景模式(2D/3D)切换后,更新偏移高度并重算已完成实体
84
92
  */
@@ -91,6 +99,11 @@ declare class DrawHelper {
91
99
  * 计算提示文本(随绘制模式 + 点数量变化)
92
100
  */
93
101
  private getDrawHintText;
102
+ /**
103
+ * 设置绘制提示覆盖文本及其持续时间
104
+ * @param text 要显示的提示文本
105
+ * @param ms 提示文本显示的持续时间(毫秒),默认为1200毫秒
106
+ */
94
107
  private setDrawHintOverride;
95
108
  /**
96
109
  * 将提示位置转换为显示位置(按当前模式做轻微抬高,避免被地形遮挡)
@@ -1,4 +1,5 @@
1
1
  import { Viewer, Entity } from '../../node_modules/cesium';
2
+ import { DrawEntity } from './drawHelper';
2
3
  import { OverlayEntity, OverlayPosition } from './overlay/types';
3
4
  import { MapMarker, MarkerOptions } from './overlay/MapMarker';
4
5
  import { MapLabel, LabelOptions } from './overlay/MapLabel';
@@ -10,6 +11,19 @@ import { MapPolygon, PolygonOptions } from './overlay/MapPolygon';
10
11
  import { MapRectangle, RectangleOptions } from './overlay/MapRectangle';
11
12
  import { MapCircle, CircleOptions } from './overlay/MapCircle';
12
13
  import { MapRing, RingOptions } from './overlay/MapRing';
14
+ export interface CesiumOverlayServiceOptions {
15
+ /**
16
+ * 是否启用实体 hover 处理器(MOUSE_MOVE 下会执行 pick/drillPick 并触发 hover 高亮)。
17
+ * 大屏/高负载场景可考虑关闭以规避 Cesium 在 primitive 重建窗口期的边界问题。
18
+ * @default true
19
+ */
20
+ enableHoverHandler?: boolean;
21
+ /**
22
+ * 覆盖物处于编辑模式时:一次拖拽结束(LEFT_UP)且几何发生变化会触发。
23
+ * 参数为“已回写后的覆盖物 entity”。
24
+ */
25
+ onOverlayEditChange?: (entity: DrawEntity & OverlayEntity) => void;
26
+ }
13
27
  /**
14
28
  * Cesium 覆盖物服务类
15
29
  * 统一管理各种覆盖物工具类
@@ -19,16 +33,49 @@ export declare class CesiumOverlayService {
19
33
  private entities;
20
34
  private overlayMap;
21
35
  private infoWindowContainer;
36
+ /** 构造参数(用于开关 hover handler 等运行时策略) */
37
+ private readonly options;
38
+ private overlayEditor;
22
39
  private lastHoverTargets;
23
40
  private hoverPickRAF;
24
41
  private hoverPickPos;
42
+ private overlayMutationRevision;
43
+ private hoverSuspendUntil;
44
+ private lastHoverPickTime;
45
+ private lastHoverPickPos;
46
+ private bulkUpdateDepth;
25
47
  private static readonly DEFAULT_HIGHLIGHT_COLOR;
26
48
  private static readonly DEFAULT_HIGHLIGHT_FILL_ALPHA;
49
+ private static readonly DEFAULT_HIGHLIGHT_GLOW_POWER;
50
+ private static readonly GLOW_OUTLINE_ROOT_ID_PROP;
51
+ private static readonly HOVER_PICK_MIN_INTERVAL_MS;
52
+ private static readonly HOVER_PICK_MIN_MOVE_PX;
53
+ private static readonly HOVER_SUSPEND_AFTER_MUTATION_MS;
54
+ private markOverlayMutated;
55
+ /**
56
+ * 显式开始一次批量更新:在 begin/end 期间暂停 hover pick。
57
+ * 建议 websocket 批量 add/remove 覆盖物时包裹使用,降低 Cesium GroundPrimitive 异步重建窗口期的 pick/update 压力。
58
+ */
59
+ beginBulkUpdate(): void;
60
+ /**
61
+ * 结束一次批量更新。
62
+ */
63
+ endBulkUpdate(): void;
64
+ /**
65
+ * 批量更新包裹器(自动 begin/end)。
66
+ */
67
+ bulkUpdate<T>(fn: () => T): T;
27
68
  /**
28
69
  * Primitive 模式下,GeometryInstance.id 会是字符串(structured-cloneable),
29
70
  * 需要映射回 overlayMap 内的根覆盖物 id。
30
71
  */
31
72
  private normalizeOverlayPickId;
73
+ private getEntityPropertyString;
74
+ private mapGlowOutlineEntityToRoot;
75
+ private getClosedPositions;
76
+ private generateEllipseOutlinePositions;
77
+ private ensureGlowOutline;
78
+ private removeGlowOutline;
32
79
  private resolveOverlayByPickId;
33
80
  private resolvePickedOverlayEntity;
34
81
  readonly marker: MapMarker;
@@ -41,7 +88,7 @@ export declare class CesiumOverlayService {
41
88
  readonly rectangle: MapRectangle;
42
89
  readonly circle: MapCircle;
43
90
  readonly ring: MapRing;
44
- constructor(viewer: Viewer);
91
+ constructor(viewer: Viewer, options?: CesiumOverlayServiceOptions);
45
92
  /**
46
93
  * Cesium 默认可能无法 pick 到半透明覆盖物(例如 alpha < 1 的填充面)。
47
94
  * 开启 pickTranslucentDepth 后,hover/click 才能稳定命中半透明面。
@@ -70,6 +117,21 @@ export declare class CesiumOverlayService {
70
117
  * 设置实体点击处理器
71
118
  */
72
119
  private setupEntityClickHandler;
120
+ /**
121
+ * 开启/关闭覆盖物编辑模式。
122
+ * - 开启后:点击覆盖物会进入编辑,并显示可拖拽控制点。
123
+ * - 关闭后:退出编辑并移除控制点。
124
+ */
125
+ setOverlayEditMode(enabled: boolean): void;
126
+ /** 当前是否处于覆盖物编辑模式(全局开关) */
127
+ getOverlayEditModeEnabled(): boolean;
128
+ /** 停止当前正在编辑的覆盖物(不会关闭全局编辑模式) */
129
+ stopOverlayEdit(): void;
130
+ /**
131
+ * 主动开始编辑某个覆盖物。
132
+ * @returns true 表示成功进入编辑
133
+ */
134
+ startOverlayEdit(entityOrId: (DrawEntity & OverlayEntity) | string): boolean;
73
135
  /**
74
136
  * 设置实体 hover 高亮处理器(鼠标移入高亮,移出取消)
75
137
  */
@@ -0,0 +1,73 @@
1
+ import { Viewer } from '../../node_modules/cesium';
2
+ import * as Cesium from 'cesium';
3
+ export interface ClusterPoint {
4
+ /** 业务 id(可选,建议传以便稳定更新) */
5
+ id?: string;
6
+ /** 经度(度) */
7
+ lon: number;
8
+ /** 纬度(度) */
9
+ lat: number;
10
+ /** 高度(米,默认 0) */
11
+ height?: number;
12
+ /** 可选:权重/热度值(暂未参与聚类,仅透传给回调) */
13
+ value?: number;
14
+ /** 任意业务属性 */
15
+ properties?: Record<string, unknown>;
16
+ }
17
+ export interface ClusterStyleStep {
18
+ /** 当 count >= minCount 时命中该样式(按 minCount 从大到小匹配更直观) */
19
+ minCount: number;
20
+ color: Cesium.Color | string;
21
+ /** 聚合点圆点大小(像素),不填则使用 options.clusterPixelSize */
22
+ pixelSize?: number;
23
+ }
24
+ export interface PointClusterLayerOptions {
25
+ /** 图层 id(用于 Cesium.DataSourceCollection 里区分) */
26
+ id?: string;
27
+ /** 单点渲染:像素大小 */
28
+ pointPixelSize?: number;
29
+ /** 单点渲染:颜色 */
30
+ pointColor?: Cesium.Color | string;
31
+ /** 单点渲染:是否贴地(height=0 时等价贴地效果更明显) */
32
+ clampToGround?: boolean;
33
+ /** 聚类开关(默认 true) */
34
+ clusteringEnabled?: boolean;
35
+ /** 聚类像素范围(越大越容易聚合),默认 50 */
36
+ pixelRange?: number;
37
+ /** 最小聚类数量,默认 2 */
38
+ minimumClusterSize?: number;
39
+ /** 聚合点默认大小(像素) */
40
+ clusterPixelSize?: number;
41
+ /** 聚合点样式分段:用 count 决定颜色/大小 */
42
+ clusterStyleSteps?: ClusterStyleStep[];
43
+ /** 点击聚合点回调:返回该聚合内的原始点 */
44
+ onClusterClick?: (points: ClusterPoint[], ctx: {
45
+ screenPosition: Cesium.Cartesian2;
46
+ worldPosition?: Cesium.Cartesian3;
47
+ }) => void;
48
+ /** 点击单点回调 */
49
+ onPointClick?: (point: ClusterPoint, ctx: {
50
+ screenPosition: Cesium.Cartesian2;
51
+ worldPosition?: Cesium.Cartesian3;
52
+ }) => void;
53
+ /** entity id 前缀(用于避免与外部实体冲突) */
54
+ idPrefix?: string;
55
+ }
56
+ export default class CesiumPointClusterLayer {
57
+ private viewer;
58
+ private readonly options;
59
+ private dataSource;
60
+ private entityIdToPoint;
61
+ private clickHandler;
62
+ private readonly layerId;
63
+ constructor(viewer: Viewer, options?: PointClusterLayerOptions);
64
+ /** 设置/替换点数据(经纬度单位:度) */
65
+ setData(points: ClusterPoint[]): void;
66
+ setVisible(visible: boolean): void;
67
+ setClusteringEnabled(enabled: boolean): void;
68
+ destroy(): void;
69
+ private applyClusterStyle;
70
+ private pickStyle;
71
+ private installClickHandler;
72
+ }
73
+ export { CesiumPointClusterLayer };
@@ -59,6 +59,8 @@ export interface DrawOptions {
59
59
  };
60
60
  /** 是否显示面积标签(多边形/矩形)。默认 true */
61
61
  showAreaLabel?: boolean;
62
+ /** 是否显示长度标签(线条)。默认 true */
63
+ showDistanceLabel?: boolean;
62
64
  /**
63
65
  * 是否启用多边形自相交校验。
64
66
  * - false/未设置:默认允许交叉(不做校验)
@@ -9,6 +9,10 @@ export declare class DrawLine extends BaseDraw {
9
9
  private currentTotalLabel;
10
10
  private currentLinePositions;
11
11
  private isTotalLabelWarmedUp;
12
+ /**
13
+ * 清理当前线段/总距离标签(不影响线实体本身)
14
+ */
15
+ private clearDistanceLabels;
12
16
  /**
13
17
  * 开始绘制
14
18
  */
@@ -68,6 +68,11 @@ export declare class MapCircle {
68
68
  private getPrimitiveBatchForOverlay;
69
69
  private resolveMaterialColor;
70
70
  private canUsePrimitive;
71
+ /**
72
+ * 添加一个基础的圆形图元
73
+ * @param options 圆形配置选项
74
+ * @returns 返回创建的实体对象
75
+ */
71
76
  private addPrimitiveCircle;
72
77
  /**
73
78
  * 转换位置为 Cartesian3
@@ -90,6 +95,11 @@ export declare class MapCircle {
90
95
  * 使用大圆航线公式,segments 越大越平滑。
91
96
  */
92
97
  private generateCirclePositions;
98
+ /**
99
+ * 获取方位角查找表,用于存储正弦和余弦值
100
+ * @param segments 分段数量,用于确定查找表的精度
101
+ * @returns 返回一个包含正弦和余弦数组的对象
102
+ */
93
103
  private getBearingTable;
94
104
  /**
95
105
  * 粗边框模式的默认分段数:平衡“圆滑程度/性能”。
@@ -46,12 +46,12 @@ export declare class MapInfoWindow {
46
46
  private mergeOptions;
47
47
  constructor(viewer: Viewer, container: HTMLElement);
48
48
  /**
49
- * Set default update interval (ms) for position updates when an InfoWindow doesn't specify `updateInterval`.
50
- * 0 means update every frame.
49
+ * 设置默认的位置更新间隔(毫秒):当 InfoWindow 未指定 `updateInterval` 时使用。
50
+ * 0 表示每帧更新。
51
51
  */
52
52
  setDefaultUpdateInterval(ms: number): void;
53
53
  /**
54
- * Force immediate update (recompute positions) of all managed info windows.
54
+ * 强制立即更新(重新计算位置)所有已管理的信息窗。
55
55
  */
56
56
  forceUpdateAll(): void;
57
57
  private convertPosition;
@@ -0,0 +1,127 @@
1
+ import { Viewer } from '../../../node_modules/cesium';
2
+ import { DrawEntity } from '../drawHelper';
3
+ import { OverlayEntity } from './types';
4
+ import * as Cesium from "cesium";
5
+ export type OverlayEditChangeCallback = (entity: DrawEntity & OverlayEntity) => void;
6
+ export interface OverlayEditControllerOptions {
7
+ /**
8
+ * 编辑模式下,拖拽结束(LEFT_UP)且覆盖物几何发生变化时触发。
9
+ * 回调参数为“已回写后的覆盖物 entity”。
10
+ */
11
+ onChange?: OverlayEditChangeCallback;
12
+ }
13
+ export interface OverlayEditHost {
14
+ getViewer(): Viewer;
15
+ getEntities(): Cesium.EntityCollection;
16
+ getOverlayById(id: string): (DrawEntity & OverlayEntity) | undefined;
17
+ pickCartographic(windowPosition: Cesium.Cartesian2): Cesium.Cartographic | null;
18
+ /**
19
+ * 进入编辑前的宿主清理动作(例如清 hover/click 高亮、清 hover 状态等)。
20
+ * 由宿主决定“高亮系统/hover 系统”如何处理。
21
+ */
22
+ prepareEntityForEdit(entity: DrawEntity & OverlayEntity): void;
23
+ /** 将编辑结果回写到覆盖物 */
24
+ applyPolygonPositions(entity: DrawEntity & OverlayEntity, positions: Cesium.Cartesian3[]): void;
25
+ applyRectangleCoordinates(entity: DrawEntity & OverlayEntity, rect: Cesium.Rectangle): void;
26
+ applyCircle(entity: DrawEntity & OverlayEntity, center: Cesium.Cartesian3, radiusMeters: number): void;
27
+ applyPolylinePositions(entity: DrawEntity & OverlayEntity, positions: Cesium.Cartesian3[]): void;
28
+ applyPointPosition(entity: DrawEntity & OverlayEntity, position: Cesium.Cartesian3): void;
29
+ }
30
+ export declare class OverlayEditController {
31
+ private readonly host;
32
+ private enabled;
33
+ private handler;
34
+ private onChange;
35
+ private editingTarget;
36
+ private editingKind;
37
+ private editingPositions;
38
+ private editingCircleCenter;
39
+ private editingCircleRadiusMeters;
40
+ private editingPointPosition;
41
+ private handleEntities;
42
+ private dragging;
43
+ private dragSnapshot;
44
+ private dragChanged;
45
+ private moveStartCenter;
46
+ private moveStartPositions;
47
+ private transformStartCenter;
48
+ private transformStartPositions;
49
+ private rotateStartAngle;
50
+ private scaleStartDistance;
51
+ private cameraBackup;
52
+ constructor(host: OverlayEditHost, options?: OverlayEditControllerOptions);
53
+ setOnChange(cb?: OverlayEditChangeCallback | null): void;
54
+ setEnabled(enabled: boolean): void;
55
+ getEnabled(): boolean;
56
+ isEditing(): boolean;
57
+ destroy(): void;
58
+ /** 停止当前正在编辑的覆盖物(不会关闭全局编辑模式) */
59
+ stop(): void;
60
+ /**
61
+ * 主动开始编辑某个覆盖物。
62
+ * @returns true 表示成功进入编辑
63
+ */
64
+ start(entityOrId: (DrawEntity & OverlayEntity) | string): boolean;
65
+ private detectEditableKind;
66
+ private getPropertyValue;
67
+ private getNumberProperty;
68
+ private resolvePolygonPositions;
69
+ private resolvePolylinePositions;
70
+ private getEditablePolygonPositions;
71
+ private getEditablePolylinePositions;
72
+ private getEditablePointPosition;
73
+ private getEditableRectangle;
74
+ private getEditableCircleInfo;
75
+ /**
76
+ * 确保编辑处理器已初始化
77
+ * 如果处理器不存在,则创建一个新的 ScreenSpaceEventHandler 并设置各种交互事件处理函数
78
+ * @private
79
+ */
80
+ /**
81
+ * 确保事件处理器已初始化
82
+ * 如果处理器不存在,则创建并设置各种事件处理函数
83
+ * @private
84
+ */
85
+ /**
86
+ * 确保屏幕空间事件处理器已初始化
87
+ * 如果处理器不存在,则创建一个新的处理器并设置各种交互事件
88
+ */
89
+ private ensureHandler;
90
+ private captureDragSnapshot;
91
+ private isGeometryChangedSinceSnapshot;
92
+ private destroyHandler;
93
+ private lockCameraController;
94
+ private restoreCameraController;
95
+ private clearHandles;
96
+ private rebuildHandles;
97
+ private createHandle;
98
+ private buildPolygonHandles;
99
+ private buildRectangleHandles;
100
+ private buildPolylineHandles;
101
+ private buildPointHandles;
102
+ private buildCircleHandles;
103
+ private updatePolygonHandlePositions;
104
+ private updateRectangleHandlePositions;
105
+ private updatePolylineHandlePositions;
106
+ private updatePointHandlePositions;
107
+ private updateCircleHandlePositions;
108
+ private applyEditedPolygon;
109
+ private applyEditedRectangle;
110
+ private applyEditedCircle;
111
+ private applyEditedPolyline;
112
+ private applyEditedPoint;
113
+ private getEditingClampToGround;
114
+ private getCartesianHeight;
115
+ private pickCartesianOnGlobe;
116
+ private computeSurfaceDistanceMeters;
117
+ private circleRadiusHandlePosition;
118
+ private rectangleToPositions;
119
+ private positionsToRectangle;
120
+ private getRectangleEditHeight;
121
+ private computePolygonCenterCartesian;
122
+ private computePolygonCenterCartographic;
123
+ private computePolylineHandleRadius;
124
+ private offsetByMeters;
125
+ private getLocalAngleAndDistance;
126
+ private applyRotateScaleToPositions;
127
+ }
@@ -1,4 +1,5 @@
1
1
  export { CesiumOverlayService } from '../CesiumOverlayService';
2
+ export type { CesiumOverlayServiceOptions } from '../CesiumOverlayService';
2
3
  export { MapMarker } from './MapMarker';
3
4
  export { MapLabel } from './MapLabel';
4
5
  export { MapIcon } from './MapIcon';
@@ -73,6 +73,8 @@ export interface OverlayEntity extends Entity {
73
73
  };
74
74
  /** 用于还原高亮前的原始样式 */
75
75
  _highlightOriginalStyle?: OverlayHighlightOriginalStyle;
76
+ /** 高亮时临时创建的“发光边框”实体(由 CesiumOverlayService 管理) */
77
+ _highlightGlowEntity?: Entity;
76
78
  /** 覆盖物类型标识(用于 CesiumOverlayService 做差异化更新/删除) */
77
79
  _overlayType?: string;
78
80
  /** 信息窗口根 DOM(由 MapInfoWindow / CesiumOverlayService 使用) */
@@ -110,6 +112,8 @@ export interface OverlayEntity extends Entity {
110
112
  _primitiveLayerKey?: string;
111
113
  _primitiveRingBaseColor?: Color;
112
114
  _primitiveFillBaseColor?: Color;
115
+ /** primitive:用于高亮发光边框的外圈/边界位置(通常为闭合折线) */
116
+ _primitiveOutlinePositions?: Cartesian3[];
113
117
  /** primitive polygon/rectangle: 边框纯色缓存(用于高亮恢复) */
114
118
  _primitiveBorderBaseColor?: Color;
115
119
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@xingm/vmap-cesium-toolbar",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "A powerful Cesium map toolbar plugin with drawing, measurement, and interaction features",
5
5
  "type": "module",
6
- "main": "dist/index.js",
7
- "module": "dist/index.js",
6
+ "main": "dist/index.es.js",
7
+ "module": "dist/index.es.js",
8
8
  "types": "dist/index.d.ts",
9
9
  "files": [
10
10
  "dist",
@@ -15,14 +15,15 @@
15
15
  },
16
16
  "exports": {
17
17
  ".": {
18
- "import": "./dist/index.js",
19
- "types": "./dist/index.d.ts"
18
+ "import": "./dist/index.es.js",
19
+ "default": "./dist/index.es.js"
20
20
  },
21
21
  "./style": "./dist/style.css"
22
22
  },
23
23
  "scripts": {
24
24
  "dev": "vite --force",
25
25
  "build": "vite build --mode lib",
26
+ "dist": "vite build",
26
27
  "build:dts": "vue-tsc -p tsconfig.dts.json",
27
28
  "build:plugin": "node scripts/build-plugin.js",
28
29
  "docs:dev": "vitepress dev doc",
@@ -63,10 +64,10 @@
63
64
  "license": "MIT",
64
65
  "repository": {
65
66
  "type": "git",
66
- "url": "git+https://github.com/benxueyou/vmap-cesium-toolbar.git"
67
+ "url": "git+https://github.com/BenXueYou/vmap-cesium-tool.git"
67
68
  },
68
69
  "bugs": {
69
- "url": "https://github.com/benxueyou/vmap-cesium-toolbar/issues"
70
+ "url": "https://github.com/BenXueYou/vmap-cesium-tool/issues"
70
71
  },
71
- "homepage": "https://github.com/benxueyou/vmap-cesium-toolbar#readme"
72
+ "homepage": "https://github.com/BenXueYou/vmap-cesium-tool#readme"
72
73
  }