bbl-mapbox-react 0.0.17 → 0.0.18

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,9 +1,16 @@
1
- import { BaseEntity, EntityId } from '../types';
1
+ import { Map as MapboxMap } from 'mapbox-gl';
2
+ import { BaseEntity, EntityId, EditHandle } from '../types';
2
3
  /**
3
4
  * 实体边界框类型
4
5
  * [[西南角经度, 西南角纬度], [东北角经度, 东北角纬度]]
5
6
  */
6
7
  export type EntityBounds = [[number, number], [number, number]];
8
+ /** Move 图标的 Mapbox image ID */
9
+ export declare const MOVE_ICON_ID = "__edit-move-icon__";
10
+ /**
11
+ * 确保 move 图标已注册到 map 实例中(幂等,可多次调用)
12
+ */
13
+ export declare function ensureMoveIcon(map: MapboxMap): void;
7
14
  /**
8
15
  * 渲染器基础接口
9
16
  * 定义所有实体渲染器必须实现的公共方法
@@ -55,4 +62,36 @@ export interface BaseRenderer<T extends BaseEntity> {
55
62
  * 销毁渲染器
56
63
  */
57
64
  destroy(): void;
65
+ /**
66
+ * 开启/关闭编辑模式(显示/隐藏编辑手柄)
67
+ */
68
+ setEditing?(enabled: boolean): void;
69
+ /**
70
+ * 检测给定坐标是否命中编辑手柄
71
+ * @param lngLat 点击的经纬度
72
+ * @param zoom 当前缩放级别(用于计算像素距离阈值)
73
+ * @returns 命中的手柄,或 null
74
+ */
75
+ getEditHandleAt?(lngLat: [number, number], zoom: number): EditHandle | null;
76
+ /**
77
+ * 确认手柄移动,返回更新后的实体数据
78
+ */
79
+ applyHandleMove?(handle: EditHandle, newPosition: [number, number]): T;
80
+ /**
81
+ * 实时预览手柄拖动效果(鼠标跟随时调用)
82
+ */
83
+ updateEditPreview?(handle: EditHandle, previewPosition: [number, number]): void;
84
+ /**
85
+ * 取消手柄移动预览,恢复原始几何
86
+ */
87
+ cancelEditPreview?(): void;
88
+ /**
89
+ * 删除指定索引的顶点(仅 polygon/polyline)
90
+ * @returns 更新后的实体,若删除会导致无效则返回 null
91
+ */
92
+ deleteVertex?(index: number): T | null;
93
+ /**
94
+ * 在指定索引后插入新顶点(仅 polygon/polyline)
95
+ */
96
+ addVertex?(index: number, position: [number, number]): T;
58
97
  }
@@ -1,5 +1,5 @@
1
1
  import { Map as MapboxMap } from 'mapbox-gl';
2
- import { CircleEntity, CircleGradientAnimation, NameConfig, CircleMeasureConfig } from '../types';
2
+ import { CircleEntity, CircleGradientAnimation, NameConfig, CircleMeasureConfig, EditHandle } from '../types';
3
3
  import { BaseCanvasRenderer } from './BaseCanvasRenderer';
4
4
  import { EntityBounds } from './BaseRenderer';
5
5
  /**
@@ -28,6 +28,11 @@ export declare class CanvasCircleRenderer extends BaseCanvasRenderer<CircleEntit
28
28
  private radiusLineLayerId;
29
29
  private radiusLabelLayerId;
30
30
  private globalCircleConfig?;
31
+ private isEditing;
32
+ private editSourceId;
33
+ private editHandleLayerId;
34
+ private editMoveLayerId;
35
+ private static readonly EDGE_BEARINGS;
31
36
  constructor(map: MapboxMap, entity: CircleEntity, globalNameConfig?: NameConfig, globalSelectNameConfig?: NameConfig, globalAreaConfig?: NameConfig, globalCircleConfig?: CircleMeasureConfig);
32
37
  /**
33
38
  * 获取实体面积(平方米)
@@ -110,4 +115,14 @@ export declare class CanvasCircleRenderer extends BaseCanvasRenderer<CircleEntit
110
115
  * 销毁渲染器
111
116
  */
112
117
  destroy(): void;
118
+ private getEditHandlePositions;
119
+ private getEditHandleGeoJSON;
120
+ private createEditLayers;
121
+ private removeEditLayers;
122
+ private refreshEditHandles;
123
+ setEditing(enabled: boolean): void;
124
+ getEditHandleAt(lngLat: [number, number], _zoom: number): EditHandle | null;
125
+ applyHandleMove(handle: EditHandle, newPosition: [number, number]): CircleEntity;
126
+ updateEditPreview(handle: EditHandle, previewPosition: [number, number]): void;
127
+ cancelEditPreview(): void;
113
128
  }
@@ -1,5 +1,5 @@
1
1
  import { Map as MapboxMap } from 'mapbox-gl';
2
- import { ImageEntity, NameConfig } from '../types';
2
+ import { ImageEntity, NameConfig, EditHandle } from '../types';
3
3
  import { BaseCanvasRenderer } from './BaseCanvasRenderer';
4
4
  import { EntityBounds } from './BaseRenderer';
5
5
  /**
@@ -11,6 +11,9 @@ export declare class CanvasImageRenderer extends BaseCanvasRenderer<ImageEntity>
11
11
  private imageLoaded;
12
12
  private currentSrc;
13
13
  private imageAspectRatio;
14
+ private isEditing;
15
+ private editSourceId;
16
+ private editMoveLayerId;
14
17
  constructor(map: MapboxMap, entity: ImageEntity, globalNameConfig?: NameConfig, globalSelectNameConfig?: NameConfig);
15
18
  /**
16
19
  * 获取实体尺寸 [宽, 高],高度根据图片原始宽高比计算
@@ -48,4 +51,17 @@ export declare class CanvasImageRenderer extends BaseCanvasRenderer<ImageEntity>
48
51
  * @returns 是否在范围内
49
52
  */
50
53
  isPointInEntity(lngLat: [number, number]): boolean;
54
+ private getEditHandleGeoJSON;
55
+ private createEditLayers;
56
+ private removeEditLayers;
57
+ private refreshEditHandles;
58
+ setEditing(enabled: boolean): void;
59
+ getEditHandleAt(lngLat: [number, number], zoom: number): EditHandle | null;
60
+ applyHandleMove(handle: EditHandle, newPosition: [number, number]): ImageEntity;
61
+ updateEditPreview(handle: EditHandle, previewPosition: [number, number]): void;
62
+ cancelEditPreview(): void;
63
+ /**
64
+ * 销毁渲染器
65
+ */
66
+ destroy(): void;
51
67
  }
@@ -1,5 +1,5 @@
1
1
  import { Map as MapboxMap } from 'mapbox-gl';
2
- import { RadarEntity, NameConfig } from '../types';
2
+ import { RadarEntity, NameConfig, EditHandle } from '../types';
3
3
  import { BaseCanvasRenderer } from './BaseCanvasRenderer';
4
4
  import { EntityBounds } from './BaseRenderer';
5
5
  /**
@@ -9,6 +9,9 @@ import { EntityBounds } from './BaseRenderer';
9
9
  export declare class CanvasRadarRenderer extends BaseCanvasRenderer<RadarEntity> {
10
10
  private currentRotation;
11
11
  private animationFrameId;
12
+ private isEditing;
13
+ private editSourceId;
14
+ private editMoveLayerId;
12
15
  constructor(map: MapboxMap, entity: RadarEntity, globalNameConfig?: NameConfig, globalSelectNameConfig?: NameConfig);
13
16
  /**
14
17
  * 获取实体中心点坐标
@@ -60,4 +63,13 @@ export declare class CanvasRadarRenderer extends BaseCanvasRenderer<RadarEntity>
60
63
  * 销毁渲染器
61
64
  */
62
65
  destroy(): void;
66
+ private getEditHandleGeoJSON;
67
+ private createEditLayers;
68
+ private removeEditLayers;
69
+ private refreshEditHandles;
70
+ setEditing(enabled: boolean): void;
71
+ getEditHandleAt(lngLat: [number, number], _zoom: number): EditHandle | null;
72
+ applyHandleMove(handle: EditHandle, newPosition: [number, number]): RadarEntity;
73
+ updateEditPreview(handle: EditHandle, previewPosition: [number, number]): void;
74
+ cancelEditPreview(): void;
63
75
  }
@@ -1,5 +1,5 @@
1
1
  import { Map as MapboxMap } from 'mapbox-gl';
2
- import { CircleEntity, EntityId, NameConfig, CircleMeasureConfig } from '../types';
2
+ import { CircleEntity, EntityId, NameConfig, CircleMeasureConfig, EditHandle } from '../types';
3
3
  import { BaseRenderer, EntityBounds } from './BaseRenderer';
4
4
  /**
5
5
  * Circle 渲染器
@@ -27,6 +27,10 @@ export declare class CircleRenderer implements BaseRenderer<CircleEntity> {
27
27
  private globalSelectNameConfig?;
28
28
  private globalAreaConfig?;
29
29
  private globalCircleConfig?;
30
+ private isEditing;
31
+ private editSourceId;
32
+ private editHandleLayerId;
33
+ private editMoveLayerId;
30
34
  private static readonly DEFAULTS;
31
35
  constructor(map: MapboxMap, entity: CircleEntity, globalNameConfig?: NameConfig, globalSelectNameConfig?: NameConfig, globalAreaConfig?: NameConfig, globalCircleConfig?: CircleMeasureConfig);
32
36
  private get nameStyle();
@@ -103,5 +107,21 @@ export declare class CircleRenderer implements BaseRenderer<CircleEntity> {
103
107
  /**
104
108
  * 销毁渲染器
105
109
  */
110
+ /** 边上4个方位点的方位角 N=0, E=90, S=180, W=270 */
111
+ private static readonly EDGE_BEARINGS;
112
+ /**
113
+ * 获取编辑手柄位置列表
114
+ * @returns 4个边上点 + 1个中心点
115
+ */
116
+ private getEditHandlePositions;
117
+ private getEditHandleGeoJSON;
118
+ private createEditLayers;
119
+ private removeEditLayers;
120
+ private refreshEditHandles;
121
+ setEditing(enabled: boolean): void;
122
+ getEditHandleAt(lngLat: [number, number], zoom: number): EditHandle | null;
123
+ applyHandleMove(handle: EditHandle, newPosition: [number, number]): CircleEntity;
124
+ updateEditPreview(handle: EditHandle, previewPosition: [number, number]): void;
125
+ cancelEditPreview(): void;
106
126
  destroy(): void;
107
127
  }
@@ -1,5 +1,5 @@
1
1
  import { Map as MapboxMap } from 'mapbox-gl';
2
- import { MarkerEntity, BaseMarkerEntity, EntityId, NameConfig } from '../types';
2
+ import { MarkerEntity, BaseMarkerEntity, EntityId, NameConfig, EditHandle } from '../types';
3
3
  import { BaseRenderer, EntityBounds } from './BaseRenderer';
4
4
  /**
5
5
  * Marker 渲染器
@@ -19,6 +19,8 @@ export declare class MarkerRenderer<T extends BaseMarkerEntity = MarkerEntity> i
19
19
  private destroyed;
20
20
  private globalNameConfig?;
21
21
  private globalSelectNameConfig?;
22
+ private isEditing;
23
+ private moveIconElement;
22
24
  constructor(map: MapboxMap, entity: T, globalNameConfig?: NameConfig, globalSelectNameConfig?: NameConfig);
23
25
  /**
24
26
  * 加载图片并创建 marker
@@ -83,4 +85,11 @@ export declare class MarkerRenderer<T extends BaseMarkerEntity = MarkerEntity> i
83
85
  * 销毁渲染器
84
86
  */
85
87
  destroy(): void;
88
+ private createMoveIcon;
89
+ private removeMoveIcon;
90
+ setEditing(enabled: boolean): void;
91
+ getEditHandleAt(lngLat: [number, number], _zoom: number): EditHandle | null;
92
+ applyHandleMove(handle: EditHandle, newPosition: [number, number]): T;
93
+ updateEditPreview(handle: EditHandle, previewPosition: [number, number]): void;
94
+ cancelEditPreview(): void;
86
95
  }
@@ -6,7 +6,9 @@ export interface MeasureControlProps {
6
6
  entityConfig?: EntityConfig;
7
7
  /** 受控模式:entityConfig 变更回调 */
8
8
  onEntityConfigChange?: (config: EntityConfig) => void;
9
+ /** 绘制模式变更回调,通知外部当前是否在绘制测量图形 */
10
+ onDrawModeChange?: (isDrawing: boolean) => void;
9
11
  className?: string;
10
12
  style?: React.CSSProperties;
11
13
  }
12
- export declare function MeasureControl({ map, entityConfig: controlledEntityConfig, onEntityConfigChange, className, style, }: MeasureControlProps): import("react/jsx-runtime").JSX.Element | null;
14
+ export declare function MeasureControl({ map, entityConfig: controlledEntityConfig, onEntityConfigChange, onDrawModeChange, className, style, }: MeasureControlProps): import("react/jsx-runtime").JSX.Element | null;
@@ -1,5 +1,5 @@
1
1
  import { Map as MapboxMap } from 'mapbox-gl';
2
- import { PolygonEntity, EntityId, NameConfig } from '../types';
2
+ import { PolygonEntity, EntityId, NameConfig, EditHandle } from '../types';
3
3
  import { BaseRenderer, EntityBounds } from './BaseRenderer';
4
4
  /**
5
5
  * Polygon 渲染器
@@ -21,6 +21,11 @@ export declare class PolygonRenderer implements BaseRenderer<PolygonEntity> {
21
21
  private globalSelectNameConfig?;
22
22
  private globalAreaConfig?;
23
23
  private globalLengthConfig?;
24
+ private isEditing;
25
+ private editSourceId;
26
+ private editHandleLayerId;
27
+ private editMidpointLayerId;
28
+ private editMoveLayerId;
24
29
  private static readonly DEFAULTS;
25
30
  constructor(map: MapboxMap, entity: PolygonEntity, globalNameConfig?: NameConfig, globalSelectNameConfig?: NameConfig, globalAreaConfig?: NameConfig, globalLengthConfig?: NameConfig);
26
31
  private get nameStyle();
@@ -86,6 +91,54 @@ export declare class PolygonRenderer implements BaseRenderer<PolygonEntity> {
86
91
  * 更新实体数据
87
92
  */
88
93
  update(entity: PolygonEntity): void;
94
+ /**
95
+ * 生成编辑手柄的 GeoJSON 数据
96
+ */
97
+ private getEditHandleGeoJSON;
98
+ /**
99
+ * 创建编辑手柄图层
100
+ */
101
+ private createEditLayers;
102
+ /**
103
+ * 移除编辑手柄图层
104
+ */
105
+ private removeEditLayers;
106
+ /**
107
+ * 刷新编辑手柄数据
108
+ */
109
+ private refreshEditHandles;
110
+ /**
111
+ * 开启/关闭编辑模式
112
+ */
113
+ setEditing(enabled: boolean): void;
114
+ /**
115
+ * 检测给定坐标是否命中编辑手柄
116
+ */
117
+ getEditHandleAt(lngLat: [number, number], zoom: number): EditHandle | null;
118
+ /**
119
+ * 将所有坐标按偏移量平移
120
+ */
121
+ private offsetCoordinates;
122
+ /**
123
+ * 确认手柄移动,返回更新后的实体
124
+ */
125
+ applyHandleMove(handle: EditHandle, newPosition: [number, number]): PolygonEntity;
126
+ /**
127
+ * 实时预览手柄拖动效果
128
+ */
129
+ updateEditPreview(handle: EditHandle, previewPosition: [number, number]): void;
130
+ /**
131
+ * 取消预览,恢复原始几何
132
+ */
133
+ cancelEditPreview(): void;
134
+ /**
135
+ * 删除指定索引的顶点
136
+ */
137
+ deleteVertex(index: number): PolygonEntity | null;
138
+ /**
139
+ * 在指定索引后插入新顶点
140
+ */
141
+ addVertex(index: number, position: [number, number]): PolygonEntity;
89
142
  /**
90
143
  * 销毁渲染器
91
144
  */
@@ -1,5 +1,5 @@
1
1
  import { Map as MapboxMap } from 'mapbox-gl';
2
- import { PolylineEntity, EntityId, NameConfig } from '../types';
2
+ import { PolylineEntity, EntityId, NameConfig, EditHandle } from '../types';
3
3
  import { BaseRenderer, EntityBounds } from './BaseRenderer';
4
4
  /**
5
5
  * Polyline 渲染器
@@ -18,6 +18,11 @@ export declare class PolylineRenderer implements BaseRenderer<PolylineEntity> {
18
18
  private globalNameConfig?;
19
19
  private globalSelectNameConfig?;
20
20
  private globalLengthConfig?;
21
+ private isEditing;
22
+ private editSourceId;
23
+ private editHandleLayerId;
24
+ private editMidpointLayerId;
25
+ private editMoveLayerId;
21
26
  private static readonly DEFAULTS;
22
27
  constructor(map: MapboxMap, entity: PolylineEntity, globalNameConfig?: NameConfig, globalSelectNameConfig?: NameConfig, globalLengthConfig?: NameConfig);
23
28
  private get nameStyle();
@@ -82,6 +87,18 @@ export declare class PolylineRenderer implements BaseRenderer<PolylineEntity> {
82
87
  * 更新实体数据
83
88
  */
84
89
  update(entity: PolylineEntity): void;
90
+ private getEditHandleGeoJSON;
91
+ private createEditLayers;
92
+ private removeEditLayers;
93
+ private refreshEditHandles;
94
+ setEditing(enabled: boolean): void;
95
+ getEditHandleAt(lngLat: [number, number], zoom: number): EditHandle | null;
96
+ private offsetCoordinates;
97
+ applyHandleMove(handle: EditHandle, newPosition: [number, number]): PolylineEntity;
98
+ updateEditPreview(handle: EditHandle, previewPosition: [number, number]): void;
99
+ cancelEditPreview(): void;
100
+ deleteVertex(index: number): PolylineEntity | null;
101
+ addVertex(index: number, position: [number, number]): PolylineEntity;
85
102
  /**
86
103
  * 销毁渲染器
87
104
  */
@@ -1,5 +1,5 @@
1
1
  import { Map as MapboxMap } from 'mapbox-gl';
2
- import { RectangleEntity, EntityId, NameConfig } from '../types';
2
+ import { RectangleEntity, EntityId, NameConfig, EditHandle } from '../types';
3
3
  import { BaseRenderer, EntityBounds } from './BaseRenderer';
4
4
  /**
5
5
  * Rectangle 渲染器
@@ -21,6 +21,10 @@ export declare class RectangleRenderer implements BaseRenderer<RectangleEntity>
21
21
  private globalSelectNameConfig?;
22
22
  private globalAreaConfig?;
23
23
  private globalLengthConfig?;
24
+ private isEditing;
25
+ private editSourceId;
26
+ private editHandleLayerId;
27
+ private editMoveLayerId;
24
28
  private static readonly DEFAULTS;
25
29
  constructor(map: MapboxMap, entity: RectangleEntity, globalNameConfig?: NameConfig, globalSelectNameConfig?: NameConfig, globalAreaConfig?: NameConfig, globalLengthConfig?: NameConfig);
26
30
  private get nameStyle();
@@ -86,6 +90,27 @@ export declare class RectangleRenderer implements BaseRenderer<RectangleEntity>
86
90
  * 更新实体数据
87
91
  */
88
92
  update(entity: RectangleEntity): void;
93
+ /**
94
+ * 获取矩形4个角的坐标(不含闭合点)
95
+ * 顺序: 0=左上, 1=右上, 2=右下, 3=左下
96
+ */
97
+ private getCorners;
98
+ private getEditHandleGeoJSON;
99
+ private createEditLayers;
100
+ private removeEditLayers;
101
+ private refreshEditHandles;
102
+ setEditing(enabled: boolean): void;
103
+ getEditHandleAt(lngLat: [number, number], zoom: number): EditHandle | null;
104
+ /**
105
+ * 根据被移动的角的新位置,计算新的 bounds
106
+ * 对角保持不变,移动的角决定新的 bounds
107
+ * 角序: 0=左上, 1=右上, 2=右下, 3=左下
108
+ */
109
+ private computeNewBounds;
110
+ private offsetBounds;
111
+ applyHandleMove(handle: EditHandle, newPosition: [number, number]): RectangleEntity;
112
+ updateEditPreview(handle: EditHandle, previewPosition: [number, number]): void;
113
+ cancelEditPreview(): void;
89
114
  /**
90
115
  * 销毁渲染器
91
116
  */
@@ -0,0 +1,19 @@
1
+ import { Map as MapboxMap } from 'mapbox-gl';
2
+ import { MapEntity, RoutePlanningVisualType, RoutePlanningOptions } from '../types';
3
+ export interface RoutePlanningControlProps {
4
+ map: MapboxMap | null;
5
+ /** 选点数量,最低2,默认2 */
6
+ pointCount?: number;
7
+ /** 是否显示输入框让用户自定义点数 */
8
+ showPointCountInput?: boolean;
9
+ /** 选点过程中的可视化类型,默认 'marker' */
10
+ visualType?: RoutePlanningVisualType;
11
+ /** 选点完成后的回调 */
12
+ onSelectFinished?: (points: [number, number][]) => Promise<MapEntity>;
13
+ /** 是否显示按钮UI,false时仅用于程序化调用 */
14
+ showButton?: boolean;
15
+ }
16
+ export interface RoutePlanningControlRef {
17
+ startPlanning: (options: RoutePlanningOptions) => void;
18
+ }
19
+ export declare const RoutePlanningControl: import('react').ForwardRefExoticComponent<RoutePlanningControlProps & import('react').RefAttributes<RoutePlanningControlRef>>;
@@ -1,5 +1,5 @@
1
1
  import { Map as MapboxMap } from 'mapbox-gl';
2
- import { SquareEntity, EntityId, NameConfig } from '../types';
2
+ import { SquareEntity, EntityId, NameConfig, EditHandle } from '../types';
3
3
  import { BaseRenderer, EntityBounds } from './BaseRenderer';
4
4
  /**
5
5
  * Square 渲染器
@@ -21,6 +21,10 @@ export declare class SquareRenderer implements BaseRenderer<SquareEntity> {
21
21
  private globalSelectNameConfig?;
22
22
  private globalAreaConfig?;
23
23
  private globalLengthConfig?;
24
+ private isEditing;
25
+ private editSourceId;
26
+ private editHandleLayerId;
27
+ private editMoveLayerId;
24
28
  private static readonly DEFAULTS;
25
29
  constructor(map: MapboxMap, entity: SquareEntity, globalNameConfig?: NameConfig, globalSelectNameConfig?: NameConfig, globalAreaConfig?: NameConfig, globalLengthConfig?: NameConfig);
26
30
  private get nameStyle();
@@ -81,6 +85,21 @@ export declare class SquareRenderer implements BaseRenderer<SquareEntity> {
81
85
  * 更新实体数据
82
86
  */
83
87
  update(entity: SquareEntity): void;
88
+ private getCorners;
89
+ private getEditHandleGeoJSON;
90
+ private createEditLayers;
91
+ private removeEditLayers;
92
+ private refreshEditHandles;
93
+ setEditing(enabled: boolean): void;
94
+ getEditHandleAt(lngLat: [number, number], zoom: number): EditHandle | null;
95
+ /**
96
+ * 根据移动的角位置计算新的边长
97
+ * 中心点不变,新边长 = 从中心到新角位置的距离 * sqrt(2)
98
+ */
99
+ private computeNewLength;
100
+ applyHandleMove(handle: EditHandle, newPosition: [number, number]): SquareEntity;
101
+ updateEditPreview(handle: EditHandle, previewPosition: [number, number]): void;
102
+ cancelEditPreview(): void;
84
103
  /**
85
104
  * 销毁渲染器
86
105
  */