gdmap-utils 1.2.0 → 1.2.2
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/.husky/pre-commit +1 -1
- package/.prettierrc.json +17 -17
- package/README.md +2 -50
- package/dist/index.js +1 -83
- package/dist/index.js.map +1 -1
- package/examples/1_init.html +23 -23
- package/examples/2_mapInit.html +48 -48
- package/examples/3_MarkerLayer.html +565 -565
- package/examples/4_LabelMarkerLayer.html +574 -574
- package/index.html +134 -134
- package/package.json +48 -48
- package/src/LayerManager.ts +49 -49
- package/src/MapSourceImport.ts +23 -23
- package/src/MapUtils.ts +154 -154
- package/src/gdMap/gdHelper.js +194 -194
- package/src/gdMap/gdHelper.ts +85 -85
- package/src/gdMapUtils.js +377 -377
- package/src/index.ts +1 -1
- package/src/layers/baseMarkerLayer/LabelMarkerLayer.ts +238 -238
- package/src/layers/baseMarkerLayer/MarkerLayer.ts +206 -206
- package/src/layers/baseMarkerLayer/index.ts +354 -354
- package/src/{layers copy/MarkerClusterLayer.js → layers/clusterMarkerLayer/MarkerClusterLayer.js} +155 -155
- package/src/layers/{MarkerClusterLayer.ts → clusterMarkerLayer/MarkerClusterLayer.ts} +30 -30
- package/src/layers/index.ts +5 -5
- package/src/types/BaseMarkerLayer.d.ts +87 -87
- package/src/types/MapUtils.d.ts +53 -53
- package/src/types/amap.d.ts +11 -11
- package/src/types/index.d.ts +12 -12
- package/tsconfig.json +26 -26
- package/webpack.config.js +126 -126
- package/src/layers copy/LabelMarkerLayer.js +0 -122
- package/src/layers copy/MarkerLayer.js +0 -267
- package/src/layers copy/OverlayGroupManager.js +0 -254
- package/src/layers copy/index.ts +0 -0
package/src/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { initMapSource, createMapUtils, MapUtils } from './MapUtils';
|
|
1
|
+
export { initMapSource, createMapUtils, MapUtils } from './MapUtils';
|
|
@@ -1,238 +1,238 @@
|
|
|
1
|
-
import type { OverlaysLayer, mapIns, OverlayData } from '@/types';
|
|
2
|
-
import type { MapUtilsConstructor } from '@/MapUtils';
|
|
3
|
-
import { MapUtils } from '@/MapUtils';
|
|
4
|
-
|
|
5
|
-
class LabelMarkerLayer {
|
|
6
|
-
rawLayer: AMap.LabelsLayer;
|
|
7
|
-
|
|
8
|
-
map: mapIns;
|
|
9
|
-
|
|
10
|
-
events = new Map<AMap.EventType, () => void>();
|
|
11
|
-
|
|
12
|
-
constructor(map: mapIns, opts?: AMap.LabelsLayerOptions) {
|
|
13
|
-
this.map = map;
|
|
14
|
-
|
|
15
|
-
this.rawLayer = new AMap.LabelsLayer({
|
|
16
|
-
collision: true,
|
|
17
|
-
opacity: 1,
|
|
18
|
-
zIndex: 120,
|
|
19
|
-
allowCollision: true,
|
|
20
|
-
...opts,
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
this.map.add(this.rawLayer);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* 将覆盖物数据转换为标记配置
|
|
28
|
-
* @param item 覆盖物数据
|
|
29
|
-
* @param index 索引
|
|
30
|
-
* @param getIconUrl 获取图标URL的方法
|
|
31
|
-
* @param getOverlayOpts 动态获取覆盖物配置的方法
|
|
32
|
-
* @param MapUtils MapUtils构造函数
|
|
33
|
-
* @returns 标记配置
|
|
34
|
-
*/
|
|
35
|
-
static convertOverlayDataToOvlOpts<U extends {}>(
|
|
36
|
-
item: OverlayData<U>,
|
|
37
|
-
index: number,
|
|
38
|
-
getIconUrl: (item: OverlayData<U>) => string,
|
|
39
|
-
getOverlayOpts: (
|
|
40
|
-
item: OverlayData<U>,
|
|
41
|
-
index: number,
|
|
42
|
-
MapUtils: MapUtilsConstructor
|
|
43
|
-
) => any,
|
|
44
|
-
MapUtils: MapUtilsConstructor
|
|
45
|
-
): AMap.LabelMarkerOptions {
|
|
46
|
-
const {
|
|
47
|
-
overlayData: { lon, lat, extData, title },
|
|
48
|
-
} = item;
|
|
49
|
-
|
|
50
|
-
// 获取当前覆盖物项的动态配置
|
|
51
|
-
const itemOpts = getOverlayOpts(item, index, MapUtils);
|
|
52
|
-
|
|
53
|
-
const ovlOpts: AMap.LabelMarkerOptions = {
|
|
54
|
-
position: [lon, lat],
|
|
55
|
-
extData,
|
|
56
|
-
...itemOpts,
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
if (!item.labelShowed) {
|
|
60
|
-
const textOpts = ovlOpts.text ?? {
|
|
61
|
-
content: title,
|
|
62
|
-
direction: 'top',
|
|
63
|
-
style: {
|
|
64
|
-
fontSize: 16,
|
|
65
|
-
strokeWidth: 5,
|
|
66
|
-
},
|
|
67
|
-
zooms: [5, 20],
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
textOpts.content = '';
|
|
71
|
-
|
|
72
|
-
ovlOpts.text = textOpts;
|
|
73
|
-
} else {
|
|
74
|
-
ovlOpts.text = ovlOpts.text ?? {
|
|
75
|
-
content: title,
|
|
76
|
-
direction: 'top',
|
|
77
|
-
style: {
|
|
78
|
-
fontSize: 16,
|
|
79
|
-
strokeWidth: 5,
|
|
80
|
-
},
|
|
81
|
-
zooms: [5, 20],
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const imageUrl = getIconUrl(item);
|
|
86
|
-
|
|
87
|
-
const icon = {
|
|
88
|
-
image: '',
|
|
89
|
-
size: [25, 34] as [number, number],
|
|
90
|
-
anchor: 'bottom-center',
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
ovlOpts.icon = ovlOpts.icon ?? icon;
|
|
94
|
-
|
|
95
|
-
ovlOpts.icon.image = imageUrl;
|
|
96
|
-
|
|
97
|
-
return ovlOpts as AMap.LabelMarkerOptions;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
bindEventOverlay(clickType: AMap.EventType, callback: () => void) {
|
|
101
|
-
if (typeof callback !== 'function') {
|
|
102
|
-
MapUtils.error('Please provide an event callback function');
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
this.on(clickType, callback);
|
|
107
|
-
|
|
108
|
-
this.events.set(clickType, callback);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
addOverlayBindEvent(marker: InstanceType<typeof AMap.LabelMarker>) {
|
|
112
|
-
this.events.forEach((callback, clickType) => {
|
|
113
|
-
marker.on(clickType, callback);
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
createOverlays(ovOptList: Array<AMap.LabelMarkerOptions>) {
|
|
118
|
-
const labelMarkers = ovOptList.map(item => {
|
|
119
|
-
const labelMarker = new AMap.LabelMarker(item); //包装吗?
|
|
120
|
-
this.addOverlayBindEvent(labelMarker);
|
|
121
|
-
return labelMarker;
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
//@ts-expect-error
|
|
125
|
-
this.rawLayer.add(labelMarkers);
|
|
126
|
-
|
|
127
|
-
return labelMarkers;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
add(markers: Array<AMap.LabelMarkerOptions>) {
|
|
131
|
-
this.createOverlays(markers);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
remove(markers: Array<AMap.LabelMarker>) {
|
|
135
|
-
//@ts-expect-error
|
|
136
|
-
this.rawLayer.remove(markers);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
hide() {
|
|
140
|
-
this.rawLayer.hide();
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
show() {
|
|
144
|
-
this.rawLayer.show();
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
getAllOverlay(): AMap.LabelMarker[] {
|
|
148
|
-
//@ts-expect-error
|
|
149
|
-
return this.rawLayer.getAllOverlays();
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
destroy() {
|
|
153
|
-
// @ts-expect-error
|
|
154
|
-
this.rawLayer.clear();
|
|
155
|
-
|
|
156
|
-
this.map.remove(this.rawLayer);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
reload() {
|
|
160
|
-
// @ts-expect-error
|
|
161
|
-
this.rawLayer.clear();
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
clearAllOvl() {
|
|
165
|
-
// @ts-expect-error
|
|
166
|
-
this.rawLayer.clear();
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
overlayFitMap() {
|
|
170
|
-
const labelMarkers = this.getAllOverlay();
|
|
171
|
-
this.map.setFitView(labelMarkers);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
findLayerOverlay(markerId: string | number) {
|
|
175
|
-
if (!markerId) {
|
|
176
|
-
MapUtils.error('Please provide a markerId');
|
|
177
|
-
return null;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const labelMarkers: InstanceType<typeof AMap.LabelMarker>[] =
|
|
181
|
-
this.getAllOverlay();
|
|
182
|
-
|
|
183
|
-
const labelMarker = labelMarkers.find(item => {
|
|
184
|
-
return item.getExtData().id === markerId;
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
return labelMarker;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
refreshOverlayIcon(
|
|
191
|
-
labelMarker: InstanceType<typeof AMap.LabelMarker>,
|
|
192
|
-
iconOpts: AMap.LabelMarkerIconOptions
|
|
193
|
-
) {
|
|
194
|
-
if (!labelMarker) {
|
|
195
|
-
MapUtils.error('labelMarker is not found');
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
labelMarker.setIcon(iconOpts);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
refreshOverlayLabel(
|
|
203
|
-
labelMarker: InstanceType<typeof AMap.LabelMarker>,
|
|
204
|
-
labelOpts?: AMap.LabelMarkerTextOptions
|
|
205
|
-
) {
|
|
206
|
-
if (!labelMarker) {
|
|
207
|
-
MapUtils.error('labelMarker is not found');
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
if (labelOpts) {
|
|
212
|
-
labelMarker.setText(labelOpts);
|
|
213
|
-
} else {
|
|
214
|
-
const currentLabel = labelMarker.getText();
|
|
215
|
-
labelMarker.setText({
|
|
216
|
-
...currentLabel,
|
|
217
|
-
content: '', //清空可以生效吗
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
*
|
|
224
|
-
* labelLayer不存在on方法
|
|
225
|
-
* @param {AMap.EventType} clickType 事件类型
|
|
226
|
-
* @param {() => void} callback 事件函数
|
|
227
|
-
* @memberof LabelMarkerLayer
|
|
228
|
-
*/
|
|
229
|
-
on(clickType: AMap.EventType, callback: () => void) {
|
|
230
|
-
const labelMarkers = this.getAllOverlay();
|
|
231
|
-
|
|
232
|
-
labelMarkers.forEach(labelMarker => {
|
|
233
|
-
labelMarker.on(clickType, callback);
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
export default LabelMarkerLayer;
|
|
1
|
+
import type { OverlaysLayer, mapIns, OverlayData } from '@/types';
|
|
2
|
+
import type { MapUtilsConstructor } from '@/MapUtils';
|
|
3
|
+
import { MapUtils } from '@/MapUtils';
|
|
4
|
+
|
|
5
|
+
class LabelMarkerLayer {
|
|
6
|
+
rawLayer: AMap.LabelsLayer;
|
|
7
|
+
|
|
8
|
+
map: mapIns;
|
|
9
|
+
|
|
10
|
+
events = new Map<AMap.EventType, () => void>();
|
|
11
|
+
|
|
12
|
+
constructor(map: mapIns, opts?: AMap.LabelsLayerOptions) {
|
|
13
|
+
this.map = map;
|
|
14
|
+
|
|
15
|
+
this.rawLayer = new AMap.LabelsLayer({
|
|
16
|
+
collision: true,
|
|
17
|
+
opacity: 1,
|
|
18
|
+
zIndex: 120,
|
|
19
|
+
allowCollision: true,
|
|
20
|
+
...opts,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
this.map.add(this.rawLayer);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 将覆盖物数据转换为标记配置
|
|
28
|
+
* @param item 覆盖物数据
|
|
29
|
+
* @param index 索引
|
|
30
|
+
* @param getIconUrl 获取图标URL的方法
|
|
31
|
+
* @param getOverlayOpts 动态获取覆盖物配置的方法
|
|
32
|
+
* @param MapUtils MapUtils构造函数
|
|
33
|
+
* @returns 标记配置
|
|
34
|
+
*/
|
|
35
|
+
static convertOverlayDataToOvlOpts<U extends {}>(
|
|
36
|
+
item: OverlayData<U>,
|
|
37
|
+
index: number,
|
|
38
|
+
getIconUrl: (item: OverlayData<U>) => string,
|
|
39
|
+
getOverlayOpts: (
|
|
40
|
+
item: OverlayData<U>,
|
|
41
|
+
index: number,
|
|
42
|
+
MapUtils: MapUtilsConstructor
|
|
43
|
+
) => any,
|
|
44
|
+
MapUtils: MapUtilsConstructor
|
|
45
|
+
): AMap.LabelMarkerOptions {
|
|
46
|
+
const {
|
|
47
|
+
overlayData: { lon, lat, extData, title },
|
|
48
|
+
} = item;
|
|
49
|
+
|
|
50
|
+
// 获取当前覆盖物项的动态配置
|
|
51
|
+
const itemOpts = getOverlayOpts(item, index, MapUtils);
|
|
52
|
+
|
|
53
|
+
const ovlOpts: AMap.LabelMarkerOptions = {
|
|
54
|
+
position: [lon, lat],
|
|
55
|
+
extData,
|
|
56
|
+
...itemOpts,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
if (!item.labelShowed) {
|
|
60
|
+
const textOpts = ovlOpts.text ?? {
|
|
61
|
+
content: title,
|
|
62
|
+
direction: 'top',
|
|
63
|
+
style: {
|
|
64
|
+
fontSize: 16,
|
|
65
|
+
strokeWidth: 5,
|
|
66
|
+
},
|
|
67
|
+
zooms: [5, 20],
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
textOpts.content = '';
|
|
71
|
+
|
|
72
|
+
ovlOpts.text = textOpts;
|
|
73
|
+
} else {
|
|
74
|
+
ovlOpts.text = ovlOpts.text ?? {
|
|
75
|
+
content: title,
|
|
76
|
+
direction: 'top',
|
|
77
|
+
style: {
|
|
78
|
+
fontSize: 16,
|
|
79
|
+
strokeWidth: 5,
|
|
80
|
+
},
|
|
81
|
+
zooms: [5, 20],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const imageUrl = getIconUrl(item);
|
|
86
|
+
|
|
87
|
+
const icon = {
|
|
88
|
+
image: '',
|
|
89
|
+
size: [25, 34] as [number, number],
|
|
90
|
+
anchor: 'bottom-center',
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
ovlOpts.icon = ovlOpts.icon ?? icon;
|
|
94
|
+
|
|
95
|
+
ovlOpts.icon.image = imageUrl;
|
|
96
|
+
|
|
97
|
+
return ovlOpts as AMap.LabelMarkerOptions;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
bindEventOverlay(clickType: AMap.EventType, callback: () => void) {
|
|
101
|
+
if (typeof callback !== 'function') {
|
|
102
|
+
MapUtils.error('Please provide an event callback function');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
this.on(clickType, callback);
|
|
107
|
+
|
|
108
|
+
this.events.set(clickType, callback);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
addOverlayBindEvent(marker: InstanceType<typeof AMap.LabelMarker>) {
|
|
112
|
+
this.events.forEach((callback, clickType) => {
|
|
113
|
+
marker.on(clickType, callback);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
createOverlays(ovOptList: Array<AMap.LabelMarkerOptions>) {
|
|
118
|
+
const labelMarkers = ovOptList.map(item => {
|
|
119
|
+
const labelMarker = new AMap.LabelMarker(item); //包装吗?
|
|
120
|
+
this.addOverlayBindEvent(labelMarker);
|
|
121
|
+
return labelMarker;
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
//@ts-expect-error
|
|
125
|
+
this.rawLayer.add(labelMarkers);
|
|
126
|
+
|
|
127
|
+
return labelMarkers;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
add(markers: Array<AMap.LabelMarkerOptions>) {
|
|
131
|
+
this.createOverlays(markers);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
remove(markers: Array<AMap.LabelMarker>) {
|
|
135
|
+
//@ts-expect-error
|
|
136
|
+
this.rawLayer.remove(markers);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
hide() {
|
|
140
|
+
this.rawLayer.hide();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
show() {
|
|
144
|
+
this.rawLayer.show();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
getAllOverlay(): AMap.LabelMarker[] {
|
|
148
|
+
//@ts-expect-error
|
|
149
|
+
return this.rawLayer.getAllOverlays();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
destroy() {
|
|
153
|
+
// @ts-expect-error
|
|
154
|
+
this.rawLayer.clear();
|
|
155
|
+
|
|
156
|
+
this.map.remove(this.rawLayer);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
reload() {
|
|
160
|
+
// @ts-expect-error
|
|
161
|
+
this.rawLayer.clear();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
clearAllOvl() {
|
|
165
|
+
// @ts-expect-error
|
|
166
|
+
this.rawLayer.clear();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
overlayFitMap() {
|
|
170
|
+
const labelMarkers = this.getAllOverlay();
|
|
171
|
+
this.map.setFitView(labelMarkers);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
findLayerOverlay(markerId: string | number) {
|
|
175
|
+
if (!markerId) {
|
|
176
|
+
MapUtils.error('Please provide a markerId');
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const labelMarkers: InstanceType<typeof AMap.LabelMarker>[] =
|
|
181
|
+
this.getAllOverlay();
|
|
182
|
+
|
|
183
|
+
const labelMarker = labelMarkers.find(item => {
|
|
184
|
+
return item.getExtData().id === markerId;
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
return labelMarker;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
refreshOverlayIcon(
|
|
191
|
+
labelMarker: InstanceType<typeof AMap.LabelMarker>,
|
|
192
|
+
iconOpts: AMap.LabelMarkerIconOptions
|
|
193
|
+
) {
|
|
194
|
+
if (!labelMarker) {
|
|
195
|
+
MapUtils.error('labelMarker is not found');
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
labelMarker.setIcon(iconOpts);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
refreshOverlayLabel(
|
|
203
|
+
labelMarker: InstanceType<typeof AMap.LabelMarker>,
|
|
204
|
+
labelOpts?: AMap.LabelMarkerTextOptions
|
|
205
|
+
) {
|
|
206
|
+
if (!labelMarker) {
|
|
207
|
+
MapUtils.error('labelMarker is not found');
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (labelOpts) {
|
|
212
|
+
labelMarker.setText(labelOpts);
|
|
213
|
+
} else {
|
|
214
|
+
const currentLabel = labelMarker.getText();
|
|
215
|
+
labelMarker.setText({
|
|
216
|
+
...currentLabel,
|
|
217
|
+
content: '', //清空可以生效吗
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
*
|
|
224
|
+
* labelLayer不存在on方法
|
|
225
|
+
* @param {AMap.EventType} clickType 事件类型
|
|
226
|
+
* @param {() => void} callback 事件函数
|
|
227
|
+
* @memberof LabelMarkerLayer
|
|
228
|
+
*/
|
|
229
|
+
on(clickType: AMap.EventType, callback: () => void) {
|
|
230
|
+
const labelMarkers = this.getAllOverlay();
|
|
231
|
+
|
|
232
|
+
labelMarkers.forEach(labelMarker => {
|
|
233
|
+
labelMarker.on(clickType, callback);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export default LabelMarkerLayer;
|