gdmap-utils 1.2.3 → 1.2.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.
- package/.husky/pre-commit +1 -1
- package/.prettierrc.json +17 -17
- package/README.md +467 -2
- package/dist/index.js +127 -7
- package/dist/index.js.map +1 -1
- package/docs/classes/MapUtils.md +153 -0
- package/docs/functions/createMapUtils.md +18 -0
- package/docs/functions/initMapSource.md +14 -0
- package/docs/globals.md +11 -0
- 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/examples/5_markerCluster.html +528 -0
- package/index.html +134 -134
- package/package.json +54 -51
- package/scripts/cleanDocs.js +220 -0
- package/scripts/mergeDocs.js +129 -0
- package/src/LayerManager.ts +17 -1
- package/src/MapSourceImport.ts +23 -23
- package/src/MapUtils.ts +198 -22
- package/src/gdMap/gdHelper.ts +113 -85
- package/src/index.ts +3 -1
- package/src/layers/baseMarkerLayer/LabelMarkerLayer.ts +240 -240
- package/src/layers/baseMarkerLayer/MarkerLayer.ts +208 -208
- package/src/layers/baseMarkerLayer/index.ts +369 -354
- package/src/layers/clusterMarkerLayer/MarkerClusterLayer.ts +53 -53
- package/src/layers/clusterMarkerLayer/index.ts +204 -177
- package/src/layers/index.ts +9 -9
- package/src/types/MapUtils.d.ts +53 -53
- package/src/types/amap.d.ts +11 -11
- package/src/types/{BaseMarkerLayer.d.ts → baseMarkerLayer.d.ts} +86 -87
- package/src/types/clusterMarkerLayer.d.ts +89 -88
- package/src/types/index.d.ts +14 -14
- package/tsconfig.json +26 -26
- package/typedoc.json +22 -0
- package/webpack.config.js +125 -126
- package/src/gdMap/gdHelper.js +0 -194
package/.husky/pre-commit
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
npx lint-staged
|
|
1
|
+
npx lint-staged
|
package/.prettierrc.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
{
|
|
2
|
-
"printWidth": 80,
|
|
3
|
-
"tabWidth": 2,
|
|
4
|
-
"useTabs": false,
|
|
5
|
-
"semi": true,
|
|
6
|
-
"singleQuote": true,
|
|
7
|
-
"quoteProps": "as-needed",
|
|
8
|
-
"jsxSingleQuote": false,
|
|
9
|
-
"trailingComma": "es5",
|
|
10
|
-
"bracketSpacing": true,
|
|
11
|
-
"bracketSameLine": false,
|
|
12
|
-
"arrowParens": "avoid",
|
|
13
|
-
"requirePragma": false,
|
|
14
|
-
"insertPragma": false,
|
|
15
|
-
"proseWrap": "preserve",
|
|
16
|
-
"htmlWhitespaceSensitivity": "css",
|
|
17
|
-
"endOfLine": "auto"
|
|
1
|
+
{
|
|
2
|
+
"printWidth": 80,
|
|
3
|
+
"tabWidth": 2,
|
|
4
|
+
"useTabs": false,
|
|
5
|
+
"semi": true,
|
|
6
|
+
"singleQuote": true,
|
|
7
|
+
"quoteProps": "as-needed",
|
|
8
|
+
"jsxSingleQuote": false,
|
|
9
|
+
"trailingComma": "es5",
|
|
10
|
+
"bracketSpacing": true,
|
|
11
|
+
"bracketSameLine": false,
|
|
12
|
+
"arrowParens": "avoid",
|
|
13
|
+
"requirePragma": false,
|
|
14
|
+
"insertPragma": false,
|
|
15
|
+
"proseWrap": "preserve",
|
|
16
|
+
"htmlWhitespaceSensitivity": "css",
|
|
17
|
+
"endOfLine": "auto"
|
|
18
18
|
}
|
package/README.md
CHANGED
|
@@ -1,2 +1,467 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# gdmap-utils
|
|
2
|
+
为什么写`gdmap-utils`
|
|
3
|
+
1. 公司许多业务与地图相关 (地图厂商为高德)创建工具函数统一地图使用风格提高代码一致性,
|
|
4
|
+
2. 公司大屏业务深度依赖地图能力(基于高德地图),涉及车辆监控、站点管理、设施分布等多类场景,地图覆盖物类型繁多(车辆、中转站、公厕、压缩站等)第一版开发采用分散式实现,为每种覆盖物独立编写控制逻辑(显隐切换、标签管理、生命周期控制)。随着覆盖物类型增加,代码出现高度重复——同类逻辑分散在数十个方法中,导致:"维护成本高,一致性难保障,新增效率低"。工具库引入统一的图层管理来解决上述问题
|
|
5
|
+
|
|
6
|
+
# 特性
|
|
7
|
+
|
|
8
|
+
1. 将 `AMap.Marker`, `AMap.LabelMarker`, `AMap.MarkerCluster` 统一封装为图层,支持图层显示/隐藏、覆盖物增删查改、事件绑定等功能
|
|
9
|
+
2. 数据驱动的覆盖物更新:图标和标签与数据属性关联,属性发生变化调用 `refreshOverlayIcon` / `refreshOverlayLabel` 即可实现刷新
|
|
10
|
+
3. 灵活的初始化方式:支持创建新地图实例或包装已有实例
|
|
11
|
+
4. 工具函数集成:封装常用的 Map 实例方法和 AMap 静态工具方法(自己可以根据需要自定义形参默认值,当然得自己手动改)
|
|
12
|
+
5. TypeScript 全支持:完整的类型定义和泛型支持
|
|
13
|
+
|
|
14
|
+
# 示例
|
|
15
|
+
|
|
16
|
+
📖 使用示例请参考 `examples` 目录,在 `HtmlWebpackPlugin` 配置中通过 `template` 指定启动页面
|
|
17
|
+
|
|
18
|
+
# install
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
$ yarn add gdmap-utils
|
|
22
|
+
$ npm install gdmap-utils
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
# API
|
|
26
|
+
|
|
27
|
+
## initMapSource
|
|
28
|
+
|
|
29
|
+
高德地图环境加载`initMapSource(Opts: loaderOpts)`, 使用示例如下:
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
type loaderOpts = {
|
|
33
|
+
key: string;
|
|
34
|
+
version: string;
|
|
35
|
+
plugins?: string[] | undefined;
|
|
36
|
+
AMapUI?: {
|
|
37
|
+
version?: string | undefined;
|
|
38
|
+
plugins?: string[] | undefined;
|
|
39
|
+
} | undefined;
|
|
40
|
+
Loca?: {
|
|
41
|
+
version?: string | undefined;
|
|
42
|
+
} | undefined;
|
|
43
|
+
}
|
|
44
|
+
const loaderOpts = {
|
|
45
|
+
version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
|
|
46
|
+
plugins: ['AMap.MapType', 'AMap.MoveAnimation'], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
|
|
47
|
+
key: 'xxxxxx',
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
initMapSource(loaderOpts)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## createMapUtils
|
|
54
|
+
|
|
55
|
+
`createMapUtils(opts,loaderOPts)`为`MapUtils`的工厂函数, `opts`配置对象在高德`MapOptions`基础上扩展`mapIns,mountSelector`两个属性。
|
|
56
|
+
`mapIns`为**高德地图实例对象**,地图已存在将其包装成`MapUtils`实例并扩展相关功能。 `mountSelector`为DOM选择器,地图不存在创建`MapUtils`实例。
|
|
57
|
+
`loaderOpts`加载器配置用于配置高德地图相关依赖。文档参照 [`loaderOpts`](#initmapsource)
|
|
58
|
+
|
|
59
|
+
[mapOptions 配置对象文档](https://lbs.amap.com/api/javascript-api-v2/documentation#map)
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
interface MapUtilsCreateOpts extends MapOptions {
|
|
63
|
+
mountSelector: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
interface MapUtilsUseExistingOpts extends MapOptions {
|
|
67
|
+
mapIns: mapIns;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
type MapUtilsOpts = {
|
|
71
|
+
MapUtilsUseExistingOpts: MapUtilsUseExistingOpts;
|
|
72
|
+
MapUtilsCreateOpts: MapUtilsCreateOpts;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// ts函数声明
|
|
76
|
+
function createMapUtils(
|
|
77
|
+
opts: MapUtilsOpts[keyof MapUtilsOpts],//类型等于 MapUtilsCreateOpts | MapUtilsUseExistingOpts
|
|
78
|
+
loaderOPts?: loaderOpts //对象结构参照loaderOpts
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## MapUtils
|
|
84
|
+
`MapUtils`实例用于管理图层,`mapUtils`实例对象请通过`createMapUtils`创建,它的主要功能: “图层管理、地图实例常用方法包装、地图常用`AMap`方法包装”。
|
|
85
|
+
|
|
86
|
+
### MapUtils静态方法
|
|
87
|
+
|
|
88
|
+
#### createAMapMarker
|
|
89
|
+
`createAMapMarker`为`AMap.Marker`函数的包装用于创建Marker覆盖物,函数类型声明如下:
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
createAMapMarker(options: AMap.MarkerOptions): AMap.Marker
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
#### createIcon
|
|
96
|
+
`createIcon`为`AMap.Icon`函数的包装用于创建图标对象,函数类型声明如下:
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
createIcon(opts: {
|
|
100
|
+
size: [number, number]; // 图标尺寸 [width, height]
|
|
101
|
+
image: string; // 图片URL地址
|
|
102
|
+
imageSize: [number, number]; // 图片大小 [width, height]
|
|
103
|
+
imageOffset: [number, number]; // 取图偏移量 [x, y]
|
|
104
|
+
}): AMap.Icon
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### Size
|
|
108
|
+
`Size`为`AMap.Size`函数的包装用于创建像素尺寸,函数类型声明如下:
|
|
109
|
+
|
|
110
|
+
```javascript
|
|
111
|
+
Size(width: number, height: number): AMap.Size
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
#### Pixel
|
|
115
|
+
`Pixel`为`AMap.Pixel`函数的包装用于创建像素坐标(确定地图上的一个像素点),函数类型声明如下:
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
Pixel(x: number, y: number): AMap.Pixel
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
#### LngLat
|
|
122
|
+
`LngLat`为`AMap.LngLat`函数的包装用于创建经纬度坐标(描述地图上的一个点位置),函数类型声明如下:
|
|
123
|
+
|
|
124
|
+
```javascript
|
|
125
|
+
LngLat(lng: number, lat: number, noWrap?: boolean): AMap.LngLat
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### createAMapInfoWindow
|
|
129
|
+
`createAMapInfoWindow`为`AMap.InfoWindow`函数的包装用于创建信息窗体,默认`isCustom=true`、`closeWhenClickMap=true`,函数类型声明如下:
|
|
130
|
+
|
|
131
|
+
```javascript
|
|
132
|
+
createAMapInfoWindow(opts: AMap.InfoWindowOptions): AMap.InfoWindow
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
#### createAMapPolyline
|
|
136
|
+
`createAMapPolyline`为`new AMap.Polyline`函数的包装用于创建折线,默认配置`showDir=true`、`lineJoin='round'`、`strokeColor='#28F'`、`strokeOpacity=1`、`strokeWeight=6`,函数类型声明如下:
|
|
137
|
+
|
|
138
|
+
```javascript
|
|
139
|
+
createAMapPolyline(options: AMap.PolylineOptions): AMap.Polyline
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
#### loadPlugins
|
|
143
|
+
`loadPlugins`用于动态加载高德地图插件,函数类型声明如下:
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
loadPlugins(plugins: string | string[]): Promise<void>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
使用示例:
|
|
150
|
+
|
|
151
|
+
```javascript
|
|
152
|
+
await MapUtils.loadPlugins(['AMap.MapType', 'AMap.MoveAnimation']);
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### MapUtils实例方法
|
|
156
|
+
|
|
157
|
+
#### seZoomAndCenter
|
|
158
|
+
`seZoomAndCenter`用于将地图视野切换成指定的状态,函数声明如下:
|
|
159
|
+
|
|
160
|
+
```javascript
|
|
161
|
+
seZoomAndCenter(opts: {
|
|
162
|
+
zoom: number; // 目标缩放级别, zoom不传参默认使用当前层级
|
|
163
|
+
center: AMap.LngLat | [number, number]; // 目标中心点, center不传参默认使用当前中心位置
|
|
164
|
+
immediately?: boolean; // 是否立即跳转,默认平滑过渡
|
|
165
|
+
duration?: number; // 过渡动画时长(毫秒)
|
|
166
|
+
}): void
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
使用示例:
|
|
170
|
+
|
|
171
|
+
```javascript
|
|
172
|
+
// 平滑跳转到指定位置和缩放级别
|
|
173
|
+
mapUtils.seZoomAndCenter({
|
|
174
|
+
zoom: 14,
|
|
175
|
+
center: [116.397428, 39.90923],
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// 立即跳转到指定位置
|
|
179
|
+
mapUtils.seZoomAndCenter({
|
|
180
|
+
zoom: 16,
|
|
181
|
+
center: [116.397428, 39.90923],
|
|
182
|
+
immediately: true,
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
#### clearInfoWindow
|
|
187
|
+
`clearInfoWindow`用于将`AMap.InfoWindow`创建的信息窗体关闭,函数声明如下:
|
|
188
|
+
|
|
189
|
+
```javascript
|
|
190
|
+
clearInfoWindow(): void
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
使用示例:
|
|
194
|
+
|
|
195
|
+
```javascript
|
|
196
|
+
// 关闭地图上所有信息窗体
|
|
197
|
+
mapUtils.clearInfoWindow();
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
#### setFitView
|
|
201
|
+
`setFitView`用于根据地图覆盖物分布情况,自动缩放地图到合适视野级别,函数声明如下:
|
|
202
|
+
|
|
203
|
+
```javascript
|
|
204
|
+
setFitView(
|
|
205
|
+
overlays?: Array<any>, // 覆盖物数组,缺省为全部覆盖物
|
|
206
|
+
immediately?: boolean, // 是否立即过渡
|
|
207
|
+
avoid?: Array<number>, // 四周边距 [上, 下, 左, 右]
|
|
208
|
+
maxZoom?: number // 最大地图zoom级别
|
|
209
|
+
): void
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
使用示例:
|
|
213
|
+
|
|
214
|
+
```javascript
|
|
215
|
+
// 自动调整视野以显示所有覆盖物
|
|
216
|
+
mapUtils.setFitView();
|
|
217
|
+
|
|
218
|
+
// 调整视野显示指定覆盖物,并设置最大缩放级别
|
|
219
|
+
mapUtils.setFitView([marker1, marker2], false, [60, 60, 60, 60], 16);
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
#### bindMapClickEvent
|
|
223
|
+
`bindMapClickEvent`用于为地图实例绑定事件,函数声明如下:
|
|
224
|
+
|
|
225
|
+
```javascript
|
|
226
|
+
bindMapClickEvent(
|
|
227
|
+
type: AMap.EventType, // 地图事件类型
|
|
228
|
+
fn: (e: any) => void, // 回调函数
|
|
229
|
+
context?: any, // 事件上下文,缺省为当前实例
|
|
230
|
+
once?: boolean // 事件是否执行一次
|
|
231
|
+
): void
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
使用示例:
|
|
235
|
+
|
|
236
|
+
```javascript
|
|
237
|
+
// 绑定地图点击事件
|
|
238
|
+
mapUtils.bindMapClickEvent('click', (e) => {
|
|
239
|
+
console.log('点击位置:', e.lnglat);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// 绑定一次性的地图移动事件
|
|
243
|
+
mapUtils.bindMapClickEvent('moveend', () => {
|
|
244
|
+
console.log('地图移动结束');
|
|
245
|
+
}, null, true);
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## baseMarkerLayer图层
|
|
249
|
+
|
|
250
|
+
`baseMarkerLayer`支持创建两种类型的图层`type MarkerLayerBaseType = 'markerLayer' | 'labelMarkerLayer';`,他们分别用于管理`Marker/LabelMarker`覆盖物。
|
|
251
|
+
|
|
252
|
+
创建图层
|
|
253
|
+
```javascript
|
|
254
|
+
interface LayerOpts<
|
|
255
|
+
U = {},
|
|
256
|
+
T extends MarkerLayerBaseType = 'markerLayer',
|
|
257
|
+
V = BaseMarkerLayerInfo[T],
|
|
258
|
+
> {
|
|
259
|
+
layerType: T;
|
|
260
|
+
layerName: string;
|
|
261
|
+
overlayList: Array<OverlayData<U>>;
|
|
262
|
+
getIconUrl: (item: OverlayData<U>) => string; //overlayList中优先级更高
|
|
263
|
+
getOverlayOpts: (
|
|
264
|
+
item: OverlayData<U>,
|
|
265
|
+
index: number,
|
|
266
|
+
MapUtils: MapUtilsConstructor
|
|
267
|
+
) => V['overlayOpts']; //动态生成覆盖物配置
|
|
268
|
+
overlayLayer?: AMap.LabelsLayerOptions; //当你使用labelMarker时传递
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const markerLayer = mapUtils.createBaseMarkerLayer({
|
|
272
|
+
layerType: 'markerLayer',
|
|
273
|
+
layerName: 'markerLayer',
|
|
274
|
+
getIconUrl(item) {
|
|
275
|
+
return 'https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png';
|
|
276
|
+
},
|
|
277
|
+
getOverlayOpts(item, index, MapUtils) {
|
|
278
|
+
return {
|
|
279
|
+
anchor: 'bottom-center',
|
|
280
|
+
clickable: true,
|
|
281
|
+
zooms: [2, 20],
|
|
282
|
+
zIndex: 1000,
|
|
283
|
+
label: {
|
|
284
|
+
content: `<div class="labelTitle">${item.overlayData.title}</div>`,
|
|
285
|
+
offset: MapUtils.Pixel(0, -5),
|
|
286
|
+
direction: 'top',
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
},
|
|
290
|
+
overlayList: data.slice(0, 10).map(item => {
|
|
291
|
+
return {
|
|
292
|
+
overlayData: {
|
|
293
|
+
lon: item.jd,
|
|
294
|
+
lat: item.wd,
|
|
295
|
+
title: item.sydmc,
|
|
296
|
+
id: item.id,
|
|
297
|
+
extData: item,
|
|
298
|
+
},
|
|
299
|
+
id: item.id, //覆盖物id 唯一
|
|
300
|
+
labelShowed: true, //label是否显示
|
|
301
|
+
overlaySelected: false; // 当前marker是否被选中
|
|
302
|
+
};
|
|
303
|
+
}),
|
|
304
|
+
});
|
|
305
|
+
```
|
|
306
|
+
注意:overlayLayer类型为[`AMap.LabelsLayerOptions`](https://lbs.amap.com/api/javascript-api-v2/documentation#labelslayer)在layerType为`labelMarkerLayer`时必传,LayerOpts 属性具体介绍参考[下方属性表格](###属性)。`overlayList`基本格式如上,它的格式必须符合**规范**否则产生error。
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
### 属性
|
|
310
|
+
|
|
311
|
+
| 属性名 | 类型 | 默认值 | 描述 |
|
|
312
|
+
|--------|------|--------|------|
|
|
313
|
+
| layerType | `markerLayer`|`undefined` | 图层类型分别管理两类覆盖物类型`marker, labelMarker` |
|
|
314
|
+
| layerName | `string` | `undefined` | 图层的唯一标识名称,创建时传入,用于区分不同图层(不可重复)|
|
|
315
|
+
| layerVisible | `boolean` | `true` | 图层的显示状态,`true` 为显示在地图上,`false` 为隐藏|
|
|
316
|
+
| mapUtils | `MapUtils` | `mapUtils` | 关联的`MapUtils` 实例,用于操作地图和图层管理 |
|
|
317
|
+
| getIconUrl | `(item: OverlayData) => string` | `undefined` | 获取图标 URL 的回调函数,根据覆盖物数据返回对应的图标地址 (根据状态计算图标) |
|
|
318
|
+
| rawLayerIns | `MarkerLayer` | `LabelMarkerLayer` | 原始高德图层实例的包装对象。`markerLayer` 类型时为 `MarkerLayer`(内部使用`AMap.OverlayGroup`),`labelMarkerLayer` 类型时为 `LabelMarkerLayer`(内部使用`AMap.LabelsLayer`)|
|
|
319
|
+
| overlayList | `Array<OverlayData<U>>`([类型定义](https://github.com/quyue216/gdmap-utils/blob/master/src/types/BaseMarkerLayer.d.ts)) | `[]` | 覆盖物数据数组,包含点位信息(位置、标题、扩展数据等)和状态信息(标题显隐、图标激活状态),格式须符合规范 |
|
|
320
|
+
| getOverLayOpts| `getOverlayOpts: (item: OverlayData<U>,index: number,MapUtils: MapUtilsConstructor) => ['overlayOpts']`| `undefined` |函数返回原始高德覆盖物配置对象,`layerType`为 `MarkerLayer`(['overlayOpts']为[`AMap.MarkerOptions`](https://lbs.amap.com/api/javascript-api-v2/documentation#marker)), `layerType`为`labelMarkerLayer`(['overlayOpts']为)[`AMap.labelMarkerLayer`](https://lbs.amap.com/api/javascript-api-v2/documentation#labelmarker)|
|
|
321
|
+
|
|
322
|
+
### 方法
|
|
323
|
+
|
|
324
|
+
| 方法名 | 说明 | 参数 |
|
|
325
|
+
|--------|------|-----|
|
|
326
|
+
| `add(overlayList: Array<OverlayData<U>>)` | 向图层中添加新的覆盖物数据,会自动创建对应的覆盖物实例 |`Array<OverlayData<U>>`[类型详细说明文档](https://github.com/quyue216/gdmap-utils/blob/master/src/types/BaseMarkerLayer.d.ts)|
|
|
327
|
+
| <code>remove(ovs: Array<AMap.Marker \| AMap.LabelMarker> \| string[])</code> | 从图层中移除指定的覆盖物,支持传入覆盖物实例数组或 ID 数组 | `ovs` 为字符串数组时表示覆盖物 ID 集合;为对象数组时元素类型为图层管理的覆盖物实例 |
|
|
328
|
+
| `hide` | 隐藏当前图层及其所有覆盖物 |无|
|
|
329
|
+
| `show` | 显示当前图层及其所有覆盖物 |无|
|
|
330
|
+
| `getAllOverlay` | 获取图层中所有的覆盖物实例数组(返回浅拷贝)<code>Array<AMap.Marker \| AMap.LabelMarker></code> | 无 |
|
|
331
|
+
| `clearAllOverlay` | 清空图层中的所有覆盖物,同时清空 `overlayList` 数据 |无|
|
|
332
|
+
| `reload` | 重新加载图层,先清空所有覆盖物,然后根据 `overlayList` 重新创建 |无|
|
|
333
|
+
| `overlayFitMap` | 根据图层中的所有覆盖物,自动调整地图视野以适应所有覆盖物 |无|
|
|
334
|
+
| `findLayerOverlay` | `id`根据覆盖物 ID 查找对应覆盖物实例 |图层创建传递的overList属性存储覆盖物列表信息,overListItem中指定覆盖物id|
|
|
335
|
+
| `bindEventOverlays(clickType: AMap.EventType, callback: () => void)` | 为图层中的所有覆盖物绑定指定类型的事件 |clickType为事件类型 (仅支持绑定覆盖物支持的事件),callback事件对应回调|
|
|
336
|
+
| `refreshOverlayIcon` | 根据 `getIconUrl` 重新计算并刷新指定覆盖物的图标 |传递指定覆盖物ID刷新Icon|
|
|
337
|
+
| `refreshOverlayLabel` | 根据 `getOverlayOpts` 重新计算并刷新指定覆盖物的标签/文本 |传递指定覆盖物ID刷新Label|
|
|
338
|
+
| `getRawLayer` | 获取高德地图的原始图层实例(`AMap.OverlayGroup` 或 `AMap.LabelsLayer`) |无|
|
|
339
|
+
| `destroy` | 销毁图层,从 `MapUtils` 中移除并清空所有覆盖物 |无|
|
|
340
|
+
|
|
341
|
+
## clusterMarkerLayer图层
|
|
342
|
+
`clusterMarkerLayer` 图层适用于海量点数据场景,它对高德原生的 `new AMap.MarkerCluster` 进行包装(如需扩展,可自行接入 `AMap.MassMarks` 等同类组件,`MarkerCluster` 与 `MassMarks` 调用方式相似,均适合大数据量渲染,故将其抽象整合。但`MassMarks`在我司业务中并未使用,所以并未整合在一起)
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
[`clusterMarkerLayer`类型文档参考](https://github.com/quyue216/gdmap-utils/blob/master/src/types/clusterMarkerLayer.d.ts),图层创建示例:
|
|
346
|
+
```javascript
|
|
347
|
+
|
|
348
|
+
interface ClusterMarkerLayerOpts<
|
|
349
|
+
U = {},
|
|
350
|
+
T extends MarkerClusterLayerType = 'markerClusterLayer',
|
|
351
|
+
V = ClusterMarkerLayerInfo[T],
|
|
352
|
+
> {
|
|
353
|
+
layerType: T;
|
|
354
|
+
layerName: string;
|
|
355
|
+
overlayList: Array<OverlayData<U>>;
|
|
356
|
+
layerOpts: V['layerOpts']; //类型动态计算,图层类型layerType决定layerOpts参数传递方式
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const defaultIcon = gdMapUtils.createIcon({
|
|
360
|
+
size: config.size,
|
|
361
|
+
image: config.icon,
|
|
362
|
+
imageSize: config.size,
|
|
363
|
+
imageOffset: config.pixel,
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
// 激活图标
|
|
367
|
+
const activeIcon = gdMapUtils.createIcon({
|
|
368
|
+
size: config.size,
|
|
369
|
+
image: config.iconActive,
|
|
370
|
+
imageSize: config.size,
|
|
371
|
+
imageOffset: config.pixel,
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
//图层创建
|
|
375
|
+
window.clusterMarkerLayer = mapUtils.createClusterMarkerLayer({
|
|
376
|
+
layerType: 'markerClusterLayer',
|
|
377
|
+
layerName: 'sydwCollecte',
|
|
378
|
+
overlayList: data.slice(0, 10).map(item => {
|
|
379
|
+
return {
|
|
380
|
+
overlayData: {
|
|
381
|
+
lon: item.jd,
|
|
382
|
+
lat: item.wd,
|
|
383
|
+
title: item.sydmc,
|
|
384
|
+
id: item.id,
|
|
385
|
+
extData: item,
|
|
386
|
+
},
|
|
387
|
+
id: item.id,
|
|
388
|
+
labelShowed: false,
|
|
389
|
+
iconActive: false,
|
|
390
|
+
};
|
|
391
|
+
}),
|
|
392
|
+
layerOpts: {
|
|
393
|
+
gridSize: 80,
|
|
394
|
+
renderClusterMarker(context) {
|
|
395
|
+
// 绘制聚合点时调用
|
|
396
|
+
const count = data.length;
|
|
397
|
+
const factor = Math.pow(context.count / count, 1 / 18);
|
|
398
|
+
const div = document.createElement('div');
|
|
399
|
+
const Hue = 180 - factor * 180;
|
|
400
|
+
const bgColor = 'hsla(' + Hue + ',100%,50%,0.7)';
|
|
401
|
+
const fontColor = 'hsla(' + Hue + ',100%,20%,1)';
|
|
402
|
+
const borderColor = 'hsla(' + Hue + ',100%,40%,1)';
|
|
403
|
+
const shadowColor = 'hsla(' + Hue + ',100%,50%,1)';
|
|
404
|
+
div.style.backgroundColor = bgColor;
|
|
405
|
+
const size = Math.round(
|
|
406
|
+
30 + Math.pow(context.count / count, 1 / 5) * 20
|
|
407
|
+
);
|
|
408
|
+
div.style.width = div.style.height = size + 'px';
|
|
409
|
+
div.style.border = 'solid 1px ' + borderColor;
|
|
410
|
+
div.style.borderRadius = size / 2 + 'px';
|
|
411
|
+
div.style.boxShadow = '0 0 1px ' + shadowColor;
|
|
412
|
+
div.innerHTML = context.count;
|
|
413
|
+
div.style.lineHeight = size + 'px';
|
|
414
|
+
div.style.color = fontColor;
|
|
415
|
+
div.style.fontSize = '14px';
|
|
416
|
+
div.style.textAlign = 'center';
|
|
417
|
+
const Pixel = gdMapUtils.Size(-size / 2, -size / 2);
|
|
418
|
+
context.marker.setOffset(Pixel);
|
|
419
|
+
context.marker.setContent(div);
|
|
420
|
+
}, // 自定义聚合点样式
|
|
421
|
+
renderMarker: context => {
|
|
422
|
+
const {
|
|
423
|
+
overlayData: { extData },
|
|
424
|
+
iconActive,
|
|
425
|
+
labelShowed,
|
|
426
|
+
} = context.data[0];
|
|
427
|
+
|
|
428
|
+
const curIcon = iconActive ? activeIcon : defaultIcon;
|
|
429
|
+
|
|
430
|
+
context.marker.setOffset(gdMapUtils.Pixel(...config.pixel));
|
|
431
|
+
context.marker.setExtData(extData);
|
|
432
|
+
context.marker.setIcon(curIcon);
|
|
433
|
+
context.marker.setLabel({
|
|
434
|
+
offset: gdMapUtils.Pixel(0, 0),
|
|
435
|
+
content: `<div class="${!labelShowed ? 'display-none' : ''} sydw-label">${extData.sydmc}</div>`,
|
|
436
|
+
direction: 'top',
|
|
437
|
+
});
|
|
438
|
+
},****
|
|
439
|
+
},
|
|
440
|
+
});
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### 属性
|
|
444
|
+
|
|
445
|
+
| 属性名 | 类型 | 默认值 | 描述 |
|
|
446
|
+
|--------|------|--------|------|
|
|
447
|
+
| layerType | `MarkerClusterLayerType`|`undefined` | 图层类型只管理一类覆盖物`new AMap.MarkerCluster` |
|
|
448
|
+
| layerName | `string` | `undefined` | 图层的唯一标识名称,创建时传入,用于区分不同图层(不可重复)|
|
|
449
|
+
| layerVisible | `boolean` | `true` | 图层的显示状态,`true` 为显示在地图上,`false` 为隐藏|
|
|
450
|
+
| mapUtils | `MapUtils` | `mapUtils` | 关联的`MapUtils` 实例,用于操作地图和图层管理 |
|
|
451
|
+
| getIconUrl | `(item: OverlayData) => string` | `undefined` | 获取图标 URL 的回调函数,根据覆盖物数据返回对应的图标地址 (根据状态计算图标) |
|
|
452
|
+
| rawLayerIns | `MarkerLayer` | `LabelMarkerLayer` | 原始高德图层实例的包装对象。`markerLayer` 类型时为 `markerClusterLayer`(内部使用`new AMap.MarkerCluster`)|
|
|
453
|
+
| overlayList | `Array<OverlayData<U>>`([类型定义](https://github.com/quyue216/gdmap-utils/blob/master/src/types/BaseMarkerLayer.d.ts)) | `[]` | 覆盖物数据数组,包含点位信息(位置、标题、扩展数据等)和状态信息(标题显隐、图标激活状态),格式须符合规范 |
|
|
454
|
+
| layerOpts| `AMap.MarkerClusterOptions`| `undefined` | 聚合图层配置选项,由`layerType`决定对应的配置类型。当`layerType`为`'markerClusterLayer'`时,对应高德`AMap.MarkerCluster`的构造参数配置 |
|
|
455
|
+
|
|
456
|
+
### 方法
|
|
457
|
+
|
|
458
|
+
| 方法名 | 说明 | 参数 |
|
|
459
|
+
|--------|------|-----|
|
|
460
|
+
| `add(overlayList: Array<OverlayData<U>>)` | 向图层中添加新的覆盖物数据,会自动转换为聚合数据格式并添加到地图 | [`overlayList`类型说明](https://github.com/quyue216/gdmap-utils/blob/master/src/types/clusterMarkerLayer.d.ts): 覆盖物数据数组,包含位置、标题、权重等信息 |
|
|
461
|
+
| `remove(ovs: Array<number \| string>)` | 根据覆盖物ID从图层中移除指定的覆盖物,会更新内部数据列表并重新渲染聚合图层 | `ovs`: 覆盖物ID数组,字符串或数字类型,表示需要移除的覆盖物id集合 |
|
|
462
|
+
| `hide()` | 隐藏当前聚合图层及其所有聚合标记 | 无 |
|
|
463
|
+
| `show()` | 显示当前聚合图层,会将当前`overlayList`数据转换为聚合格式后重新渲染 | 无 |
|
|
464
|
+
| `clearAllOverlay()` | 清空图层中的所有覆盖物,同时清空内部的`overlayList`数据 | 无 |
|
|
465
|
+
| `bindEventOverlays(clickType: AMap.EventType, callback: () => void)` | 为图层中的聚合标记绑定指定类型的事件 | `clickType`: 事件类型(如`'click'`等,参考高德地图事件文档)<br>`callback`: 事件触发时的回调函数 |
|
|
466
|
+
| `getRawLayer()` | 获取高德地图的原始聚合图层实例(`AMap.MarkerCluster`) | 无 |
|
|
467
|
+
| `destroy()` | 销毁图层,从`MapUtils`中移除图层管理,销毁地图实例,并清空`overlayList`数据 | 无 |
|