gdmap-utils 1.1.4 → 1.1.5

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,254 +1,254 @@
1
- import { addClassToDiv } from '@/utils/ruoyi.js';
2
- export default class OverlayGroupManager {
3
- //
4
-
5
- _overlayType = null; //统一管理的marker类型
6
-
7
- OverlayGroup = null; //分组管理对象
8
-
9
- events = new Map(); //保存事件的集合
10
-
11
- activesMarkerIds = []; //保存激活的marker集合
12
-
13
- overlayActiveIcon = null; //激活的图标
14
-
15
- overlayDefaultIcon = null;
16
-
17
- allPointTitlesShow = false; //标识点位title是否打开
18
-
19
- map = null; //图层关联的Map对象
20
- // 构造函数
21
- constructor(options) {
22
- if (!options || AMap === undefined) {
23
- return this.error('AMap is undefined or options is undefined');
24
- }
25
-
26
- const { overlayType, overlays, map } = options;
27
-
28
- this.OverlayGroup = new AMap.OverlayGroup(overlays);
29
-
30
- this._overlayType = overlayType; //图层类型
31
-
32
- this.overlayActiveIcon = overlays?.activeIcon || null; //图层激活的图标
33
-
34
- this.overlayDefaultIcon = overlays?.defaultIcon || null; //图层默认的图标
35
-
36
- this.map = map; //保存图层关联的Map对象
37
-
38
- this.OverlayGroup.setMap(map); //设置图层的地图对象
39
- }
40
-
41
- // 添加覆盖物
42
- addOverlay(overlays) {
43
- if (!overlays) {
44
- this.error('请传入图层对象');
45
- return;
46
- }
47
-
48
- let overlayList = [].concat(overlays); // 处理传入的参数为数组
49
-
50
- overlayList.forEach(item => {
51
- this.addMarkerBindEvent(item); // 绑定事件
52
- });
53
-
54
- this.OverlayGroup.addOverlays(overlayList);
55
- }
56
- // 移除覆盖物
57
- removeOverlay(overlays) {
58
- if (!overlays) {
59
- this.error('请传入图层对象');
60
- return;
61
- }
62
-
63
- let overlayList = [].concat(overlays); // 处理传入的参数为数组
64
-
65
- this.OverlayGroup.removeOverlays(overlayList);
66
- }
67
-
68
- hideOverlay() {
69
- this?.OverlayGroup?.hide();
70
- }
71
-
72
- showOverlay() {
73
- this?.OverlayGroup?.show();
74
- }
75
-
76
- //给所有的marker绑定事件
77
- bindEventMarker(clickType, callback) {
78
- if (typeof callback !== 'function') {
79
- this.error('请传入事件回调函数');
80
- return;
81
- }
82
-
83
- // 获取地图的所有点位,绑定上事件
84
- this.OverlayGroup.on(clickType, callback);
85
-
86
- // 保存事件
87
- this.events.set(clickType, callback);
88
- }
89
-
90
- addMarkerBindEvent(marker) {
91
- // 获取对应marker的事件,绑定给对应的marker
92
- for (const element of this.events) {
93
- // 遍历事件集合,给marker绑定事件
94
- const [clickType, callback] = element;
95
-
96
- marker.on(clickType, callback);
97
- }
98
- }
99
-
100
- // 查找图层对象中的某一个marker
101
- findLayerMarker(markerId) {
102
- if (!markerId) {
103
- this.error('请传入markerId');
104
- return;
105
- }
106
- if (markerId instanceof AMap.Marker) {
107
- return markerId; // 如果传入的是marker对象,直接返回
108
- }
109
- const marker = this.OverlayGroup.getOverlays().find(item => {
110
- return item.getExtData().id === markerId;
111
- });
112
-
113
- return marker || null; // 如果没有找到,返回null
114
- }
115
-
116
- // 设置激活的marker
117
- setActiveMarker(marker) {
118
- if (this.overlayActiveIcon === null) return; //表明用户不需要激活
119
- marker = this.findLayerMarker(marker); // 查找图层对象中的某一个marker
120
-
121
- if (!marker) {
122
- // 如果没有找到对应的marker
123
- return this.error('marker is not found');
124
- }
125
-
126
- const curOpts = marker.getIcon()._opts;
127
-
128
- const activeIcon = marker._originOpts.activeIcon;
129
-
130
- const icon = this.createIcon(activeIcon, curOpts); // 创建新图标
131
-
132
- // 获取点击的标记对象
133
- marker.setIcon(icon);
134
-
135
- const labelParams = marker.getLabel(); //保存配置
136
-
137
- // 激活始终显示title
138
- labelParams.content = labelParams.content.replace('display-none', '');
139
-
140
- marker.setLabel(labelParams);
141
-
142
- // 保存激活状态
143
- this.activesMarkerIds.push(marker.getExtData().id);
144
- }
145
- //[ ] 待重构
146
- toggleAllPointTitles(selector, val) {
147
- // this.refreshMap(); //重新加载图层
148
- const elms = document.querySelectorAll('.amap-marker'); //获取所有的marker元素
149
- this.allPointTitlesShow = val;
150
- if (!val) {
151
- elms.forEach(elm => {
152
- elm.querySelector(selector).classList.add('display-none');
153
- elm.querySelector('.amap-marker-label').style.pointerEvents = 'none';
154
- });
155
- } else {
156
- elms.forEach(elm => {
157
- elm.querySelector(selector).classList.remove('display-none');
158
- elm.querySelector('.amap-marker-label').style.pointerEvents = '';
159
- });
160
- }
161
- }
162
-
163
- //业务场景是单个图标为激活状态 重置激活的marker
164
- resetActiveMarker() {
165
- // 遍历所有的marker,重置 their icon
166
- this.OverlayGroup.getOverlays().forEach(item => {
167
- if (this.activesMarkerIds.includes(item.getExtData().id)) {
168
- const curOpts = item.getIcon()._opts;
169
-
170
- const defaultIcon = item._originOpts.defaultIcon;
171
-
172
- const icon = this.createIcon(defaultIcon, curOpts); // 创建新图标
173
-
174
- // 如果是激活的marker,重置图标
175
- item.setIcon(icon); // 设置默认图标
176
-
177
- let labelParams = item.getLabel();
178
- if (!this.allPointTitlesShow) {
179
- labelParams.content = addClassToDiv(
180
- labelParams?.content || '',
181
- 'display-none'
182
- );
183
- } else {
184
- labelParams.content = labelParams.content.replace('display-none', '');
185
- }
186
-
187
- item.setLabel(labelParams);
188
- }
189
- });
190
- // 清空激活状态
191
- this.activesMarkerIds = [];
192
- }
193
-
194
- // 获取点位存储的marker数据
195
- getDataOfMarkers() {
196
- if (!this.OverlayGroup) return [];
197
- return this.OverlayGroup.getOverlays().map(item => item.getExtData());
198
- }
199
-
200
- // 错误提示
201
- error(msg) {
202
- console.error(`[OverlayGroupManager Error]:${msg}`);
203
- }
204
-
205
- //业务场景是单个图标为激活状态 重置激活的marker
206
- resetActiveNavMarker() {
207
- // 遍历所有的marker,重置 their icon
208
- this.OverlayGroup.getOverlays().forEach(item => {
209
- if (this.activesMarkerIds.includes(item.getExtData().id)) {
210
- const curOpts = item.getIcon()._opts;
211
-
212
- const markerOpts = item._opts;
213
-
214
- const icon = this.createIcon(this.overlayDefaultIcon, curOpts); // 创建新图标
215
-
216
- // 如果是激活的marker,重置图标
217
- item.setIcon(icon); // 设置默认图标
218
-
219
- item.setLabel(markerOpts.originLabel);
220
- }
221
- });
222
- // 清空激活状态
223
- this.activesMarkerIds = [];
224
- }
225
- }
226
-
227
- const gdMixin = {
228
- // 提取创建 Icon 的逻辑
229
- createIcon(imageUrl, iconOpts) {
230
- //HACK 单一原则
231
- return new AMap.Icon({
232
- image: imageUrl, // 图标图片 URL
233
- size: new AMap.Size(...iconOpts.size), // 图标大小
234
- imageSize: new AMap.Size(...iconOpts.imageSize), // 图片实际大小
235
- });
236
- },
237
- };
238
-
239
- // 混入mixin
240
- Object.assign(OverlayGroupManager.prototype, gdMixin);
241
- /*
242
- 责单一原则:
243
-
244
- gdMixin 的职责是封装与 AMap.Icon 相关的逻辑,即创建图标。
245
- setIcon 是直接操作 marker 对象的方法,属于业务逻辑的一部分,与 AMap.Icon 的创建逻辑分离更符合职责单一原则。
246
- 复用性
247
-
248
- createIcon 方法可以在多个地方复用,例如在 setActiveMarker 和 resetActiveMarker 中。
249
- setIcon 是直接操作 marker 的方法,通常只在特定的业务逻辑中使用,复用性较低。
250
- 代码清晰性:
251
-
252
- 将 setIcon 保留在业务逻辑中,可以让代码更直观,便于理解。
253
- 如果将其放入 gdMixin 中,可能会让混入的逻辑变得复杂,降低代码的可读性。
254
- */
1
+ import { addClassToDiv } from '@/utils/ruoyi.js';
2
+ export default class OverlayGroupManager {
3
+ //
4
+
5
+ _overlayType = null; //统一管理的marker类型
6
+
7
+ OverlayGroup = null; //分组管理对象
8
+
9
+ events = new Map(); //保存事件的集合
10
+
11
+ activesMarkerIds = []; //保存激活的marker集合
12
+
13
+ overlayActiveIcon = null; //激活的图标
14
+
15
+ overlayDefaultIcon = null;
16
+
17
+ allPointTitlesShow = false; //标识点位title是否打开
18
+
19
+ map = null; //图层关联的Map对象
20
+ // 构造函数
21
+ constructor(options) {
22
+ if (!options || AMap === undefined) {
23
+ return this.error('AMap is undefined or options is undefined');
24
+ }
25
+
26
+ const { overlayType, overlays, map } = options;
27
+
28
+ this.OverlayGroup = new AMap.OverlayGroup(overlays);
29
+
30
+ this._overlayType = overlayType; //图层类型
31
+
32
+ this.overlayActiveIcon = overlays?.activeIcon || null; //图层激活的图标
33
+
34
+ this.overlayDefaultIcon = overlays?.defaultIcon || null; //图层默认的图标
35
+
36
+ this.map = map; //保存图层关联的Map对象
37
+
38
+ this.OverlayGroup.setMap(map); //设置图层的地图对象
39
+ }
40
+
41
+ // 添加覆盖物
42
+ addOverlay(overlays) {
43
+ if (!overlays) {
44
+ this.error('请传入图层对象');
45
+ return;
46
+ }
47
+
48
+ let overlayList = [].concat(overlays); // 处理传入的参数为数组
49
+
50
+ overlayList.forEach(item => {
51
+ this.addMarkerBindEvent(item); // 绑定事件
52
+ });
53
+
54
+ this.OverlayGroup.addOverlays(overlayList);
55
+ }
56
+ // 移除覆盖物
57
+ removeOverlay(overlays) {
58
+ if (!overlays) {
59
+ this.error('请传入图层对象');
60
+ return;
61
+ }
62
+
63
+ let overlayList = [].concat(overlays); // 处理传入的参数为数组
64
+
65
+ this.OverlayGroup.removeOverlays(overlayList);
66
+ }
67
+
68
+ hideOverlay() {
69
+ this?.OverlayGroup?.hide();
70
+ }
71
+
72
+ showOverlay() {
73
+ this?.OverlayGroup?.show();
74
+ }
75
+
76
+ //给所有的marker绑定事件
77
+ bindEventMarker(clickType, callback) {
78
+ if (typeof callback !== 'function') {
79
+ this.error('请传入事件回调函数');
80
+ return;
81
+ }
82
+
83
+ // 获取地图的所有点位,绑定上事件
84
+ this.OverlayGroup.on(clickType, callback);
85
+
86
+ // 保存事件
87
+ this.events.set(clickType, callback);
88
+ }
89
+
90
+ addMarkerBindEvent(marker) {
91
+ // 获取对应marker的事件,绑定给对应的marker
92
+ for (const element of this.events) {
93
+ // 遍历事件集合,给marker绑定事件
94
+ const [clickType, callback] = element;
95
+
96
+ marker.on(clickType, callback);
97
+ }
98
+ }
99
+
100
+ // 查找图层对象中的某一个marker
101
+ findLayerMarker(markerId) {
102
+ if (!markerId) {
103
+ this.error('请传入markerId');
104
+ return;
105
+ }
106
+ if (markerId instanceof AMap.Marker) {
107
+ return markerId; // 如果传入的是marker对象,直接返回
108
+ }
109
+ const marker = this.OverlayGroup.getOverlays().find(item => {
110
+ return item.getExtData().id === markerId;
111
+ });
112
+
113
+ return marker || null; // 如果没有找到,返回null
114
+ }
115
+
116
+ // 设置激活的marker
117
+ setActiveMarker(marker) {
118
+ if (this.overlayActiveIcon === null) return; //表明用户不需要激活
119
+ marker = this.findLayerMarker(marker); // 查找图层对象中的某一个marker
120
+
121
+ if (!marker) {
122
+ // 如果没有找到对应的marker
123
+ return this.error('marker is not found');
124
+ }
125
+
126
+ const curOpts = marker.getIcon()._opts;
127
+
128
+ const activeIcon = marker._originOpts.activeIcon;
129
+
130
+ const icon = this.createIcon(activeIcon, curOpts); // 创建新图标
131
+
132
+ // 获取点击的标记对象
133
+ marker.setIcon(icon);
134
+
135
+ const labelParams = marker.getLabel(); //保存配置
136
+
137
+ // 激活始终显示title
138
+ labelParams.content = labelParams.content.replace('display-none', '');
139
+
140
+ marker.setLabel(labelParams);
141
+
142
+ // 保存激活状态
143
+ this.activesMarkerIds.push(marker.getExtData().id);
144
+ }
145
+ //[ ] 待重构
146
+ toggleAllPointTitles(selector, val) {
147
+ // this.refreshMap(); //重新加载图层
148
+ const elms = document.querySelectorAll('.amap-marker'); //获取所有的marker元素
149
+ this.allPointTitlesShow = val;
150
+ if (!val) {
151
+ elms.forEach(elm => {
152
+ elm.querySelector(selector).classList.add('display-none');
153
+ elm.querySelector('.amap-marker-label').style.pointerEvents = 'none';
154
+ });
155
+ } else {
156
+ elms.forEach(elm => {
157
+ elm.querySelector(selector).classList.remove('display-none');
158
+ elm.querySelector('.amap-marker-label').style.pointerEvents = '';
159
+ });
160
+ }
161
+ }
162
+
163
+ //业务场景是单个图标为激活状态 重置激活的marker
164
+ resetActiveMarker() {
165
+ // 遍历所有的marker,重置 their icon
166
+ this.OverlayGroup.getOverlays().forEach(item => {
167
+ if (this.activesMarkerIds.includes(item.getExtData().id)) {
168
+ const curOpts = item.getIcon()._opts;
169
+
170
+ const defaultIcon = item._originOpts.defaultIcon;
171
+
172
+ const icon = this.createIcon(defaultIcon, curOpts); // 创建新图标
173
+
174
+ // 如果是激活的marker,重置图标
175
+ item.setIcon(icon); // 设置默认图标
176
+
177
+ let labelParams = item.getLabel();
178
+ if (!this.allPointTitlesShow) {
179
+ labelParams.content = addClassToDiv(
180
+ labelParams?.content || '',
181
+ 'display-none'
182
+ );
183
+ } else {
184
+ labelParams.content = labelParams.content.replace('display-none', '');
185
+ }
186
+
187
+ item.setLabel(labelParams);
188
+ }
189
+ });
190
+ // 清空激活状态
191
+ this.activesMarkerIds = [];
192
+ }
193
+
194
+ // 获取点位存储的marker数据
195
+ getDataOfMarkers() {
196
+ if (!this.OverlayGroup) return [];
197
+ return this.OverlayGroup.getOverlays().map(item => item.getExtData());
198
+ }
199
+
200
+ // 错误提示
201
+ error(msg) {
202
+ console.error(`[OverlayGroupManager Error]:${msg}`);
203
+ }
204
+
205
+ //业务场景是单个图标为激活状态 重置激活的marker
206
+ resetActiveNavMarker() {
207
+ // 遍历所有的marker,重置 their icon
208
+ this.OverlayGroup.getOverlays().forEach(item => {
209
+ if (this.activesMarkerIds.includes(item.getExtData().id)) {
210
+ const curOpts = item.getIcon()._opts;
211
+
212
+ const markerOpts = item._opts;
213
+
214
+ const icon = this.createIcon(this.overlayDefaultIcon, curOpts); // 创建新图标
215
+
216
+ // 如果是激活的marker,重置图标
217
+ item.setIcon(icon); // 设置默认图标
218
+
219
+ item.setLabel(markerOpts.originLabel);
220
+ }
221
+ });
222
+ // 清空激活状态
223
+ this.activesMarkerIds = [];
224
+ }
225
+ }
226
+
227
+ const gdMixin = {
228
+ // 提取创建 Icon 的逻辑
229
+ createIcon(imageUrl, iconOpts) {
230
+ //HACK 单一原则
231
+ return new AMap.Icon({
232
+ image: imageUrl, // 图标图片 URL
233
+ size: new AMap.Size(...iconOpts.size), // 图标大小
234
+ imageSize: new AMap.Size(...iconOpts.imageSize), // 图片实际大小
235
+ });
236
+ },
237
+ };
238
+
239
+ // 混入mixin
240
+ Object.assign(OverlayGroupManager.prototype, gdMixin);
241
+ /*
242
+ 责单一原则:
243
+
244
+ gdMixin 的职责是封装与 AMap.Icon 相关的逻辑,即创建图标。
245
+ setIcon 是直接操作 marker 对象的方法,属于业务逻辑的一部分,与 AMap.Icon 的创建逻辑分离更符合职责单一原则。
246
+ 复用性
247
+
248
+ createIcon 方法可以在多个地方复用,例如在 setActiveMarker 和 resetActiveMarker 中。
249
+ setIcon 是直接操作 marker 的方法,通常只在特定的业务逻辑中使用,复用性较低。
250
+ 代码清晰性:
251
+
252
+ 将 setIcon 保留在业务逻辑中,可以让代码更直观,便于理解。
253
+ 如果将其放入 gdMixin 中,可能会让混入的逻辑变得复杂,降低代码的可读性。
254
+ */
@@ -1,87 +1,87 @@
1
- import type { MarkerOptions } from './amap';
2
- import type { MapUtilsConstructor } from '../MapUtils';
3
- import type {
4
- MarkerLayerIns,
5
- LabelMarkerLayerIns,
6
- MarkerClusterLayerIns,
7
- BaseMarkerLayerTypeIns,
8
- } from '../layers/index';
9
-
10
- interface BaseMarkerLayerInfo {
11
- markerLayer: {
12
- layerIns: MarkerLayerIns;
13
- overlayOpts: AMap.MarkerOptions;
14
- ovIns: AMap.Marker;
15
- };
16
- labelMarkerLayer: {
17
- layerIns: LabelMarkerLayerIns;
18
- overlayOpts: AMap.LabelMarkerOptions;
19
- ovIns: AMap.LabelMarker;
20
- };
21
- }
22
- //定义图层信息
23
- type MarkerLayerBaseType = 'markerLayer' | 'labelMarkerLayer';
24
-
25
- export interface OverlayData<T extends object = {}> {
26
- overlayData: {
27
- lon: number;
28
- lat: number;
29
- title: string;
30
- id: string;
31
- extData: T;
32
- weight?: number;
33
- };
34
- id: string;
35
- // 覆盖物配置数据
36
- labelShowed: boolean;
37
- overlaySelected: boolean; // 当前marker是否被选中
38
- }
39
-
40
- interface LayerOpts<
41
- U = {},
42
- T extends MarkerLayerBaseType = 'markerLayer',
43
- V = BaseMarkerLayerInfo[T],
44
- > {
45
- layerType: T;
46
- layerName: string;
47
- overlayList: Array<OverlayData<U>>;
48
- createOverlays: (mapUtilsIns) => Array<V['overlayIns']>; // 未使用上
49
- getIconUrl: (item: OverlayData<U>) => string; //overlayList中优先级更高
50
- getOverlayOpts: (
51
- item: OverlayData<U>,
52
- index: number,
53
- MapUtils: MapUtilsConstructor
54
- ) => V['overlayOpts']; //动态生成覆盖物配置
55
- overlayLayer?: AMap.LabelsLayerOptions;
56
- }
57
-
58
- interface OverlaysLayer<T, U> {
59
- rawLayer: U;
60
-
61
- //创建覆盖物
62
- createOverlays: (ovOptList: Array<any>) => Array<T>;
63
-
64
- add(markers: Array<any>): void;
65
-
66
- remove(markers: Array<T>): void;
67
-
68
- hide(): void;
69
-
70
- show(): void;
71
-
72
- getAllOverlay(): void;
73
-
74
- destroy: () => void;
75
-
76
- reload: () => void;
77
-
78
- //覆盖物自动适应
79
- overlayFitMap: () => void;
80
- }
81
-
82
- export type {
83
- BaseMarkerLayerInfo,
84
- MarkerLayerBaseType,
85
- LayerOpts,
86
- OverlaysLayer,
87
- };
1
+ import type { MarkerOptions } from './amap';
2
+ import type { MapUtilsConstructor } from '../MapUtils';
3
+ import type {
4
+ MarkerLayerIns,
5
+ LabelMarkerLayerIns,
6
+ MarkerClusterLayerIns,
7
+ BaseMarkerLayerTypeIns,
8
+ } from '../layers/index';
9
+
10
+ interface BaseMarkerLayerInfo {
11
+ markerLayer: {
12
+ layerIns: MarkerLayerIns;
13
+ overlayOpts: AMap.MarkerOptions;
14
+ ovIns: AMap.Marker;
15
+ };
16
+ labelMarkerLayer: {
17
+ layerIns: LabelMarkerLayerIns;
18
+ overlayOpts: AMap.LabelMarkerOptions;
19
+ ovIns: AMap.LabelMarker;
20
+ };
21
+ }
22
+ //定义图层信息
23
+ type MarkerLayerBaseType = 'markerLayer' | 'labelMarkerLayer';
24
+
25
+ export interface OverlayData<T extends object = {}> {
26
+ overlayData: {
27
+ lon: number;
28
+ lat: number;
29
+ title: string;
30
+ id: string;
31
+ extData: T;
32
+ weight?: number;
33
+ };
34
+ id: string;
35
+ // 覆盖物配置数据
36
+ labelShowed: boolean;
37
+ overlaySelected: boolean; // 当前marker是否被选中
38
+ }
39
+
40
+ interface LayerOpts<
41
+ U = {},
42
+ T extends MarkerLayerBaseType = 'markerLayer',
43
+ V = BaseMarkerLayerInfo[T],
44
+ > {
45
+ layerType: T;
46
+ layerName: string;
47
+ overlayList: Array<OverlayData<U>>;
48
+ createOverlays: (mapUtilsIns) => Array<V['overlayIns']>; // 未使用上
49
+ getIconUrl: (item: OverlayData<U>) => string; //overlayList中优先级更高
50
+ getOverlayOpts: (
51
+ item: OverlayData<U>,
52
+ index: number,
53
+ MapUtils: MapUtilsConstructor
54
+ ) => V['overlayOpts']; //动态生成覆盖物配置
55
+ overlayLayer?: AMap.LabelsLayerOptions;
56
+ }
57
+
58
+ interface OverlaysLayer<T, U> {
59
+ rawLayer: U;
60
+
61
+ //创建覆盖物
62
+ createOverlays: (ovOptList: Array<any>) => Array<T>;
63
+
64
+ add(markers: Array<any>): void;
65
+
66
+ remove(markers: Array<T>): void;
67
+
68
+ hide(): void;
69
+
70
+ show(): void;
71
+
72
+ getAllOverlay(): void;
73
+
74
+ destroy: () => void;
75
+
76
+ reload: () => void;
77
+
78
+ //覆盖物自动适应
79
+ overlayFitMap: () => void;
80
+ }
81
+
82
+ export type {
83
+ BaseMarkerLayerInfo,
84
+ MarkerLayerBaseType,
85
+ LayerOpts,
86
+ OverlaysLayer,
87
+ };